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.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/Babel/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/Cython/default.nix75
-rw-r--r--nixpkgs/pkgs/development/python-modules/Fabric/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/Flask-PyMongo/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/FormEncode/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/GeoIP/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/GitPython/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/GitPython/hardcode-git-path.patch13
-rw-r--r--nixpkgs/pkgs/development/python-modules/HAP-python/default.nix47
-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.nix37
-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.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/Markups/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/MechanicalSoup/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/Nikola/default.nix76
-rw-r--r--nixpkgs/pkgs/development/python-modules/Pmw/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/PyLD/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/PyRMVtransport/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/Pygments/2_5.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/Pygments/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/ROPGadget/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/Rtree/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/Theano/default.nix94
-rw-r--r--nixpkgs/pkgs/development/python-modules/TurboCheetah/default.nix26
-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/WazeRouteCalculator/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/XlsxWriter/default.nix24
-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/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.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/accuweather/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/acebinf/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/acme-tiny/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/acme/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/acoustics/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/actdiag/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/adafruit-platformdetect/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/adafruit-pureio/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/adal/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/adb-homeassistant/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/adb-shell/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/adblock/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/addic7ed-cli/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/adext/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/adguardhome/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/advantage-air/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/aenum/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/afdko/default.nix74
-rw-r--r--nixpkgs/pkgs/development/python-modules/affine/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/affinity/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/agate-dbf/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/agate-excel/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/agate-sql/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/agate/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/agent-py/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioamqp/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiobotocore/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioconsole/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiocontextvars/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiodns/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioeafm/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioesphomeapi/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioeventlet/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioextensions/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiofiles/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioflo/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioftp/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioguardian/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioh2/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioharmony/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiohomekit/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiohttp-cors/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiohttp-jinja2/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiohttp-remotes/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiohttp-socks/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiohttp-swagger/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiohttp/default.nix94
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiohttp_remotes/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiohue/default.nix19
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioimaplib/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioitertools/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiojobs/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiokafka/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiokef/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiolifx-effects/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiolifx/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiomultiprocess/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiomysql/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/aionotify/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioprocessing/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiopulse/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioredis/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioresponses/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiorpcx/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiorun/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioshelly/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiosmtpd/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiosqlite/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiostream/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioswitcher/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiounifi/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiounittest/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiowinreg/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiozeroconf/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/airly/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/ajpy/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/alabaster/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/alarmdecoder/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/alembic/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/alerta-server/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/alerta/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/algebraic-data-types/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/allpairspy/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/alot/default.nix70
-rw-r--r--nixpkgs/pkgs/development/python-modules/altair/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/amazon_kclpy/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/ambiclimate/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/amcrest/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/amply/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/amqp/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/amqplib/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/androguard/default.nix93
-rw-r--r--nixpkgs/pkgs/development/python-modules/androidtv/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/aniso8601/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/annexremote/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/annoy/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/anonip/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/ansi/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/ansi2html/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/ansible-kernel/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/ansible-lint/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/ansible-runner/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/ansible/default.nix57
-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/ansiwrap/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/antlr4-python2-runtime/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/antlr4-python3-runtime/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/anyio/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/anyjson/default.nix22
-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/apache-airflow/default.nix196
-rw-r--r--nixpkgs/pkgs/development/python-modules/apipkg/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/apispec/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/aplpy/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/appdirs/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/application/default.nix26
-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.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/approvaltests/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/apptools/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/apsw/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/arabic-reshaper/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/archinfo/default.nix32
-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.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/argcomplete/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/argh/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/argon2_cffi/default.nix34
-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.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/arrayqueues/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/arrow/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/arviz/default.nix92
-rw-r--r--nixpkgs/pkgs/development/python-modules/arxiv2bib/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/asana/default.nix37
-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/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/ase/3.17.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/ase/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/asgi-csrf/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/asgiref/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/asn1ate/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/asn1crypto/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/aspy.yaml/default.nix22
-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/1.6.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/astroid/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/astropy-extension-helpers/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/astropy-extension-helpers/permissions.patch20
-rw-r--r--nixpkgs/pkgs/development/python-modules/astropy-healpix/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/astropy-helpers/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/astropy/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/astroquery/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/asttokens/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/astunparse/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/async-upnp-client/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/async_generator/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/async_stagger/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/async_timeout/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/asyncio-dgram/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/asyncio-throttle/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/asyncpg/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/asyncssh/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/asyncssh/fix-sftp-chmod-test-nixos.patch15
-rw-r--r--nixpkgs/pkgs/development/python-modules/asynctest/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/asyncwhois/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/asysocks/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/atenpdu/default.nix28
-rwxr-xr-xnixpkgs/pkgs/development/python-modules/atlassian-python-api/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/atom/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/atomiclong/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/atomicwrites/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/atomman/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/atpublic/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/atsim_potentials/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/attrdict/default.nix19
-rw-r--r--nixpkgs/pkgs/development/python-modules/attrs/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/aubio/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/audio-metadata/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/audioread/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/audiotools/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/augeas/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/auth0-python/default.nix43
-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.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/autograd/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/autologging/default.nix19
-rw-r--r--nixpkgs/pkgs/development/python-modules/automat/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/autopep8/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/av/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/avea/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/avro-python3/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/avro/default.nix30
-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.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/awkward/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/awkward0/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/aws-adfs/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/aws-lambda-builders/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/aws-sam-translator/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/aws-xray-sdk/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/awsiotpythonsdk/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/axis/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-appconfiguration/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-applicationinsights/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-batch/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-common/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-core/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-cosmos/default.nix31
-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-datalake-store/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-eventgrid/default.nix35
-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.nix54
-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.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-keyvault-keys/default.nix49
-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.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-keyvault/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-loganalytics/default.nix36
-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.nix41
-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.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-cdn/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-cognitiveservices/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-commerce/default.nix48
-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.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-consumption/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-containerinstance/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-containerregistry/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-containerservice/default.nix40
-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.nix32
-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.nix38
-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.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-datamigration/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-deploymentmanager/default.nix31
-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.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-dns/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-eventgrid/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-eventhub/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-hanaonazure/default.nix38
-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.nix31
-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.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-kusto/azure-mgmt-apimanagement/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-kusto/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-loganalytics/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-logic/default.nix39
-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.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-managementgroups/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-managementpartner/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-maps/default.nix40
-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.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-monitor/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-msi/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-netapp/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-network/default.nix43
-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.nix29
-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.nix31
-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.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-redhatopenshift/default.nix41
-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.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-reservations/default.nix38
-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-signalr/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-sql/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-sqlvirtualmachine/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-storage/default.nix39
-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.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-trafficmanager/default.nix38
-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.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-nspkg/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-servicebus/default.nix43
-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.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-synapse-artifacts/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-synapse-spark/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/b2sdk/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/babelfish/default.nix19
-rw-r--r--nixpkgs/pkgs/development/python-modules/babelgladeextractor/default.nix34
-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-datetime-fromisoformat/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/backports-shutil-which/default.nix24
-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.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/backports_lzma/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/backports_os/default.nix35
-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.nix17
-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.nix31
-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.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/baselines/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/basemap/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/bash_kernel/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/bashlex/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/basiciw/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/batchgenerators/default.nix51
-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.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/bayespy/default.nix31
-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/3_1.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/bcrypt/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/beaker/default.nix76
-rw-r--r--nixpkgs/pkgs/development/python-modules/beancount/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/beancount_docverif/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/beanstalkc/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/beautifulsoup4/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/bedup/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/behave/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/bellows/default.nix38
-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.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/bidict/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/bids-validator/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/billiard/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/binaryornot/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/binho-host-adapter/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/binwalk/default.nix57
-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.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/bitarray/default.nix19
-rw-r--r--nixpkgs/pkgs/development/python-modules/bitbox02/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/bitbucket-api/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/bitbucket-cli/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/bitcoin-price-api/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/bitcoinlib/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/bitmath/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/bitstring/default.nix19
-rw-r--r--nixpkgs/pkgs/development/python-modules/bitstruct/default.nix18
-rw-r--r--nixpkgs/pkgs/development/python-modules/bjoern/default.nix25
-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.nix72
-rw-r--r--nixpkgs/pkgs/development/python-modules/bleach/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/bleak/default.nix34
-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.nix18
-rw-r--r--nixpkgs/pkgs/development/python-modules/blinkstick/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/blis/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/blist/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/blivet/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/block-io/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/blockchain/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/blockdiag/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/bluepy/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/bme680/default.nix38
-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.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/boltztrap2/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/boolean-py/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/booleanoperations/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/bootstrapped-pip/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/boto/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/boto3/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/botocore/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/bottle/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/bottleneck/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/box2d/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/bpython/clipboard-make-which-substitutable.patch27
-rw-r--r--nixpkgs/pkgs/development/python-modules/bpython/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/braintree/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/branca/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/bravado-core/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/bravia-tv/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/breathe/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/breezy/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/broadlink/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/brother/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/brotli/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/brotlipy/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/browser-cookie3/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/browsermob-proxy/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/bsblan/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/bsddb3/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/bsdiff4/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/bt-proximity/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/btchip/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/btrees/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/btrfs/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/bugsnag/default.nix30
-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/build/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/buildbot/default.nix104
-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
-rw-r--r--nixpkgs/pkgs/development/python-modules/buildbot/worker.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/buildout-nix/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/buildout-nix/nix.patch28
-rw-r--r--nixpkgs/pkgs/development/python-modules/buildout/default.nix18
-rw-r--r--nixpkgs/pkgs/development/python-modules/bumps/default.nix24
-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.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/bz2file/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/cachecontrol/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/cached-property/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/cachelib/default.nix18
-rw-r--r--nixpkgs/pkgs/development/python-modules/cachetools/default.nix17
-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/0_9.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/cairocffi/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/cairocffi/dlopen-paths-0.9.patch47
-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/cairocffi/generic.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/cairosvg/1_x.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/cairosvg/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/caldav/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/can/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/canmatrix/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/canonicaljson/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/canopen/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/capstone/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/capturer/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/carbon/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/carrot/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/cartopy/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/casbin/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/case/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/cassandra-driver/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/casttube/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/catalogue/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/catboost/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/catboost/nix-support.patch181
-rw-r--r--nixpkgs/pkgs/development/python-modules/cattrs/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/cbor/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/cbor2/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/cccolutils/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/cchardet/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/cddb/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/cdecimal/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/celery/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/cement/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/censys/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/cerberus/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/cert-chain-resolver/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/certbot-dns-cloudflare/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/certbot-dns-rfc2136/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/certbot-dns-route53/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/certbot/default.nix75
-rw-r--r--nixpkgs/pkgs/development/python-modules/certifi/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/certipy/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/cffi/default.nix46
-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.nix94
-rw-r--r--nixpkgs/pkgs/development/python-modules/cftime/default.nix42
-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/chai/default.nix15
-rw-r--r--nixpkgs/pkgs/development/python-modules/chainer/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/chainmap/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/chalice/default.nix69
-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.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/characteristic/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/chardet/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/chart-studio/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/check-manifest/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/cheetah/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/cheetah3/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/cheroot/default.nix83
-rw-r--r--nixpkgs/pkgs/development/python-modules/cherrypy/17.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/cherrypy/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/chevron/default.nix29
-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/cirq/default.nix122
-rw-r--r--nixpkgs/pkgs/development/python-modules/ciscomobilityexpress/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/ciso8601/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/citeproc-py/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/cjson/default.nix18
-rw-r--r--nixpkgs/pkgs/development/python-modules/ckcc-protocol/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/class-registry/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/cld2-cffi/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/cleo/default.nix28
-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/cliapp/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/click-completion/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/click-datetime/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/click-default-group/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/click-didyoumean/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/click-help-colors/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/click-log/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/click-plugins/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/click-repl/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/click-threading/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/click/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/clickclick/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/clickhouse-cityhash/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/clickhouse-driver/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/cliff/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/clifford/default.nix72
-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.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/clintermission/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/clize/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/clldutils/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/closure-linter/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/cloudflare/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/cloudpickle/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/cloudscraper/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/clustershell/default.nix89
-rw-r--r--nixpkgs/pkgs/development/python-modules/cma/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/cmarkgfm/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/cmd2/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/cmdline/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/cmdtest/default.nix32
-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/coapthon3/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/coconut/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/cocotb/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/codecov/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/codespell/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/cogapp/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/coilmq/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/coinmarketcap/default.nix19
-rw-r--r--nixpkgs/pkgs/development/python-modules/colander/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/colanderalchemy/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/colorama/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/colorcet/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/colorclass/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/colored/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/coloredlogs/default.nix44
-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.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/colorspacious/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/colour/default.nix19
-rw-r--r--nixpkgs/pkgs/development/python-modules/commandparse/default.nix25
-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/conda/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/configargparse/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/configobj/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/configparser/4.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/configparser/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/configshell/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/confluent-kafka/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/confuse/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/connect_box/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/connexion/default.nix94
-rw-r--r--nixpkgs/pkgs/development/python-modules/consonance/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/constantly/default.nix18
-rw-r--r--nixpkgs/pkgs/development/python-modules/construct/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/consul/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/contexter/default.nix14
-rw-r--r--nixpkgs/pkgs/development/python-modules/contextlib2/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/contextvars/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/convertdate/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/cookiecutter/default.nix35
-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/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/cot/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/cov-core/default.nix17
-rw-r--r--nixpkgs/pkgs/development/python-modules/coverage/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/coveralls/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/cozy/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/cppheaderparser/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/cppy/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/cpyparsing/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/cram/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/crashtest/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/crate/default.nix37
-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/croniter/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/cryptacular/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/cryptography/3.3.nix83
-rw-r--r--nixpkgs/pkgs/development/python-modules/cryptography/cryptography-py27-warning.patch14
-rw-r--r--nixpkgs/pkgs/development/python-modules/cryptography/default.nix81
-rw-r--r--nixpkgs/pkgs/development/python-modules/cryptography/vectors-3.3.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/cryptography/vectors.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/crytic-compile/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/css-parser/default.nix22
-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.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/cssutils/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/csvs-to-sqlite/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/csvw/default.nix51
-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.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/curio/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/curtsies/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/curve25519-donna/default.nix18
-rw-r--r--nixpkgs/pkgs/development/python-modules/cvxopt/default.nix73
-rw-r--r--nixpkgs/pkgs/development/python-modules/cvxpy/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/cx_freeze/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/cx_oracle/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/cycler/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/cymem/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/cypari2/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/cysignals/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/cytoolz/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/d2to1/default.nix25
-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/daphne/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/darcsver/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/dash-core-components/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/dash-html-components/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/dash-renderer/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/dash-table/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/dash/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/dask-gateway-server/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/dask-gateway/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/dask-glm/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/dask-image/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/dask-jobqueue/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/dask-ml/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/dask-mpi/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/dask-xgboost/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/dask/default.nix72
-rw-r--r--nixpkgs/pkgs/development/python-modules/databases/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/databricks-cli/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/databricks-connect/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/dataclasses-json/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/dataclasses/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/datadiff/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/datadog/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/datamodeldict/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/datasets/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/datasette/default.nix106
-rw-r--r--nixpkgs/pkgs/development/python-modules/datashader/default.nix95
-rw-r--r--nixpkgs/pkgs/development/python-modules/datashape/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/datatable/default.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/dateparser/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/dateutil/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/datrie/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/dbf/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/dbfread/default.nix18
-rw-r--r--nixpkgs/pkgs/development/python-modules/dbus-next/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/dbus/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/dbus/fix-includedir.patch8
-rw-r--r--nixpkgs/pkgs/development/python-modules/dbutils/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/dcmstack/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/ddt/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/deap/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/debian/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/debts/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/debugpy/default.nix97
-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.patch51
-rw-r--r--nixpkgs/pkgs/development/python-modules/decorator/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/deep_merge/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/deepdiff/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/deepmerge/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/deeptoolsintervals/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/defcon/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/deform/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/defusedxml/default.nix11
-rw-r--r--nixpkgs/pkgs/development/python-modules/delegator-py/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/deluge-client/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/demjson/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/dendropy/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/denonavr/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/dependency-injector/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/deprecated/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/deprecation/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/derpconf/default.nix19
-rw-r--r--nixpkgs/pkgs/development/python-modules/descartes/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/deskcon/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/devolo-home-control-api/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/devpi-common/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/dftfit/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/diceware/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/dicom2nifti/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/dict2xml/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/dictionaries/default.nix19
-rw-r--r--nixpkgs/pkgs/development/python-modules/dicttoxml/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/diff-match-patch/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/diff_cover/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/digi-xbee/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/digitalocean/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/dill/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/diofant/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/dipy/default.nix70
-rw-r--r--nixpkgs/pkgs/development/python-modules/discid/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/discogs_client/default.nix19
-rw-r--r--nixpkgs/pkgs/development/python-modules/discordpy/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/diskcache/default.nix41
-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.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/distributed/default.nix64
-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.nix21
-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-search-url/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-allauth/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-anymail/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-auth-ldap/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-cache-url/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-cleanup/default.nix21
-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-configurations/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-cors-headers/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-csp/default.nix23
-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.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-filter/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-gravatar2/default.nix19
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-haystack/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-hijack-admin/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-hijack/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-ipware/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-jinja2/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-logentry-admin/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-mailman3/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-maintenance-mode/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-multiselectfield/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-oauth-toolkit/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-paintstore/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-pglocks/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-picklefield/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-pipeline/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-polymorphic/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-postgresql-netfields/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-q/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-ranged-response/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-raster/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-rest-auth/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-sampledatahelper/default.nix30
-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.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-sr/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-storages/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-versatileimagefield/default.nix32
-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.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/django/1.10-gis-libs.template.patch24
-rw-r--r--nixpkgs/pkgs/development/python-modules/django/2.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/django/3.nix48
-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_appconf/default.nix35
-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_compressor/default.nix27
-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_evolution/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/django_guardian/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/django_modelcluster/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/django_nose/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/django_redis/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/django_reversion/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/django_silk/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/django_tagging/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/django_taggit/default.nix38
-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-jwt/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/djangorestframework-simplejwt/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/djangorestframework/default.nix26
-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.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/dlx/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/dm-sonnet/default.nix92
-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/1.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/dnspython/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/doc8/default.nix39
-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.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/dockerfile-parse/default.nix26
-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.nix30
-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/doctest-ignore-unicode/default.nix19
-rw-r--r--nixpkgs/pkgs/development/python-modules/docutils/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/dodgy/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/dogpile.cache/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/dogpile.core/default.nix19
-rw-r--r--nixpkgs/pkgs/development/python-modules/dogtail/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/dogtail/nix-support.patch35
-rw-r--r--nixpkgs/pkgs/development/python-modules/doit/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/dominate/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/dopy/default.nix26
-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/dotty-dict/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/dparse/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/dpath/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/dpkt/default.nix19
-rw-r--r--nixpkgs/pkgs/development/python-modules/drf-yasg/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/drms/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/dropbox/default.nix24
-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/dtopt/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/duckdb/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/duecredit/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/dufte/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/dugong/default.nix14
-rw-r--r--nixpkgs/pkgs/development/python-modules/dulwich/0_19.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/dulwich/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/dyn/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/dynd/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/easy-thumbnails/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/easydict/default.nix19
-rw-r--r--nixpkgs/pkgs/development/python-modules/easygui/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/easyprocess/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/easysnmp/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/easywatch/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/ecdsa/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/ecos/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/ecpy/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/ed25519/default.nix18
-rw-r--r--nixpkgs/pkgs/development/python-modules/editorconfig/default.nix34
-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/elasticsearch-dsl/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/elasticsearch/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/elementpath/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/eliot/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/email-validator/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/emailthreads/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/emcee/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/emoji/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/emv/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/enaml/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/enamlx/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/enamlx/replace-unicode-with-str.patch274
-rw-r--r--nixpkgs/pkgs/development/python-modules/entrance/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/entrypoint2/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/entrypoints/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/enum-compat/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/enum/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/enum34/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/envisage/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/envs/default.nix22
-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.nix26
-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/et_xmlfile/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/etcd/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/etebase/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/etelemetry/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/etesync/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/eth-hash/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/eth-typing/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/eth-utils/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/evdev/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/eve/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/eventlet/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/eventlib/default.nix30
-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/ewmh/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/exchangelib/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/exchangelib/skip_failing_test.patch18
-rw-r--r--nixpkgs/pkgs/development/python-modules/execnet/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/executing/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/executor/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/exifread/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/extras/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/eyed3/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/ezdxf/default.nix28
-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.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/fake-useragent/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/fake_factory/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/faker/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/falcon/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/fastapi/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/fastcache/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/fastdiff/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/fastdtw/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/fastecdsa/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/fasteners/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/fastentrypoints/default.nix18
-rw-r--r--nixpkgs/pkgs/development/python-modules/fastimport/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/fastjsonschema/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/fastpair/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/fastparquet/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/fastpbkdf2/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/fastprogress/default.nix32
-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/default.nix27
-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/fdint/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/feedgen/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/feedgenerator/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/feedparser/5.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/feedparser/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/ffmpeg-python/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/ffmpeg-python/ffmpeg-location.patch84
-rw-r--r--nixpkgs/pkgs/development/python-modules/fido2/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/filebrowser_safe/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/filebytes/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/filelock/default.nix18
-rw-r--r--nixpkgs/pkgs/development/python-modules/filemagic/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/filetype/default.nix26
-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/fints/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/fiona/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/fipy/default.nix58
-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.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/fixerio/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/fixtures/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/flake8-blind-except/default.nix16
-rw-r--r--nixpkgs/pkgs/development/python-modules/flake8-debugger/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/flake8-future-import/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/flake8-future-import/fix-annotations-version.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-polyfill/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/flake8/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/flaky/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/flametree/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/flammkuchen/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-admin/default.nix80
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-api/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-appbuilder/default.nix83
-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.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-bootstrap/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-caching/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-common/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-compress/default.nix21
-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-httpauth/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-jwt-extended/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-ldap-login/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-limiter/default.nix19
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-login/default.nix27
-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.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-mongoengine/default.nix47
-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-principal/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-restful/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-restplus/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-restx/default.nix51
-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-silk/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-socketio/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-sockets/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-sqlalchemy/default.nix25
-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-testing/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-versioned/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-wtf/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/flaskbabel/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/flatbuffers/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/flexmock/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/flickrapi/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/flit-core/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/flit/default.nix71
-rw-r--r--nixpkgs/pkgs/development/python-modules/flower/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/flowlogs_reader/default.nix32
-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.nix17
-rw-r--r--nixpkgs/pkgs/development/python-modules/flufl/lock.nix13
-rw-r--r--nixpkgs/pkgs/development/python-modules/flup/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/flux-led/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/fn/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/fnvhash/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/folium/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/fontmath/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/fontparts/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/fontpens/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/fonttools/default.nix75
-rw-r--r--nixpkgs/pkgs/development/python-modules/foolscap/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/forbiddenfruit/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/fortiosapi/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/foxdot/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/fpdf/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/fpylll/default.nix77
-rw-r--r--nixpkgs/pkgs/development/python-modules/freetype-py/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/freetype-py/library-paths.patch37
-rw-r--r--nixpkgs/pkgs/development/python-modules/freezegun/0.3.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/freezegun/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/fritzconnection/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/frozendict/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/fs-s3fs/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/fs/default.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/fsspec/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/ftfy/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/ftputil/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/fudge/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/funcparserlib/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/funcsigs/default.nix25
-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/funcy/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/furl/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/fuse-python/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/fusepy/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/future-fstrings/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/future/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/futures/default.nix27
-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/gast/default.nix16
-rw-r--r--nixpkgs/pkgs/development/python-modules/gateone/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/gcovr/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/gdata/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/gdown/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/gdrivefs/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/geeknote/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/genanki/default.nix38
-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.nix43
-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.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/geographiclib/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/geoip2/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/geojson-client/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/geojson/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/geopandas/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/geopy/2.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/geopy/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/getkey/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/getmac/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/gevent-socketio/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/gevent-websocket/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/gevent/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/geventhttpclient/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/gflags/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/ghdiff/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/gidgethub/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/gin-config/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/gipc/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/git-annex-adapter/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/git-annex-adapter/git-annex-path.patch75
-rw-r--r--nixpkgs/pkgs/development/python-modules/git-revise/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/git-sweep/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/gitdb/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/github-webhook/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/github3_py/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/glances-api/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/glasgow/default.nix75
-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.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/glom/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/glymur/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/gmpy/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/gmpy2/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/gmusicapi/default.nix37
-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/gnutls/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/goobook/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/goocalendar/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-api-core/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-api-python-client/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-apputils/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-auth-httplib2/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-auth-oauthlib/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-auth/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-access-context-manager/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-asset/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-automl/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-bigquery-datatransfer/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-bigquery/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-bigtable/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-container/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-core/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-dataproc/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-datastore/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-dlp/default.nix42
-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.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-firestore/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-iam/default.nix37
-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.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-logging/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-monitoring/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-org-policy/default.nix25
-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.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-redis/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-resource-manager/default.nix36
-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.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-securitycenter/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-spanner/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-speech/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-storage/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-tasks/default.nix44
-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.nix46
-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.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-websecurityscanner/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-crc32c/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-i18n-address/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-music-proto/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-music-utils/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-music/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-pasta/default.nix28
-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.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/googlemaps/default.nix39
-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/gpapi/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/gphoto2/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/gplaycli/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/gprof2dot/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/gps3/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/gpsoauth/default.nix36
-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.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/gradient_sdk/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/gradient_statsd/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/grammalecte/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/grandalf/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/grandalf/no-setup-requires-pytestrunner.patch15
-rw-r--r--nixpkgs/pkgs/development/python-modules/graph-tool/2.x.x.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/graph_nets/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/graphene/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/graphite-api/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/graphite-api/flask-caching-rebased.patch132
-rw-r--r--nixpkgs/pkgs/development/python-modules/graphite-web/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/graphite-web/update-django-tagging.patch13
-rw-r--r--nixpkgs/pkgs/development/python-modules/graphite_beacon/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/graphql-core/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/graphql-relay/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/graphql-server-core/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/graphviz/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/graphviz/hardcode-graphviz-path.patch98
-rw-r--r--nixpkgs/pkgs/development/python-modules/grappelli_safe/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/graspologic/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/greatfet/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/green/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/greenlet/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/grequests/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/grip/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/grpc_google_iam_v1/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/grpcio-gcp/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/grpcio-tools/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/grpcio/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/gsd/1.7.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/gsd/default.nix31
-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/gtimelog/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/gtts-token/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/gtts/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/guessit/default.nix31
-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/19.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/gunicorn/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/gurobipy/darwin.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/gurobipy/linux.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/gurobipy/no-clever-setup.patch55
-rw-r--r--nixpkgs/pkgs/development/python-modules/guzzle_sphinx_theme/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/gviz-api/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/gym/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/gyp/default.nix29
-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.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/h2/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/h3/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/h3/disable-custom-install.patch41
-rw-r--r--nixpkgs/pkgs/development/python-modules/h3/hardcode-h3-path.patch19
-rw-r--r--nixpkgs/pkgs/development/python-modules/h5netcdf/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/h5py/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/ha-ffmpeg/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/habanero/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/handout/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/hass-nabucasa/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/hatasmota/default.nix34
-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/hbmqtt/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/hcloud/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/hcs_utils/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/hdbscan/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/hdlparse/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/hdmedians/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/heapdict/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/helpdev/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/helper/default.nix23
-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/hg-evolve/default.nix24
-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/hgsvn/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/hickle/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/hidapi/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/hieroglyph/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/hiredis/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/hiro/default.nix19
-rw-r--r--nixpkgs/pkgs/development/python-modules/hiyapyco/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/hjson/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/hkdf/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/hmmlearn/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/hocr-tools/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/hole/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/holidays/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/holoviews/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/homeassistant-pyozw/default.nix15
-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.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/hpack/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/hsaudiotag/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/hsaudiotag3k/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/hstspreload/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/html-sanitizer/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/html2text/2018.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/html2text/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/html5-parser/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/html5lib/default.nix45
-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.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/http-ece/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/http-parser/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/http_signature/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/httpauth/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/httpbin/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/httpcore/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/httplib2/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/httpretty/0.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/httpretty/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/httpserver/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/httpsig/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/httptools/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/httpx/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/huey/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/hug/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/humanfriendly/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/humanize/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/hupper/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/hvac/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/hvplot/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/hwi/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/hydra-check/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/hydra/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/hydrawiser/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/hypchat/default.nix14
-rw-r--r--nixpkgs/pkgs/development/python-modules/hyperframe/default.nix19
-rw-r--r--nixpkgs/pkgs/development/python-modules/hyperlink/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/hyperopt/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/hypothesis-auto/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/hypothesis/2.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/hypothesis/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/hyppo/default.nix40
-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/ibis-framework/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/ibis/default.nix30
-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.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/ics/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/identify/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/idna-ssl/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/idna/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/ifaddr/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/ifconfig-parser/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/ifcopenshell/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/ifcopenshell/site-packages.patch32
-rw-r--r--nixpkgs/pkgs/development/python-modules/ignite/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/ihatemoney/default.nix138
-rw-r--r--nixpkgs/pkgs/development/python-modules/ijson/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/image-match/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/imagecodecs-lite/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/imagecorruptions/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/imageio-ffmpeg/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/imageio/default.nix55
-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/imapclient/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/imaplib2/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/imbalanced-learn/0.4.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/imbalanced-learn/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/imdbpy/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/imdbpy/sql_error.patch39
-rw-r--r--nixpkgs/pkgs/development/python-modules/img2pdf/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/imgaug/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/imgsize/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/immutables/default.nix19
-rw-r--r--nixpkgs/pkgs/development/python-modules/impacket/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/importlib-metadata/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/importlib-resources/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/importmagic/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/imread/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/imutils/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/incremental/default.nix18
-rw-r--r--nixpkgs/pkgs/development/python-modules/inflect/default.nix16
-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.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/influxgraph/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/infoqscraper/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/inform/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/iniconfig/default.nix21
-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/inotify-simple/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/inquirer/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/intake/default.nix82
-rw-r--r--nixpkgs/pkgs/development/python-modules/intelhex/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/internetarchive/default.nix58
-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/invoke/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/iocapture/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/iowait/default.nix16
-rw-r--r--nixpkgs/pkgs/development/python-modules/ipaddr/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/ipaddress/default.nix27
-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/ipfsapi/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/iptools/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/ipydatawidgets/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/ipykernel/4.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/ipykernel/default.nix70
-rw-r--r--nixpkgs/pkgs/development/python-modules/ipympl/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/ipyparallel/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/ipython/5.nix72
-rw-r--r--nixpkgs/pkgs/development/python-modules/ipython/7.16.nix70
-rw-r--r--nixpkgs/pkgs/development/python-modules/ipython/default.nix70
-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.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/irc/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/ircrobots/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/ircstates/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/irctokens/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/isbnlib/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/islpy/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/iso-639/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/iso3166/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/iso8601/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/isodate/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/isort/4.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/isort/default.nix77
-rw-r--r--nixpkgs/pkgs/development/python-modules/isoweek/default.nix19
-rw-r--r--nixpkgs/pkgs/development/python-modules/itanium_demangler/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/itemadapter/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/itemloaders/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/iterm2/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/itsdangerous/default.nix21
-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/jabberbot/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/janus/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/jaraco_classes/default.nix19
-rw-r--r--nixpkgs/pkgs/development/python-modules/jaraco_collections/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/jaraco_functools/2.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/jaraco_functools/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/jaraco_itertools/0001-Don-t-run-flake8-checks-during-the-build.patch27
-rw-r--r--nixpkgs/pkgs/development/python-modules/jaraco_itertools/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/jaraco_logging/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/jaraco_stream/2.nix13
-rw-r--r--nixpkgs/pkgs/development/python-modules/jaraco_stream/default.nix17
-rw-r--r--nixpkgs/pkgs/development/python-modules/jaraco_text/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/javaobj-py3/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/javaproperties/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/jc/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/jdatetime/default.nix19
-rw-r--r--nixpkgs/pkgs/development/python-modules/jdcal/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/jedi/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/jeepney/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/jellyfin-apiclient-python/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/jellyfish/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/jenkins-job-builder/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/jenkinsapi/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/jieba/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/jinja2/default.nix41
-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.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/jira/sphinx-fix.patch11
-rw-r--r--nixpkgs/pkgs/development/python-modules/jmespath/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/joblib/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/johnnycanencrypt/Cargo.lock.patch1194
-rw-r--r--nixpkgs/pkgs/development/python-modules/johnnycanencrypt/default.nix99
-rw-r--r--nixpkgs/pkgs/development/python-modules/josepy/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/jpylyzer/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/jq/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/jq/jq-py-setup.patch147
-rw-r--r--nixpkgs/pkgs/development/python-modules/jsbeautifier/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/jsmin/default.nix17
-rw-r--r--nixpkgs/pkgs/development/python-modules/json-merge-patch/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/json-schema-for-humans/default.nix35
-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.nix25
-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.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/jsonrpc-base/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/jsonrpc-websocket/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/jsonrpclib-pelix/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/jsonrpclib/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/jsonschema/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/jsonstreams/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/jsonwatch/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/jug/default.nix34
-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.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupyter-c-kernel/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupyter-repo2docker/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupyter-sphinx/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupyter-telemetry/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupyter/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupyter_client/5.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupyter_client/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupyter_console/5.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupyter_console/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupyter_core/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupyter_core/tests_respect_pythonpath.patch20
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupyterhub-ldapauthenticator/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupyterhub-systemdspawner/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupyterhub-tmpauthenticator/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupyterhub/default.nix127
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupyterlab-git/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupyterlab-pygments/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupyterlab/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupyterlab_launcher/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupyterlab_server/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupytext/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/jwcrypto/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/k5test/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/k5test/fix-paths.patch90
-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.nix17
-rw-r--r--nixpkgs/pkgs/development/python-modules/kajiki/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/kaptan/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/kazoo/default.nix44
-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.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/keepkey/default.nix33
-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.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/kerberos/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/keyring/2.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/keyring/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/keyrings-alt/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/keyutils/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/kinparse/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/kitchen/default.nix16
-rw-r--r--nixpkgs/pkgs/development/python-modules/kiwisolver/1_1.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/kiwisolver/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/klaus/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/klein/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/kmapper/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/knack/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/koji/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/kombu/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/konfig/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/korean-lunar-calendar/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/kubernetes/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/labelbox/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/lammps-cython/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/langcodes/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/langdetect/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/larch/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/lark-parser/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/lasagne/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/latexcodec/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/launchpadlib/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/lazr-restfulclient/default.nix36
-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.nix33
-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/ldap/default.nix37
-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.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/le/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/leather/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/ledger_agent/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/ledgerblue/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/ledgerwallet/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/lektor/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/leveldb/default.nix19
-rw-r--r--nixpkgs/pkgs/development/python-modules/lexid/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/libagent/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/libais/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/libarchive-c/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/libarcus/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/libasyncns/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/libasyncns/libasyncns-fix-res-consts.patch14
-rw-r--r--nixpkgs/pkgs/development/python-modules/libcloud/2.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/libcloud/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/libcst/default.nix44
-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.nix81
-rw-r--r--nixpkgs/pkgs/development/python-modules/libkeepass/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/liblarch/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/libmr/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/libnacl/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/librosa/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/libsass/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/libsavitar/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/libsoundtouch/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/libthumbor/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/libtmux/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/libusb1/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/libversion/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/libvirt/5.9.0.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/libvirt/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/license-expression/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/lightblue/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/lightgbm/default.nix62
-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/limitlessled/default.nix18
-rw-r--r--nixpkgs/pkgs/development/python-modules/limits/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/limnoria/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/line_profiler/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/linecache2/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/linode-api/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/linode/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/linuxfd/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/liquidctl/default.nix41
-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.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/livestreamer/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/llfuse/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/llvmlite/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/lmdb/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/lml/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/lmtpd/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/localzone/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/locket/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/lockfile/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/logfury/default.nix31
-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.nix26
-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.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/loo-py/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/lpod/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/lsassy/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/lsi/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/ludios_wpull/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/luftdaten/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/lxc/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/lxml/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/lyricwikia/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/lzstring/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/m2crypto/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/m2r/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/m3u8/default.nix29
-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.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/magic-wormhole-mailbox-server/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/magic-wormhole-transit-relay/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/magic-wormhole/default.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/magic/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/mahotas/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/mahotas/disable-impure-tests.patch76
-rw-r--r--nixpkgs/pkgs/development/python-modules/mail-parser/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/mailcap-fix/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/mailchimp/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/mailman-hyperkitty/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/mailman-rss/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/mailmanclient/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/managesieve/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/manhole/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/manticore/default.nix109
-rw-r--r--nixpkgs/pkgs/development/python-modules/manuel/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/mapbox/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/mapsplotlib/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/marionette-harness/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/marionette-harness/manifestparser.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/marionette-harness/marionette_driver.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/marionette-harness/mozcrash.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/marionette-harness/mozdevice.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/marionette-harness/mozfile.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/marionette-harness/mozhttpd.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/marionette-harness/mozinfo.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/marionette-harness/mozlog.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/marionette-harness/moznetwork.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/marionette-harness/mozprocess.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/marionette-harness/mozprofile.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/marionette-harness/mozrunner.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/marionette-harness/moztest.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/marionette-harness/mozversion.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/marisa-trie/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/marisa/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/markdown-it-py/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/markdown-macros/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/markdown/3_1.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/markdown/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/markdown2/default.nix19
-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/markupsafe/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/marshmallow-enum/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/marshmallow-polyfield/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/marshmallow-sqlalchemy/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/marshmallow/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/mask-rcnn/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/matchpy/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/mathlibtools/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/matplotlib/2.nix85
-rw-r--r--nixpkgs/pkgs/development/python-modules/matplotlib/default.nix76
-rw-r--r--nixpkgs/pkgs/development/python-modules/matplotlib/setup-darwin.cfg7
-rw-r--r--nixpkgs/pkgs/development/python-modules/matplotlib/setup.cfg5
-rw-r--r--nixpkgs/pkgs/development/python-modules/matrix-client/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/matrix-nio/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/mautrix/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/maxminddb/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/maya/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/mayavi/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/mccabe/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/mdp/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/measurement/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/mecab-python3/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/mechanize/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/mediafile/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/meinheld/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/meld3/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/meliae/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/memcached/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/memory_profiler/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/mergedeep/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/merkletools/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/mesa/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/meshlabxml/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/mesonpep517/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/metaphone/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/mezzanine/default.nix74
-rw-r--r--nixpkgs/pkgs/development/python-modules/micawber/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/midiutil/default.nix18
-rw-r--r--nixpkgs/pkgs/development/python-modules/mido/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/mido/libportmidi-cdll.patch19
-rw-r--r--nixpkgs/pkgs/development/python-modules/milc/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/milksnake/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/minidb/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/minidump/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/minikerberos/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/minimock/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/minio/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/miniupnpc/default.nix18
-rw-r--r--nixpkgs/pkgs/development/python-modules/misaka/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/mistletoe/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/mistune/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/mitmproxy/default.nix116
-rw-r--r--nixpkgs/pkgs/development/python-modules/mixpanel/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/mkl-service/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/mlflow/default.nix72
-rw-r--r--nixpkgs/pkgs/development/python-modules/mlrose/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/mlxtend/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/mmh3/default.nix23
-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.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/mnist/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/mock-open/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/mock/2.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/mock/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/mocket/default.nix74
-rw-r--r--nixpkgs/pkgs/development/python-modules/mockito/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/modeled/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/moderngl/default.nix32
-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/moinmoin/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/moinmoin/fix_tests.patch16
-rw-r--r--nixpkgs/pkgs/development/python-modules/mongodict/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/mongoengine/default.nix51
-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.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/more-itertools/2.7.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/more-itertools/default.nix31
-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/moto/default.nix102
-rw-r--r--nixpkgs/pkgs/development/python-modules/moviepy/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/mox/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/mox3/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/mozsvc/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/mozterm/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/mpd/default.nix23
-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/mplleaflet/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/mpmath/default.nix26
-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/mrbob/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/msal-extensions/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/msal/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/msgpack-numpy/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/msgpack/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/msldap/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/msrest/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/msrestazure/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/msrplib/default.nix27
-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/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.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/multipledispatch/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/multiprocess/default.nix22
-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.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/mutagen/1.43.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/mutagen/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/mutatormath/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/muttils/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/mwclient/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/mwlib-ext/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/mwlib-rl/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/mwlib/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/mwoauth/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/mwparserfromhell/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/mxnet/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/myfitnesspal/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/mygpoclient/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/mypy-protobuf/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/mypy/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/mypy/extensions.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/mysql-connector/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/mysqlclient/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/nagiosplugin/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/namebench/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/namedlist/default.nix33
-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/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/nassl/default.nix125
-rw-r--r--nixpkgs/pkgs/development/python-modules/natsort/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/naturalsort/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/nbclient/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/nbconflux/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/nbconvert/default.nix75
-rw-r--r--nixpkgs/pkgs/development/python-modules/nbdime/default.nix69
-rw-r--r--nixpkgs/pkgs/development/python-modules/nbformat/2.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/nbformat/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/nbmerge/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/nbsmoke/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/nbsphinx/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/nbval/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/nbxmpp/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/ncclient/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/ndg-httpsclient/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/ndjson/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/ndtypes/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/neo/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/nest-asyncio/default.nix28
-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.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/netdisco/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/netifaces/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/networkx/2.2.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/networkx/default.nix31
-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/nibabel/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/nidaqmx/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/nilearn/default.nix32
-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.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/nix-kernel/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/nix-prefetch-github/default.nix43
-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/nltk/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/nmigen-boards/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/nmigen-soc/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/nmigen/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/nocasedict/default.nix28
-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.nix24
-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/nose-cov/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/nose-cover3/default.nix27
-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-focus/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/nose-of-yeti/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/nose-pattern-exclude/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/nose-randomly/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/nose-timer/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/nose/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/nose2/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/nose_progressive/default.nix32
-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/2.nix76
-rw-r--r--nixpkgs/pkgs/development/python-modules/notebook/default.nix86
-rw-r--r--nixpkgs/pkgs/development/python-modules/notedown/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/notify-py/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/notify/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/notify2/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/notmuch/2.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/notmuch/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/nplusone/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/ntc-templates/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/ntlm-auth/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/ntplib/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/nuitka/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/num2words/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/numba/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/numcodecs/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/numericalunits/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/numexpr/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/numpy-stl/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/numpy/1.16.nix99
-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/numpy/numpy-distutils-C++_1.16.patch30
-rw-r--r--nixpkgs/pkgs/development/python-modules/numpydoc/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/numtraits/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/nunavut/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/nvchecker/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/nwdiag/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/nxt-python/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/oath/default.nix21
-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.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/oauthlib/3.1.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/oauthlib/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/obfsproxy/default.nix37
-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/od/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/odfpy/default.nix30
-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.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/olefile/default.nix18
-rw-r--r--nixpkgs/pkgs/development/python-modules/omegaconf/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/onkyo-eiscp/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/onnx/default.nix71
-rw-r--r--nixpkgs/pkgs/development/python-modules/openant/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/openapi-spec-validator/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/openbabel-bindings/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/openidc-client/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/openpyxl/2.nix38
-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.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/openrazer/pylib.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/openrouteservice/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/opensensemap-api/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/opentimestamps/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/opentracing/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/openwebifpy/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/openwrt-luci-rpc/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/opt-einsum/2.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/opt-einsum/default.nix26
-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.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/ordereddict/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/orderedmultidict/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/orderedset/default.nix18
-rw-r--r--nixpkgs/pkgs/development/python-modules/orm/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/orvibo/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/osc/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/oscrypto/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/oset/default.nix19
-rwxr-xr-xnixpkgs/pkgs/development/python-modules/osmnx/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/osmpythontools/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/osqp/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/outcome/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/ovh/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/ovito/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/owslib/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/oyaml/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/pa-ringbuffer/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/packaging/2.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/packaging/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/packet-python/default.nix38
-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/pagerduty/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/paho-mqtt/default.nix31
-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.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/pandas-datareader/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/pandas/2.nix119
-rw-r--r--nixpkgs/pkgs/development/python-modules/pandas/default.nix146
-rw-r--r--nixpkgs/pkgs/development/python-modules/pandoc-attributes/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/pandocfilters/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/panel/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/papermill/default.nix74
-rw-r--r--nixpkgs/pkgs/development/python-modules/paperspace/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/papis-python-rofi/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/papis/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/param/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/parameterized/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/paramiko/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/paramz/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/parfive/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/parse-type/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/parse/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/parsedatetime/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/parsel/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/parsimonious/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/parsley/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/parso/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/parsy/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/partd/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/parver/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/passlib/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/paste/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/pastedeploy/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/pastel/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/pastescript/default.nix31
-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.py/2.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/path.py/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/pathlib/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/pathlib2/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/pathos/default.nix30
-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/patiencediff/default.nix18
-rw-r--r--nixpkgs/pkgs/development/python-modules/patool/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/patsy/default.nix36
-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.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/pc-ble-driver-py/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/pcpp/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/pdf2image/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/pdfkit/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/pdfminer_six/default.nix30
-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.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/pdoc3/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/pecan/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/peewee/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/pefile/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/pelican/default.nix76
-rw-r--r--nixpkgs/pkgs/development/python-modules/pendulum/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/pep257/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/pep517/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/pep8-naming/default.nix27
-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.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/perfplot/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/periodictable/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/persim/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/persistent/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/persisting-theory/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/pex/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/pexif/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/pexpect/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/pg8000/1_12.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/pg8000/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/pglast/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/pgpdump/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/pgpy/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/pgsanity/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/pgspecial/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/phe/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/phik/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/phonemizer/backend-paths.patch29
-rw-r--r--nixpkgs/pkgs/development/python-modules/phonemizer/default.nix73
-rw-r--r--nixpkgs/pkgs/development/python-modules/phonemizer/drop-readme-festival-test.patch12
-rw-r--r--nixpkgs/pkgs/development/python-modules/phonemizer/remove-intertwined-festival-test.patch22
-rw-r--r--nixpkgs/pkgs/development/python-modules/phonenumbers/default.nix18
-rw-r--r--nixpkgs/pkgs/development/python-modules/phonopy/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/phpserialize/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/phx-class-registry/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/piccata/default.nix26
-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.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/piexif/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/pika-pool/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/pika/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/pikepdf/default.nix77
-rw-r--r--nixpkgs/pkgs/development/python-modules/pilkit/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/pillow/6.nix82
-rw-r--r--nixpkgs/pkgs/development/python-modules/pillow/default.nix82
-rw-r--r--nixpkgs/pkgs/development/python-modules/pillowfight/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/pims/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/pinboard/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/pint/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/pip-tools/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/pip/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/pipdate/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/pipx/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/pivy/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/pkgconfig/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/pkgconfig/executable.patch38
-rw-r--r--nixpkgs/pkgs/development/python-modules/pkginfo/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/pkuseg/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/pkutils/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/plac/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/plaid-python/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/plaster-pastedeploy/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/plaster/default.nix19
-rw-r--r--nixpkgs/pkgs/development/python-modules/playsound/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/plexapi/default.nix26
-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.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/pluggy/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/pluginbase/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/plumbum/default.nix19
-rw-r--r--nixpkgs/pkgs/development/python-modules/ply/default.nix42
-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/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.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/poetry/default.nix107
-rw-r--r--nixpkgs/pkgs/development/python-modules/polib/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/polyline/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/pomegranate/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/pony/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/ponywhoosh/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/pooch/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/poolsense/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/poppler-qt5/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/poppler-qt5/poppler-include-dir.patch12
-rw-r--r--nixpkgs/pkgs/development/python-modules/portalocker/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/portend/black-19.10b0.patch13
-rw-r--r--nixpkgs/pkgs/development/python-modules/portend/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/portpicker/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/posix_ipc/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/poster3/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/potr/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/power/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/powerline/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/pox/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/poyo/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/ppft/default.nix32
-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.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/pq/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/prance/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/praw/6.3.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/praw/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/prawcore/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/pre-commit-hooks/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/pre-commit/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/pre-commit/hook-tmpl-use-the-hardcoded-path-to-pre-commit.patch15
-rw-r--r--nixpkgs/pkgs/development/python-modules/pre-commit/languages-use-the-hardcoded-path-to-python-binaries.patch26
-rw-r--r--nixpkgs/pkgs/development/python-modules/precis-i18n/default.nix20
-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/preshed/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/pretend/default.nix19
-rw-r--r--nixpkgs/pkgs/development/python-modules/prettytable/1.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/prettytable/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/primer3/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/priority/deadline.patch39
-rw-r--r--nixpkgs/pkgs/development/python-modules/priority/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/prison/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/privacyidea/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/privacyidea/ldap-proxy.nix30
-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.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/progressbar231/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/progressbar33/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/prometheus_client/default.nix19
-rw-r--r--nixpkgs/pkgs/development/python-modules/promise/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/prompt_toolkit/1.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/prompt_toolkit/default.nix35
-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.nix81
-rw-r--r--nixpkgs/pkgs/development/python-modules/prov/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/prox-tv/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/psautohint/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/psd-tools/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/psutil/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/psycopg2/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/psycopg2cffi/default.nix39
-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.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/ptyprocess/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/publicsuffix/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/publicsuffix2/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/pubnub/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/pubnubsub-handler/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/pudb/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/pulp/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/pulsectl/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/pulsectl/library-paths.patch22
-rw-r--r--nixpkgs/pkgs/development/python-modules/pure-eval/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/pure-pcapy3/default.nix18
-rw-r--r--nixpkgs/pkgs/development/python-modules/pure-python-adb-homeassistant/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/pure-python-adb/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/purepng/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/purl/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/pushbullet/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/pushover-complete/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/pushover/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/pvlib/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/pweave/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/pwntools/default.nix74
-rw-r--r--nixpkgs/pkgs/development/python-modules/pxml/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/py-air-control-exporter/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/py-air-control/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/py-cpuinfo/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/py-lru-cache/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/py-multibase/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/py-multihash/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/py-radix/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/py-sonic/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/py-vapid/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/py/default.nix26
-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.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/py3status/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/py4j/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyGithub/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyTelegramBotAPI/default.nix20
-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.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyads/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyaes/default.nix17
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyaftership/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyahocorasick/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyairvisual/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyalgotrade/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyamf/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyamg/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyaml/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyannotate/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyarlo/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyarrow/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyasn1-modules/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyasn1/default.nix18
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyatmo/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyatspi/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyatv/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyaudio/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyavm/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyaxmlparser/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/pybase64/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/pybids/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/pybigwig/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/pybind11/default.nix71
-rw-r--r--nixpkgs/pkgs/development/python-modules/pybindgen/default.nix22
-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/pyblosxom/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/pybluez/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/pybotvac/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/pybrowserid/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/pybtex-docutils/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/pybtex/default.nix20
-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.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycallgraph/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycangjie/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycapnp/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycaption/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycarddav/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycares/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycassa/default.nix38
-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.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycfdns/default.nix34
-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/pychromecast/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyclipper/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycm/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycmarkgfm/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycodestyle/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycognito/default.nix53
-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/pycontracts/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycosat/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycountry/default.nix22
-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/pycrypto/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycryptodome/default.nix17
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycryptodomex/default.nix17
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycryptopp/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyct/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycuda/compyte.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycuda/default.nix70
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycups/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycurl/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycurl2/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycxx/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydantic/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydbus/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydenticon/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydexcom/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydicom/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydispatcher/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydns/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydocstyle/2.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydocstyle/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydocumentdb/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydot/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydot/hardcode-graphviz-path.patch13
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydrive/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydsdl/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydub/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydy/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyechonest/default.nix17
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyee/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyelftools/default.nix34
-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/pyepsg/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyerfa/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyeverlights/default.nix30
-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.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyexcel/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyexcelerator/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyexiv2/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyext/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyface/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyfaidx/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyfakefs/default.nix44
-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.nix34
-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/pyflakes/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyfma/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyfnip/default.nix28
-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.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyftdi/default.nix39
-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.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyfxa/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/pygal/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/pygame/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/pygame_sdl2/default.nix44
-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.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/pygeoip/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/pygit2/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyglet/default.nix84
-rw-r--r--nixpkgs/pkgs/development/python-modules/pygls/default.nix30
-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/pygmo/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/pygmt/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/pygobject/3.36.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/pygobject/3.nix38
-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.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/pygpgme/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/pygraphviz/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/pygraphviz/graphviz-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/pygtk/default.nix74
-rw-r--r--nixpkgs/pkgs/development/python-modules/pygtksourceview/codegendir.patch25
-rw-r--r--nixpkgs/pkgs/development/python-modules/pygtksourceview/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/pygtrie/default.nix15
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyhamcrest/1.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyhamcrest/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyhaversion/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyhcl/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyhocon/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyhomematic/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyhs100/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyi2cflash/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyicloud/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyicu/default.nix40
-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.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyipp/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyiqvia/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyjet/default.nix37
-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/pyjwkest/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyjwt/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/pykdl/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/pykdtree/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/pykeepass/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/pykerberos/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/pykickstart/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/pykira/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/pykka/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/pykwalify/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/pylacrosse/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/pylama/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/pylast/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/pylatexenc/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/pylev/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/pylibacl/0.5.nix26
-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.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyliblo/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/pylibmc/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/pylint-celery/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/pylint-django/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/pylint-flask/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/pylint-plugin-utils/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/pylint/1.9.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/pylint/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/pylru/default.nix18
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyls-black/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyls-isort/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyls-mypy/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyls-spyder/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/pylti/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/pylutron/default.nix25
-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/pymata-express/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymatgen-lammps/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymatgen/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymavlink/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymbolic/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymc3/default.nix72
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymediainfo/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymeeus/default.nix24
-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/pymetno/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymodbus/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymongo/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/pympler/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymsgbox/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymumble/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymupdf/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymvglive/default.nix19
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymyq/default.nix36
-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.nix37
-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.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/pynest2d/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/pynisher/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/pynmea2/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/pynput/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/pynrrd/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/pynvim/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/pynvml/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/pynzb/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyobjc/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyocr/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyocr/paths.patch348
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyodbc/default.nix24
-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/pyomo/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyopencl/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyopengl-accelerate/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyopengl/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyopenssl/default.nix92
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyopnsense/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyosf/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyosmium/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyotp/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyowm/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/pypandoc/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyparser/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyparsing/default.nix35
-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.nix84
-rw-r--r--nixpkgs/pkgs/development/python-modules/pypass/mark-executables.patch255
-rw-r--r--nixpkgs/pkgs/development/python-modules/pypblib/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/pypcap/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/pypck/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/pypdf/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/pypdf2/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/pypeg2/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyperclip/default.nix19
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyperf/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyphen/default.nix18
-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/pyplatec/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/pypoppler/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/pypoppler/pypoppler-0.39.0.patch23
-rw-r--r--nixpkgs/pkgs/development/python-modules/pypoppler/pypoppler-poppler.c.patch12
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyppeteer/default.nix29
-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.patch62
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyproj/default.nix60
-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.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyqrcode/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyqt/4.x.nix69
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyqt/5.x.nix160
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyqt/pyqt5-fix-dbus-mainloop-support.patch70
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyqtgraph/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyqtwebengine/default.nix99
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyqtwebengine/fix-build-with-qt-514.patch31
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyquery/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyrabbit2/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyrad/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyramid/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyramid_beaker/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyramid_chameleon/default.nix33
-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.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyramid_hawkauth/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyramid_jinja2/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyramid_mako/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyramid_multiauth/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyreadability/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyregion/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyreport/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyres/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyrfc3339/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyro-api/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyro-ppl/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyro4/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyro5/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyroma/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyroute2/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyrr/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyrsistent/default.nix37
-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/pysam/default.nix114
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysaml2/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysaml2/hardcode-xmlsec1-path.patch39
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysbd/default.nix31
-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.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyschedule/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyscreenshot/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyscrypt/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyscss/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysdl2/PySDL2-dll.patch100
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysdl2/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysendfile/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysensors/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyserial-asyncio/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyserial/default.nix21
-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/pyshp/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyside/apiextractor.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyside/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyside/gcc6.patch18
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyside/generatorrunner.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyside/shiboken.nix59
-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.nix50
-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.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyside2/dont_ignore_optional_modules.patch11
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysigset/default.nix18
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysingleton/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyslurm/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysmb/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysmbc/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysmf/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysmi/default.nix28
-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/pysnooper/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysnow/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysocks/default.nix24
-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.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyspark/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysparse/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysparse/dropPackageLoader.patch88
-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.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyspotify/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysptk/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysqlcipher3/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysqlite/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysqueezebox/default.nix27
-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.nix24
-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/pysvn/default.nix83
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysychonaut/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytabix/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytado/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytaglib/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyte/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytesseract/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytesseract/tesseract-binary.patch13
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-aiohttp/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-annotate/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-ansible/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-arraydiff/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-astropy-header/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-astropy/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-asyncio/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-bdd/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-benchmark/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-black/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-catchlog/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-celery/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-celery/no-celery.patch9
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-check/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-click/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-cov/default.nix30
-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.nix18
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-dependency/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-django/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-doctestplus/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-env/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-expect/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-factoryboy/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-filter-subpackage/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-fixture-config/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-flake8/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-flakes/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-flask/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-forked/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-freezegun/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-helpers-namespace/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-html/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-httpbin/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-instafail/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-isort/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-lazy-fixture/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-localserver/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-metadata/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-mock/2.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-mock/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-mpl/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-mypy/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-openfiles/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-ordering/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-pep257/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-pylint/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-pythonpath/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-qt/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-quickcheck/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-raisesregexp/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-random-order/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-randomly/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-relaxed/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-remotedata/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-repeat/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-rerunfailures/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-sanic/default.nix33
-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.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-snapshot/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-socket/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-subtesthack/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-subtests/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-sugar/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-testmon/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-timeout/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-tornado/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-tornasync/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-trio/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-twisted/default.nix27
-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.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-xdist/1.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-xdist/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-xprocess/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-xvfb/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest/4.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest/5.nix80
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest/default.nix88
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytestcache/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytestrunner/default.nix30
-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-baseconv/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-bidi/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-binance/default.nix25
-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-crontab/default.nix27
-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.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-dbusmock/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-didl-lite/default.nix35
-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.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-editor/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-efl/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-engineio/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-etcd/default.nix37
-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.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-gitlab/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-gnupg/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-hosts/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-hpilo/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-http-client/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-igraph/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-jenkins/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-jose/default.nix46
-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.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-language-server/default.nix79
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-ldap-test/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-levenshtein/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-logstash/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-ly/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-lz4/default.nix41
-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.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-mapnik/default.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-markdown-math/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-miio/default.nix52
-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.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-mystrom/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-nest/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-nomad/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-oauth2/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-olm/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-opendata-transport/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-openems/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-otr/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-packer/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-pam/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-periphery/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-pipedrive/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-prctl/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-prctl/skip_bad_tests.patch34
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-ptrace/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-rapidjson/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-redis-lock/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-rtmidi/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-sat/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-simple-hipchat/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-slugify/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-snap7/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-snappy/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-socketio/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-sql/default.nix18
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-stdnum/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-tado/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-telegram-bot/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-toolbox/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-twitter/default.nix44
-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.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-vagrant/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-vipaccess/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-vlc/default.nix37
-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.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-wink/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-xmp-toolkit/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/python2-pythondialog/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/python3-openid/default.nix23
-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_mimeparse/default.nix24
-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/python_statsd/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/pythondialog/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/pythonirclib/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/pythonix/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/pythonmagick/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/pythonnet/default.nix94
-rw-r--r--nixpkgs/pkgs/development/python-modules/pythonocc-core/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytidylib/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytile/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytimeparse/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytmx/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytoml/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytools/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytorch-lightning/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytorch-metric-learning/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytorch/bin.nix73
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytorch/binary-hashes.nix14
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytorch/default.nix300
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytorch/pthreadpool-disable-gcd.diff45
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytrends/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytricia/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytun/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytz/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytzdata/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyu2f/default.nix35
-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/pyupdate/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyusb/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyutil/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyutilib/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyuv/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyuv/pyuv-external-libuv.patch25
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyvcd/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyvcf/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyvera/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyvips/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyviz-comms/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyvlx/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyvmomi/default.nix24
-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.nix36
-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/pywbem/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/pywebdav/default.nix17
-rw-r--r--nixpkgs/pkgs/development/python-modules/pywebpush/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/pywebview/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/pywick/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/pywilight/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/pywinrm/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/pywizlight/default.nix34
-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/pyxdg/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyxeoma/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyxl3/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyxml/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyxnat/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyyaml/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyzmq/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyzufall/default.nix29
-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/qimage2ndarray/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/qiskit-aer/default.nix114
-rw-r--r--nixpkgs/pkgs/development/python-modules/qiskit-aer/remove-conan-install.patch63
-rw-r--r--nixpkgs/pkgs/development/python-modules/qiskit-aqua/default.nix174
-rw-r--r--nixpkgs/pkgs/development/python-modules/qiskit-ibmq-provider/default.nix93
-rw-r--r--nixpkgs/pkgs/development/python-modules/qiskit-ignis/default.nix78
-rw-r--r--nixpkgs/pkgs/development/python-modules/qiskit-terra/default.nix165
-rw-r--r--nixpkgs/pkgs/development/python-modules/qiskit/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/qpid-python/default.nix26
-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-qt5/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/qscintilla/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/qserve/default.nix24
-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.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/quamash/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/quandl/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/quantities/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/querystring-parser/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/queuelib/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/r2pipe/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/rabbitpy/default.nix43
-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.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/radish-bdd/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/rainbowstream/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/rainbowstream/image.patch18
-rw-r--r--nixpkgs/pkgs/development/python-modules/ramlfications/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/random2/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/rarfile/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/rasterio/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/ratelimiter/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/raven/default.nix28
-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-jsonld/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/rdflib/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/re-assert/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/readchar/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/readme/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/readme_renderer/default.nix40
-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.nix43
-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.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/rednose/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/reedsolo/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/reflink/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/regex/default.nix31
-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/relatorio/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/remotecv/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/remotecv/install_requires.patch16
-rw-r--r--nixpkgs/pkgs/development/python-modules/rencode/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/repeated_test/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/repocheck/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/reportlab/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/repoze_lru/default.nix22
-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.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/requests-aws4auth/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/requests-cache/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/requests-file/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/requests-hawk/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/requests-http-signature/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/requests-kerberos/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/requests-kerberos/fix_setup.patch9
-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-toolbelt/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/requests-unixsocket/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/requests/default.nix24
-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.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/resampy/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/responses/default.nix16
-rw-r--r--nixpkgs/pkgs/development/python-modules/respx/default.nix50
-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.nix44
-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.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/rfc-bibtex/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/rfc3986/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/rfc3987/default.nix19
-rw-r--r--nixpkgs/pkgs/development/python-modules/rfc6555/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/rfc6555/disable_network_tests.patch31
-rw-r--r--nixpkgs/pkgs/development/python-modules/rfc7464/default.nix19
-rw-r--r--nixpkgs/pkgs/development/python-modules/rhpl/builder.sh13
-rw-r--r--nixpkgs/pkgs/development/python-modules/rhpl/default.nix19
-rw-r--r--nixpkgs/pkgs/development/python-modules/rich/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/rig/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/ripser/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/rising/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/rjsmin/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/rl-coach/default.nix100
-rw-r--r--nixpkgs/pkgs/development/python-modules/rlp/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/rnc2rng/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/robomachine/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/roboschool/default.nix77
-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-ride/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/robotframework-selenium2library/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/robotframework-seleniumlibrary/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/robotframework-sshlibrary/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/robotframework-tools/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/robotframework/default.nix19
-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/roman/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/roombapy/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/rope/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/ropper/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/routes/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/rpdb/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/rpkg/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/rply/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/rpmfluff/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/rpy2/2.nix108
-rw-r--r--nixpkgs/pkgs/development/python-modules/rpy2/default.nix97
-rw-r--r--nixpkgs/pkgs/development/python-modules/rpy2/r-libs-site.patch20
-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.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/rq/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/rsa/4_0.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/rsa/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/rtmidi-python/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/rtmixer/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/rtslib/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/ruamel_base/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/ruamel_ordereddict/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/ruamel_yaml/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/ruamel_yaml_clib/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/rubymarshal/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/ruffus/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/runsnakerun/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/runway-python/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/rx/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/rxv/default.nix40
-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/s3fs/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/s3transfer/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/sabyenc/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/sabyenc3/default.nix22
-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/safety/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/salmon-mail/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/sampledata/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/samplerate/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/samsungctl/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/samsungtvws/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/sandboxlib/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/sane/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/sanic-auth/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/sanic/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/sapi-python-client/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/sarge/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/sasmodels/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/scales/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/scandir/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/scapy/default.nix77
-rw-r--r--nixpkgs/pkgs/development/python-modules/schedule/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/schema/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/schiene/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/scikit-bio/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/scikit-build/default.nix82
-rw-r--r--nixpkgs/pkgs/development/python-modules/scikit-fmm/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/scikit-fuzzy/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/scikit-image/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/scikit-optimize/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/scikit-tda/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/scikitlearn/0.20.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/scikitlearn/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/scikits-odes/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/scipy/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/scour/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/scp/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/scramp/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.nix108
-rw-r--r--nixpkgs/pkgs/development/python-modules/screeninfo/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/scripttest/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/scs/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/sdnotify/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/seaborn/0.9.1.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/seaborn/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/seabreeze/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/seccomp/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/secp256k1/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/secretstorage/2.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/secretstorage/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/secure/default.nix31
-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/selectors2/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/selectors34/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/selenium/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/semantic-version/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/semantic/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/semver/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/send2trash/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/sendgrid/default.nix49
-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/sentry-sdk/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/sepaxml/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/seqdiag/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/serpent/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/serpy/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/serverlessrepo/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/serversyncstorage/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/service_identity/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/setproctitle/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.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/setuptools-scm-git-archive/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/setuptools/44.0.nix83
-rw-r--r--nixpkgs/pkgs/development/python-modules/setuptools/default.nix83
-rw-r--r--nixpkgs/pkgs/development/python-modules/setuptools/tag-date.patch12
-rw-r--r--nixpkgs/pkgs/development/python-modules/setuptools_scm/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/setuptoolsdarcs/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/setuptoolstrial/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/sexpdata/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/sfepy/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/sgmllib3k/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/sh/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/sh/disable-broken-tests-darwin.patch49
-rw-r--r--nixpkgs/pkgs/development/python-modules/shamir-mnemonic/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/shap/default.nix70
-rw-r--r--nixpkgs/pkgs/development/python-modules/shapely/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/shapely/library-paths.patch161
-rw-r--r--nixpkgs/pkgs/development/python-modules/sharedmem/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/shellingham/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/shiboken2/default.nix37
-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/shodan/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/shortuuid/default.nix28
-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/shutilwhich/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/sievelib/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/signedjson/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/sigtools/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/simanneal/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/simple-salesforce/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/simple-websocket-server/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/simpleai/default.nix29
-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.nix16
-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/simplejson/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/simplekml/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/simpleparse/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/simpy/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/singledispatch/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/sip/5.x.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/sip/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/sipsimple/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/six/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/skein/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/skein/skeinjar.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/skein/skeinrepo.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/skidl/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/sklearn-deap/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/skorch/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/slackclient/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/sleekxmpp/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/sleekxmpp/dnspython-ip6.patch55
-rw-r--r--nixpkgs/pkgs/development/python-modules/slicedimage/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/slicer/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/slicerator/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/slimit/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/slither-analyzer/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/slixmpp/default.nix34
-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/slowaes/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/sly/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/smart_open/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/smartdc/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/smartypants/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/smbus-cffi/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.nix28
-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.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/snowballstemmer/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/snowflake-connector-python/default.nix77
-rw-r--r--nixpkgs/pkgs/development/python-modules/snowflake-sqlalchemy/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/snscrape/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/snug/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/snuggs/default.nix29
-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/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.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/solo-python/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/somajo/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/sopel/default.nix61
-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.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/sounddevice/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/sounddevice/fix-portaudio-library-path.patch35
-rw-r--r--nixpkgs/pkgs/development/python-modules/soundfile/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/soupsieve/1.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/soupsieve/default.nix36
-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.nix76
-rw-r--r--nixpkgs/pkgs/development/python-modules/spacy/models.json264
-rw-r--r--nixpkgs/pkgs/development/python-modules/spacy/models.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/spake2/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/spambayes/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/spark_parser/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/sparqlwrapper/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/sparse/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/speaklater/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/spectral-cube/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/speedtest-cli/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/spglib/default.nix23
-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-jinja/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinx-navtree/default.nix18
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinx-testing/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinx/2.nix82
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinx/default.nix79
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinx/python2-lexer.patch22
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinx_pypi_upload/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinx_rtd_theme/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinxcontrib-applehelp/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinxcontrib-autoapi/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinxcontrib-bibtex/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinxcontrib-blockdiag/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinxcontrib-devhelp/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinxcontrib-fulltoc/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinxcontrib-htmlhelp/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinxcontrib-jsmath/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinxcontrib-katex/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinxcontrib-openapi/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinxcontrib-qthelp/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinxcontrib-serializinghtml/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinxcontrib-spelling/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinxcontrib-tikz/binary-paths.patch22
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinxcontrib-tikz/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinxcontrib-websupport/1_1.nix25
-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/sphinxcontrib_plantuml/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/spidev/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/splinter/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/spotipy/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/spyder-kernels/0.x.nix71
-rw-r--r--nixpkgs/pkgs/development/python-modules/spyder-kernels/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/spyder/3.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/spyder/default.nix81
-rw-r--r--nixpkgs/pkgs/development/python-modules/sqlalchemy-citext/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/sqlalchemy-continuum/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/sqlalchemy-i18n/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/sqlalchemy-imageattach/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/sqlalchemy-migrate/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/sqlalchemy-utils/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/sqlalchemy/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/sqlite-fts4/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/sqlite-utils/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/sqlite3dbm/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/sqlitedict/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/sqlmap/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/sqlobject/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/sqlparse/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/sqlsoup/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/squaremap/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/srp/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/srptools/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/srsly/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/srvlookup/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/ssdeep/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/ssdp/default.nix31
-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/sshpubkeys/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/sshtunnel/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/sslib/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/sslyze/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/stack-data/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/starkbank-ecdsa/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/starlette/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/staticjinja/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/statistics/default.nix27
-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.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/stem/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/stevedore/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/stm32loader/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/stompclient/default.nix29
-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/streamz/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/strict-rfc3339/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/strictyaml/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/stringcase/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/stringtemplate/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/stripe/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/structlog/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/stumpy/default.nix56
-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.nix47
-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.nix81
-rw-r--r--nixpkgs/pkgs/development/python-modules/subarulink/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/subdownloader/default.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/subliminal/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/subprocess32/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/subunit/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/suds-jurko/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/suds/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/suds/suds-0.4-CVE-2013-2217.patch19
-rw-r--r--nixpkgs/pkgs/development/python-modules/sumo/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/sumtypes/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/sunpy/default.nix84
-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.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/sure/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/survey/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/suseapi/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/svg-path/default.nix17
-rw-r--r--nixpkgs/pkgs/development/python-modules/svg2tikz/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/svglib/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/svgwrite/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/swagger-spec-validator/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/swagger-ui-bundle/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/swisshydrodata/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/swspotify/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/sybase/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/sybil/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/symengine/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/sympy/1_5.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/sympy/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/systemd/default.nix24
-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/3.5.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/tables/default.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/tablib/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/tabulate/default.nix27
-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/tarman/default.nix34
-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.nix48
-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/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/tempita/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/tempora/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/tenacity/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/tensorboard-plugin-profile/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/tensorboard-plugin-wit/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/tensorboardx/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/tensorflow-estimator/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/tensorflow-probability/default.nix131
-rw-r--r--nixpkgs/pkgs/development/python-modules/tensorflow-tensorboard/1/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/tensorflow-tensorboard/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/tensorflow/bin.nix187
-rw-r--r--nixpkgs/pkgs/development/python-modules/tensorflow/binary-hashes.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/tensorflow/default.nix422
-rwxr-xr-xnixpkgs/pkgs/development/python-modules/tensorflow/prefetcher.sh44
-rw-r--r--nixpkgs/pkgs/development/python-modules/tensorflow/relax-dependencies.patch51
-rw-r--r--nixpkgs/pkgs/development/python-modules/tensorflow/workspace.patch18
-rw-r--r--nixpkgs/pkgs/development/python-modules/tensorly/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/termcolor/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/terminado/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/terminaltables/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/termstyle/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/teslajsonpy/default.nix39
-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/testfixtures/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/testpath/default.nix22
-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.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/text-unidecode/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/textacy/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/textfsm/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/texttable/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/textwrap3/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/tflearn/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/thespian/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/thinc/default.nix83
-rw-r--r--nixpkgs/pkgs/development/python-modules/threadpool/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/threadpoolctl/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/three-merge/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/thrift/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/thumbor/0001-Don-t-use-which-implementation-to-find-required-exec.patch277
-rw-r--r--nixpkgs/pkgs/development/python-modules/thumbor/default.nix90
-rw-r--r--nixpkgs/pkgs/development/python-modules/thumborpexif/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/tifffile/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/tifffile/python2-regex-compat.patch23
-rw-r--r--nixpkgs/pkgs/development/python-modules/tiledb/default.nix86
-rw-r--r--nixpkgs/pkgs/development/python-modules/tilestache/default.nix32
-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/timezonefinder/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/tinycss/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/tinycss2/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/tinydb/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/tinyobjloader-py/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/tiros/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/tissue/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/titlecase/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/tkinter/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/tld/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/tldextract/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/tls-parser/default.nix29
-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.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/tmdb3/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/todoist/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/toggl-cli/default.nix70
-rw-r--r--nixpkgs/pkgs/development/python-modules/tokenizers/default.nix126
-rw-r--r--nixpkgs/pkgs/development/python-modules/tokenlib/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/tokenserver/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/toml/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/tomlkit/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/toolz/2.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/toolz/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/toonapi/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/toposort/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/torchgpipe/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/torchvision/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/tornado/4.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/tornado/5.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/tornado/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/towncrier/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/tox/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/tqdm/default.nix39
-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.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/traitlets/4.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/traitlets/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/traits/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/traitsui/default.nix24
-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.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/transforms3d/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/transip/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/transitions/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/translationstring/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/transmissionrpc/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/treq/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/trezor/default.nix84
-rw-r--r--nixpkgs/pkgs/development/python-modules/trezor_agent/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/trimesh/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/trio/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/trollius/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/trollius/tests.patch13
-rw-r--r--nixpkgs/pkgs/development/python-modules/trueskill/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/trustme/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/trytond/default.nix78
-rw-r--r--nixpkgs/pkgs/development/python-modules/ttystatus/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/tubeup/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/tumpa/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/tunigo/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/tvdb_api/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/tvnamer/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/tweepy/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/twiggy/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/twilio/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/twill/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/twine/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/twisted/default.nix62
-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.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/twofish/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/txaio/default.nix30
-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/txrequests/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/txtorcon/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/typed-ast/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/typeguard/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/typer/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/typesentry/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/typesystem/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/typing-extensions/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/typing-inspect/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/typing/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/typogrify/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/tzlocal/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/u-msgpack-python/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/ua-parser/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/uamqp/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/uarray/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/ueberzug/default.nix30
-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/ujson/2.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/ujson/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/ukpostcodeparser/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/umalqurra/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/umap-learn/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/umemcache/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/uncertainties/default.nix25
-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.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/unicorn/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/unidecode/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/unidiff/default.nix21
-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/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.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/unittest2/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/unpaddedbase64/default.nix23
-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.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/upass/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/update-copyright/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/update-dotdee/default.nix22
-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/uproot3-methods/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/uproot3/default.nix44
-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/uritemplate/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/uritools/default.nix18
-rw-r--r--nixpkgs/pkgs/development/python-modules/url-normalize/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/urlgrabber/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/urllib3/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/urwid-readline/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/urwid/default.nix29
-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.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/user-agents/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/userpath/default.nix30
-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.nix72
-rw-r--r--nixpkgs/pkgs/development/python-modules/uvloop/darwin_sandbox.patch28
-rw-r--r--nixpkgs/pkgs/development/python-modules/uvloop/default.nix77
-rw-r--r--nixpkgs/pkgs/development/python-modules/validate-email/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/validators/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/validictory/default.nix23
-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.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/vcver/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/vcversioner/default.nix17
-rw-r--r--nixpkgs/pkgs/development/python-modules/vdf/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/vdirsyncer/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/vega/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/vega_datasets/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/venusian/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/verboselogs/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/versioneer/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/versiontools/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/vertica-python/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/veryprettytable/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/vidstab/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/viewstate/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/vine/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/virtkey/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/virtual-display/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/virtualenv-clone/default.nix29
-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.nix56
-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.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/vispy/library-paths.patch39
-rw-r--r--nixpkgs/pkgs/development/python-modules/vmprof/default.nix32
-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.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/voluptuous-serialize/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/voluptuous/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/vowpalwabbit/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/vsts-cd-manager/default.nix28
-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/vultr/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/vulture/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/vxi11/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/w3lib/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/wadllib/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/waitress-django/default.nix11
-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.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/waqiasync/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/warlock/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/warrant/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/wasabi/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/wasm/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/wasmer/default.nix71
-rw-r--r--nixpkgs/pkgs/development/python-modules/watchdog/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/waterfurnace/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/wcwidth/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/weasyprint/default.nix71
-rw-r--r--nixpkgs/pkgs/development/python-modules/weasyprint/library-paths.patch38
-rw-r--r--nixpkgs/pkgs/development/python-modules/web/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/webapp2/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/webassets/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/webcolors/default.nix30
-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/webhelpers/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/webob/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/weboob/default.nix84
-rw-r--r--nixpkgs/pkgs/development/python-modules/webrtcvad/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/websocket_client/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/websockets/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/websockify/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/webtest/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/webthing/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/werkzeug/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/west/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/wfuzz/default.nix69
-rw-r--r--nixpkgs/pkgs/development/python-modules/wget/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/wheel/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/whichcraft/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/whisper/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/whitenoise/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/whois/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/whoosh/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/widgetsnbextension/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/willow/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/winacl/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/winsspi/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/wled/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/word2vec/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/wordcloud/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/wordfreq/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/worldengine/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/wptserve/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/wrapio/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/wrapt/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/wrf-python/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/ws4py/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/wsgiproxy/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/wsgiproxy2/default.nix30
-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/0.14.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/wsproto/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/wtf-peewee/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/wtforms/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/wurlitzer/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/wxPython/3.0.nix91
-rw-r--r--nixpkgs/pkgs/development/python-modules/wxPython/4.0.nix78
-rw-r--r--nixpkgs/pkgs/development/python-modules/wxPython/4.1.nix75
-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.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/xarray/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/xattr/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/xcaplib/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/xcffib/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/xdg/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/xdis/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/xdot/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/xgboost/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/xgboost/lib-path-for-python.patch38
-rw-r--r--nixpkgs/pkgs/development/python-modules/xhtml2pdf/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/xkcdpass/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/xknx/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/xlib/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/xlrd/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/xlsx2csv/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/xlwt/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/xml2rfc/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/xmljson/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/xmlschema/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/xmltodict/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/xmodem/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/xmpppy/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/xmpppy/ssl.patch25
-rw-r--r--nixpkgs/pkgs/development/python-modules/xnd/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/xpybutil/default.nix26
-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/xvfbwrapper/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/xxhash/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/yahooweather/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/yamale/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/yamllint/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/yamlloader/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/yamlordereddictloader/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/yanc/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/yapf/default.nix19
-rw-r--r--nixpkgs/pkgs/development/python-modules/yappi/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/yappi/tests.patch14
-rw-r--r--nixpkgs/pkgs/development/python-modules/yapsy/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/yarg/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/yarl/default.nix34
-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.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/yenc/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/yfinance/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/yolk/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/yowsup/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/yowsup/dependency-fixes.patch13
-rw-r--r--nixpkgs/pkgs/development/python-modules/yq/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/yq/jq-path.patch26
-rw-r--r--nixpkgs/pkgs/development/python-modules/yt/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/yubico-client/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/z3c-checkversions/default.nix31
-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/zbase32/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/zc_lockfile/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/zconfig/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/zconfig/remove-setlocale-test.patch24
-rw-r--r--nixpkgs/pkgs/development/python-modules/zdaemon/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/zeep/default.nix85
-rw-r--r--nixpkgs/pkgs/development/python-modules/zerobin/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/zeroc-ice/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/zeroconf/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/zerorpc/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/zetup/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/zfec/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/zha-quirks/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/zict/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/zigpy-cc/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/zigpy-deconz/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/zigpy-xbee/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/zigpy-zigate/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/zigpy-znp/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/zigpy/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/zimports/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/zipfile36/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/zipp/1.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/zipp/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.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/zodbpickle/default.nix22
-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_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.nix37
-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.nix21
-rwxr-xr-xnixpkgs/pkgs/development/python-modules/zstandard/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/zstd/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/zulip/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/zxcvbn/default.nix27
3963 files changed, 140996 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..d1ac191489ad
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/APScheduler/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools_scm
+, pytest
+, pytestcov
+, sqlalchemy
+, tornado
+, twisted
+, mock
+, trollius
+, gevent
+, six
+, pytz
+, tzlocal
+, funcsigs
+, futures
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "APScheduler";
+  version = "3.7.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1cab7f2521e107d07127b042155b632b7a1cd5e02c34be5a28ff62f77c900c6a";
+  };
+
+  buildInputs = [
+    setuptools_scm
+  ];
+
+  checkInputs = [
+    pytest
+    pytestcov
+    sqlalchemy
+    tornado
+    twisted
+    mock
+    trollius
+    gevent
+  ];
+
+  propagatedBuildInputs = [
+    six
+    pytz
+    tzlocal
+    funcsigs
+  ] ++ lib.optional (!isPy3k) futures;
+
+  checkPhase = ''
+    py.test
+  '';
+
+  # Somehow it cannot find pytestcov
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A Python library that lets you schedule your Python code to be executed";
+    homepage = "https://pypi.python.org/pypi/APScheduler/";
+    license = licenses.mit;
+  };
+}
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..1074d2eef48c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/Babel/default.nix
@@ -0,0 +1,45 @@
+{ stdenv, lib, buildPythonPackage, fetchPypi, fetchpatch, pytz, pytest, freezegun, glibcLocales }:
+
+buildPythonPackage rec {
+  pname = "Babel";
+  version = "2.7.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "e86135ae101e31e2c8ec20a4e0c5220f4eed12487d5cf3f78be7e98d3a57fc28";
+  };
+
+  patches = [
+    # The following 2 patches fix the test suite failing on nix < 2.3 with
+    # Python < 3 because those nix versions do not run in a pseudoterminal,
+    # which makes Python 2 not set the default encoding to UTF-8, and the
+    # Babel code crashes when printing a warning in that case.
+    # See #75676 and https://github.com/python-babel/babel/pull/691.
+    # It is important to fix this because otherwise Babel is not buildable
+    # with older nix versions (e.g. on machines used as --builders).
+    # TODO: Remove at release > 2.8.0.
+    (fetchpatch {
+      name = "Babel-Introduce-invariant-that-invalid_pofile-takes-unicode-line.patch";
+      url = "https://github.com/python-babel/babel/commit/f4f6653e6aa053724d2c6dc0ee71dcb928013352.patch";
+      sha256 = "1kyknwn9blspcf9yxmgdiaxdii1dnkblyhcflqwhxyl1mss1dxv5";
+    })
+    (fetchpatch {
+      name = "Babel-Fix-unicode-printing-error-on-Python-2-without-TTY.patch";
+      url = "https://github.com/python-babel/babel/commit/da7f31143847659b6b74d802618b03438aceb350.patch";
+      sha256 = "09yny8614knr8ngrrddmqzkxk70am135rccv2ncc6dji4xbqbfln";
+    })
+  ];
+
+  propagatedBuildInputs = [ pytz ];
+
+  checkInputs = [ pytest freezegun ];
+
+  doCheck = !stdenv.isDarwin;
+
+  meta = with lib; {
+    homepage = "http://babel.edgewall.org";
+    description = "A collection of tools for internationalizing Python applications";
+    license = licenses.bsd3;
+    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..64f5bb3ab656
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/Cython/default.nix
@@ -0,0 +1,75 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, python
+, glibcLocales
+, 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.21";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1bcwpra7c6k30yvic3sw2v3rq2dr40ypc4zqif6kr52mpn4wnyp5";
+  };
+
+  nativeBuildInputs = [
+    pkg-config
+  ];
+  checkInputs = [
+    numpy ncurses
+  ];
+  buildInputs = [ glibcLocales gdb ];
+  LC_ALL = "en_US.UTF-8";
+
+  patches = [
+    # https://github.com/cython/cython/issues/2752, needed by sage (https://trac.sagemath.org/ticket/26855) and up to be included in 0.30
+    (fetchpatch {
+      name = "non-int-conversion-to-pyhash.patch";
+      url = "https://github.com/cython/cython/commit/28251032f86c266065e4976080230481b1a1bb29.patch";
+      sha256 = "19rg7xs8gr90k3ya5c634bs8gww1sxyhdavv07cyd2k71afr83gy";
+    })
+  ];
+
+  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..1025ed6a05ee
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/Fabric/default.nix
@@ -0,0 +1,36 @@
+{ lib, buildPythonPackage, fetchPypi
+, cryptography
+, invoke
+, mock
+, paramiko
+, pytest
+, pytest-relaxed
+}:
+
+buildPythonPackage rec {
+  pname = "fabric";
+  version = "2.5.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "19nzdibjfndzcwvby20p59igqwyzw7skrb45v2mxqsjma5yjv114";
+  };
+
+  propagatedBuildInputs = [ invoke paramiko cryptography ];
+  checkInputs = [ pytest mock pytest-relaxed ];
+
+  # requires pytest_relaxed, which doesnt have official support for pytest>=5
+  # https://github.com/bitprophet/pytest-relaxed/issues/12
+  doCheck = false;
+  checkPhase = ''
+    pytest tests
+  '';
+  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..2b06fcdce7d2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/FormEncode/default.nix
@@ -0,0 +1,34 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, dnspython, pycountry, nose, setuptools_scm, six, isPy27 }:
+
+buildPythonPackage rec {
+  pname = "FormEncode";
+  version = "2.0.0";
+
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "049pm276140h30xgzwylhpii24xcln1qfdlfmbj69sqpfhlr5szj";
+  };
+
+  postPatch = ''
+    sed -i 's/setuptools_scm_git_archive//' setup.py
+    sed -i 's/use_scm_version=.*,/version="${version}",/' setup.py
+  '';
+
+  nativeBuildInputs = [ setuptools_scm ];
+  propagatedBuildInputs = [ six ];
+
+  checkInputs = [ dnspython pycountry nose ];
+
+  preCheck = ''
+    # requires dns resolving
+    sed -i 's/test_unicode_ascii_subgroup/noop/' formencode/tests/test_email.py
+  '';
+
+  meta = with lib; {
+    description = "FormEncode validates and converts nested structures";
+    homepage = "http://formencode.org";
+    license = licenses.mit;
+  };
+}
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..2edb8c51e3a0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/GitPython/default.nix
@@ -0,0 +1,32 @@
+{ lib, buildPythonPackage, fetchPypi, isPy27, substituteAll, git, gitdb, mock, nose, ddt }:
+
+buildPythonPackage rec {
+  version = "3.1.11";
+  pname = "GitPython";
+  disabled = isPy27; # no longer supported
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "befa4d101f91bad1b632df4308ec64555db684c360bd7d2130b4807d49ce86b8";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./hardcode-git-path.patch;
+      inherit git;
+    })
+  ];
+
+  checkInputs = [ nose ] ++ lib.optional isPy27 mock;
+  propagatedBuildInputs = [ gitdb ddt ];
+
+  # Tests require a git repo
+  doCheck = false;
+
+  meta = {
+    description = "Python Git Library";
+    maintainers = [ ];
+    homepage = "https://github.com/gitpython-developers/GitPython";
+    license = lib.licenses.bsd3;
+  };
+}
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/HAP-python/default.nix b/nixpkgs/pkgs/development/python-modules/HAP-python/default.nix
new file mode 100644
index 000000000000..3cd211db7559
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/HAP-python/default.nix
@@ -0,0 +1,47 @@
+{ lib, buildPythonPackage, fetchFromGitHub, isPy3k, curve25519-donna, ed25519
+, cryptography, ecdsa, zeroconf, pytestCheckHook }:
+
+buildPythonPackage rec {
+  pname = "HAP-python";
+  version = "3.1.0";
+
+  # pypi package does not include tests
+  src = fetchFromGitHub {
+    owner = "ikalchev";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1qg38lfjby2xfm09chzc40a7i3b84kgyfs7g4xq8f5m8s39hg6d7";
+  };
+
+  disabled = !isPy3k;
+
+  propagatedBuildInputs = [
+    curve25519-donna
+    ed25519
+    cryptography
+    ecdsa
+    zeroconf
+  ];
+
+  checkInputs = [ pytestCheckHook ];
+
+  disabledTests = [
+    #disable tests needing network
+    "test_persist"
+    "test_setup_endpoints"
+    "test_auto_add_aid_mac"
+    "test_service_callbacks"
+    "test_send_events"
+    "test_not_standalone_aid"
+    "test_start_stop_async_acc"
+    "test_external_zeroconf"
+    "test_start_stop_sync_acc"
+  ];
+
+  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/HTSeq/default.nix b/nixpkgs/pkgs/development/python-modules/HTSeq/default.nix
new file mode 100644
index 000000000000..be4bb9e31d32
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/HTSeq/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv, 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..f142c2459223
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/IPy/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv, 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..d7c199f71467
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/JPype1/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, pythonOlder
+, typing-extensions
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "JPype1";
+  version = "1.2.1";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f210646127d24be73cfc6d807e2cda1c6b2ab39b7a293008e8b46367af6f2204";
+  };
+
+  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/";
+    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..c129e411a473
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/Mako/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPyPy
+, markupsafe
+, mock
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "Mako";
+  version = "1.1.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "8195c8c1400ceb53496064314c6736719c6f25e7479cd24c77be3d9361cddc27";
+  };
+
+  propagatedBuildInputs = [ markupsafe ];
+  checkInputs = [ pytestCheckHook markupsafe mock ];
+
+  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/Markups/default.nix b/nixpkgs/pkgs/development/python-modules/Markups/default.nix
new file mode 100644
index 000000000000..eb802989a5c2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/Markups/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python-markdown-math
+, markdown
+, docutils
+, pygments
+}:
+
+buildPythonPackage rec {
+  pname = "Markups";
+  version = "3.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1ea19458dfca6a4562044e701aa8698089a0c659fc535689ed260f89a04f8d39";
+  };
+
+  checkInputs = [ markdown docutils pygments ];
+  propagatedBuildInputs = [ python-markdown-math ];
+
+  meta = {
+    description = "A wrapper around various text markup languages.";
+    homepage = "https://github.com/retext-project/pymarkups";
+    license = lib.licenses.bsd3;
+    maintainers = with lib.maintainers; [ klntsky ];
+  };
+}
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..e4ce48158f64
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/MechanicalSoup/default.nix
@@ -0,0 +1,33 @@
+{ fetchPypi, buildPythonPackage, lib
+, requests, beautifulsoup4, six, lxml
+, pytestrunner, requests-mock, pytestcov, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "MechanicalSoup";
+  version = "1.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "37d3b15c1957917d3ae171561e77f4dd4c08c35eb4500b8781f6e7e1bb6c4d07";
+  };
+
+  checkInputs = [ pytest pytestrunner requests-mock pytestcov ];
+
+  propagatedBuildInputs = [ lxml requests beautifulsoup4 six ];
+
+  # Requires network
+  doCheck = false;
+
+  postPatch = ''
+    # Is in setup_requires but not used in setup.py...
+    substituteInPlace setup.py --replace "'pytest-runner'" ""
+  '';
+
+  meta = with lib; {
+    description = "A Python library for automating interaction with websites";
+    homepage = "https://github.com/hickford/MechanicalSoup";
+    license = licenses.mit;
+    maintainers = [ maintainers.jgillich ];
+  };
+}
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..eeab02fcb75e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/Nikola/default.nix
@@ -0,0 +1,76 @@
+{ lib
+, buildPythonPackage
+, isPy3k
+, fetchPypi
+, doit
+, glibcLocales
+, pytest
+, pytestcov
+, mock
+, pygments
+, pillow
+, dateutil
+, docutils
+, Mako
+, unidecode
+, lxml
+, Yapsy
+, PyRSS2Gen
+, Logbook
+, blinker
+, natsort
+, requests
+, piexif
+, markdown
+, phpserialize
+, jinja2
+, Babel
+, freezegun
+, toml
+, notebook
+, ruamel_yaml
+, aiohttp
+, watchdog
+}:
+
+buildPythonPackage rec {
+  pname = "Nikola";
+  version = "8.1.2";
+
+  # Nix contains only Python 3 supported version of doit, which is a dependency
+  # of Nikola. Python 2 support would require older doit 0.29.0 (which on the
+  # other hand doesn't support Python 3.3). So, just disable Python 2.
+  disabled = !isPy3k;
+
+  checkInputs = [ pytest pytestcov mock glibcLocales freezegun ];
+
+  propagatedBuildInputs = [
+    # requirements.txt
+    doit pygments pillow dateutil docutils Mako markdown unidecode
+    lxml Yapsy PyRSS2Gen Logbook blinker natsort requests piexif Babel
+    # requirements-extras.txt
+    phpserialize jinja2 toml notebook ruamel_yaml aiohttp watchdog
+  ];
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "26f4fb1a2b0105cf0f71187c6c1eb54283767a883d1c8f4ca8c8039033217d27";
+  };
+
+  patchPhase = ''
+    # upstream added bound so that requires.io doesn't send mails about update
+    # nikola should work with markdown 3.0: https://github.com/getnikola/nikola/pull/3175#issue-220147596
+    sed -i 's/Markdown>.*/Markdown/' requirements.txt
+  '';
+
+  checkPhase = ''
+    LANG="en_US.UTF-8" LC_ALL="en_US.UTF-8" py.test .
+  '';
+
+  meta = {
+    homepage = "https://getnikola.com/";
+    description = "A modular, fast, simple, static website and blog generator";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ jluttine ];
+  };
+}
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..9dfb8de3b2c6
--- /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.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "080iml3868nxniyn56kcwnbghm10j7fw74a5nj0s19sm4zsji78b";
+  };
+
+  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/PyLD/default.nix b/nixpkgs/pkgs/development/python-modules/PyLD/default.nix
new file mode 100644
index 000000000000..247b7f0332f5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/PyLD/default.nix
@@ -0,0 +1,57 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub, python, requests, gnugrep }:
+
+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=$(${gnugrep}/bin/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/PyRMVtransport/default.nix b/nixpkgs/pkgs/development/python-modules/PyRMVtransport/default.nix
new file mode 100644
index 000000000000..86fb75f14548
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/PyRMVtransport/default.nix
@@ -0,0 +1,51 @@
+{ lib, buildPythonPackage, fetchFromGitHub
+, flit
+, lxml, httpx
+, pytest, pytestcov, pytest-asyncio, pytest-mock, aresponses
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "PyRMVtransport";
+  version = "0.2.10";
+  format = "pyproject";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "cgtobi";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "03qrylidb1d6zw6a22d1drdf73cvfxqcqaa8qi8x4pli1axcfh5w";
+  };
+
+  nativeBuildInputs = [
+    flit
+  ];
+
+  propagatedBuildInputs = [
+    httpx
+    lxml
+  ];
+
+  # requires pytest-httpx
+  doCheck = false;
+
+  checkInputs = [
+    pytest
+    pytestcov
+    pytest-asyncio
+    pytest-mock
+    # pytest-httpx is missing
+    aresponses
+  ];
+  checkPhase = ''
+    pytest --cov=RMVtransport tests
+  '';
+
+  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/Pygments/2_5.nix b/nixpkgs/pkgs/development/python-modules/Pygments/2_5.nix
new file mode 100644
index 000000000000..a0c40550c9a9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/Pygments/2_5.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, docutils
+}:
+
+buildPythonPackage rec {
+  pname = "Pygments";
+  version = "2.5.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "98c8aa5a9f778fcd1026a17361ddaf7330d1b7c62ae97c3bb0ae73e0b9b6b0fe";
+  };
+
+  propagatedBuildInputs = [ docutils ];
+
+  # Circular dependency with sphinx
+  doCheck = false;
+
+  meta = {
+    homepage = "https://pygments.org/";
+    description = "A generic syntax highlighter";
+    license = lib.licenses.bsd2;
+    maintainers = with lib.maintainers; [ ];
+  };
+}
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..02f39b3014d4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/Pygments/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, docutils
+}:
+
+buildPythonPackage rec {
+  pname = "Pygments";
+  version = "2.7.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "381985fcc551eb9d37c52088a32914e00517e57f4a21609f48141ba08e193fa0";
+  };
+
+  propagatedBuildInputs = [ docutils ];
+
+  # Circular dependency with sphinx
+  doCheck = false;
+
+  meta = {
+    homepage = "https://pygments.org/";
+    description = "A generic syntax highlighter";
+    license = lib.licenses.bsd2;
+    maintainers = with lib.maintainers; [ ];
+  };
+}
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..ebedb3c69693
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ROPGadget/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi
+, capstone}:
+
+buildPythonPackage rec {
+  pname = "ROPGadget";
+  version = "6.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "4c0e56f2ba0aef13b2c8ca286aad663525b92020b11bacd16791f5236247905c";
+  };
+
+  propagatedBuildInputs = [ capstone ];
+
+  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/Rtree/default.nix b/nixpkgs/pkgs/development/python-modules/Rtree/default.nix
new file mode 100644
index 000000000000..82c8ced9704b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/Rtree/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, libspatialindex, numpy }:
+
+buildPythonPackage rec {
+  pname = "Rtree";
+  version = "0.9.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0i1zlyz6vczy3cgg7fan5hq9zzjm7s7zdzfh83ma8g9vq3i2gqya";
+  };
+
+  propagatedBuildInputs = [ libspatialindex ];
+
+  patchPhase = ''
+    substituteInPlace rtree/core.py --replace \
+      "find_library('spatialindex_c')" "'${libspatialindex}/lib/libspatialindex_c${stdenv.hostPlatform.extensions.sharedLibrary}'"
+  '';
+
+  # Tests appear to be broken due to mysterious memory unsafe issues. See #36760
+  doCheck = false;
+  checkInputs = [ numpy ];
+
+  meta = with lib; {
+    description = "R-Tree spatial index for Python GIS";
+    homepage = "https://toblerity.org/rtree/";
+    license = licenses.lgpl21;
+    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..e279100e9cc6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/Theano/default.nix
@@ -0,0 +1,94 @@
+{ lib, stdenv
+, runCommandCC
+, fetchPypi
+, buildPythonPackage
+, isPyPy
+, pythonOlder
+, isPy3k
+, nose
+, numpy
+, scipy
+, six
+, libgpuarray
+, cudaSupport ? false, cudatoolkit
+, cudnnSupport ? false, cudnn
+, nvidia_x11
+}:
+
+assert cudnnSupport -> cudaSupport;
+
+assert cudaSupport -> nvidia_x11 != null
+                   && cudatoolkit != null
+                   && cudnn != null;
+
+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 );
+
+  libgpuarray_ = libgpuarray.override { inherit cudaSupport cudatoolkit; };
+
+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 ];
+  propagatedBuildInputs = [ numpy numpy.blas scipy six libgpuarray_ ];
+
+  pythonImportsCheck = [ "theano" ];
+
+  meta = with lib; {
+    homepage = "http://deeplearning.net/software/theano/";
+    description = "A Python library for large-scale array computation";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ maintainers.bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/TurboCheetah/default.nix b/nixpkgs/pkgs/development/python-modules/TurboCheetah/default.nix
new file mode 100644
index 000000000000..717b2b5f2780
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/TurboCheetah/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, cheetah
+, nose
+}:
+
+buildPythonPackage rec {
+  pname = "TurboCheetah";
+  version = "1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "9e4c7ecb0d061bfb58281363ee1b09337083f013a8b4d0355326a5d8668f450c";
+  };
+
+  propagatedBuildInputs = [ cheetah ];
+
+  checkInputs = [ nose ];
+
+  meta = {
+    description = "TurboGears plugin to support use of Cheetah templates";
+    homepage = "http://docs.turbogears.org/TurboCheetah";
+    license = lib.licenses.mit;
+  };
+}
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..50e90ded7622
--- /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.10.0";
+
+  disabled = pythonAtLeast "3.9";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "965b9ce48161e5c50d84aedcf50dca698f05bf07e9d489201bccaec3141cd304";
+  };
+
+  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..d7ad28c01336
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/Wand/default.nix
@@ -0,0 +1,33 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, imagemagick7Big
+}:
+
+buildPythonPackage rec {
+  pname = "Wand";
+  version = "0.6.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ec981b4f07f7582fc564aba8b57763a549392e9ef8b6a338e9da54cdd229cf95";
+  };
+
+  postPatch = ''
+    substituteInPlace wand/api.py --replace \
+      "magick_home = os.environ.get('MAGICK_HOME')" \
+      "magick_home = '${imagemagick7Big}'"
+  '';
+
+  # tests not included with pypi release
+  doCheck = false;
+
+  passthru.imagemagick = imagemagick7Big;
+
+  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/WazeRouteCalculator/default.nix b/nixpkgs/pkgs/development/python-modules/WazeRouteCalculator/default.nix
new file mode 100644
index 000000000000..28515e6f6028
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/WazeRouteCalculator/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi
+, requests }:
+
+buildPythonPackage rec {
+  pname = "WazeRouteCalculator";
+  version = "0.12";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "889fe753a530b258bd23def65616666d32c48d93ad8ed211dadf2ed9afcec65b";
+  };
+
+  propagatedBuildInputs = [ requests ];
+
+  # there are no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Calculate actual route time and distance with Waze API";
+    homepage = "https://github.com/kovacsbalu/WazeRouteCalculator";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ peterhoeg ];
+  };
+}
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..15bd1ee35fec
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/XlsxWriter/default.nix
@@ -0,0 +1,24 @@
+{lib, buildPythonPackage, fetchFromGitHub}:
+
+buildPythonPackage rec {
+
+  pname = "XlsxWriter";
+  version = "1.2.9";
+
+  # PyPI release tarball doesn't contain tests so let's use GitHub. See:
+  # https://github.com/jmcnamara/XlsxWriter/issues/327
+  src = fetchFromGitHub{
+    owner = "jmcnamara";
+    repo = pname;
+    rev = "RELEASE_${version}";
+    sha256 = "08pdca5ssi50bx2xz52gkmjix2ybv5i4bjw7yd6yfiph0y0qsbsb";
+  };
+
+  meta = {
+    description = "A Python module for creating Excel XLSX files";
+    homepage = "https://xlsxwriter.readthedocs.io/";
+    maintainers = with lib.maintainers; [ jluttine ];
+    license = lib.licenses.bsd2;
+  };
+
+}
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..cf6976fa6c1e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aadict/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv
+, 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..5350443eeaab
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aafigure/default.nix
@@ -0,0 +1,31 @@
+{ lib, stdenv, 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/abodepy/default.nix b/nixpkgs/pkgs/development/python-modules/abodepy/default.nix
new file mode 100644
index 000000000000..e6ad75eb3896
--- /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.1";
+
+  disabled = !isPy3k;
+
+  src = fetchFromGitHub {
+    owner = "MisterWil";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0n8gczsml6y6anin1zi8j33sjk1bv9ka02zxpksn2fi1v1h0smap";
+  };
+
+  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..e70d830b7be0
--- /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 = "0.11.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "673cccb88d810e5627d0c1c818158485d106f65a583880e2f730c997399bcfa7";
+  };
+
+  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; [ danharaj ];
+  };
+}
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..0d2cd2239b50
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/accupy/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, mpmath
+, numpy
+, pipdate
+, pybind11
+, pyfma
+, eigen
+, pytestCheckHook
+, matplotlib
+, isPy27
+}:
+
+buildPythonPackage rec {
+  pname = "accupy";
+  version = "0.3.3";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a234c9897a683a6ade44f0bafa71196f122a61e3ebeacb5b813e7d139d54f3c7";
+  };
+
+  buildInputs = [
+    pybind11 eigen
+  ];
+
+  propagatedBuildInputs = [
+    mpmath
+    numpy
+    pipdate
+    pyfma
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    matplotlib
+  ];
+
+  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..ed6dcb54377e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/accuweather/default.nix
@@ -0,0 +1,28 @@
+{ aiohttp, buildPythonPackage, fetchFromGitHub, lib, pytest, pytestCheckHook
+, pytestcov, pytestrunner, pytest-asyncio, python, pythonOlder }:
+
+buildPythonPackage rec {
+  pname = "accuweather";
+  version = "0.0.11";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "bieniu";
+    repo = pname;
+    rev = version;
+    sha256 = "1sgbw9yldf81phwx6pbvqg9sp767whxymyj0ca9pwx1r6ipr080h";
+  };
+
+  nativeBuildInputs = [ pytestrunner ];
+  propagatedBuildInputs = [ aiohttp ];
+  checkInputs = [ pytestCheckHook pytestcov pytest-asyncio ];
+
+  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..f8134aaf5b31
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/acebinf/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv
+, 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..75408244e66a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/acme-tiny/default.nix
@@ -0,0 +1,30 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, setuptools_scm, fusepy, fuse
+, openssl }:
+
+buildPythonPackage rec {
+  pname = "acme-tiny";
+  version = "4.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0jmg525n4n98hwy3hf303jbnq23z79sqwgliji9j7qcnph47gkgq";
+  };
+
+  patchPhase = ''
+    substituteInPlace acme_tiny.py --replace '"openssl"' '"${openssl.bin}/bin/openssl"'
+    substituteInPlace tests/monkey.py --replace '"openssl"' '"${openssl.bin}/bin/openssl"'
+    substituteInPlace tests/test_module.py --replace '"openssl"' '"${openssl.bin}/bin/openssl"'
+    substituteInPlace tests/monkey.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
+
+  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..e63a26e5f74f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/acme/default.nix
@@ -0,0 +1,36 @@
+{ buildPythonPackage
+, certbot
+, cryptography
+, pyasn1
+, pyopenssl
+, pyRFC3339
+, josepy
+, pytz
+, requests
+, requests-toolbelt
+, six
+, werkzeug
+, mock
+, ndg-httpsclient
+}:
+
+buildPythonPackage rec {
+  inherit (certbot) src version;
+
+  pname = "acme";
+
+  propagatedBuildInputs = [
+    cryptography pyasn1 pyopenssl pyRFC3339 pytz requests requests-toolbelt six
+    werkzeug mock 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..7b62c6791cb1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/acoustics/default.nix
@@ -0,0 +1,30 @@
+{ lib, buildPythonPackage, fetchPypi
+, pytest, numpy, scipy, matplotlib, pandas, tabulate, pythonOlder }:
+
+buildPythonPackage rec {
+  pname = "acoustics";
+  version = "0.2.4.post0";
+
+  checkInputs = [ pytest ];
+  propagatedBuildInputs = [ numpy scipy matplotlib pandas tabulate ];
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a162625e5e70ed830fab8fab0ddcfe35333cb390cd24b0a827bcefc5bbcae97d";
+  };
+
+  checkPhase = ''
+    pushd tests
+    py.test ./.
+    popd
+  '';
+
+  disabled = pythonOlder "3.6";
+
+  meta = with lib; {
+    description = "A 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..ca47018f56f4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/actdiag/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi
+, nose, docutils, blockdiag, reportlab }:
+
+buildPythonPackage rec {
+  pname = "actdiag";
+  version = "2.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0g51v9dmdq18z33v332f1f0cmb3hqgaga5minj0mc2sglark1s7h";
+  };
+
+  propagatedBuildInputs = [ blockdiag docutils ];
+
+  checkInputs = [ nose reportlab ];
+
+  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-platformdetect/default.nix b/nixpkgs/pkgs/development/python-modules/adafruit-platformdetect/default.nix
new file mode 100644
index 000000000000..f03d3fd64e7b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/adafruit-platformdetect/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "Adafruit-PlatformDetect";
+  version = "2.27.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0rnmy74rjjcyni5sr8h1djffpj7wngn2wqckl5vknp2smaihp34l";
+  };
+
+  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..36bafb0f7a07
--- /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.8";
+
+  src = fetchPypi {
+    pname = "Adafruit_PureIO";
+    inherit version;
+    sha256 = "1mfa6sfz7qwgajz3lqw0s69ivvwbwvblwkjzbrwdrxjbma4jaw66";
+  };
+
+  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..f7e973c8f693
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/adal/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi
+, requests, pyjwt, dateutil }:
+
+buildPythonPackage rec {
+  pname = "adal";
+  version = "1.2.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "8003ba03ef04170195b3eddda8a5ab43649ef2c5f0287023d515affb1ccfcfc3";
+  };
+
+  propagatedBuildInputs =  [ requests pyjwt dateutil ];
+
+  meta = with lib; {
+    description = "Library to make it easy for python application 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; [ phreedom ];
+  };
+}
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..9cd3fe362334
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/adb-shell/default.nix
@@ -0,0 +1,32 @@
+{ aiofiles, buildPythonPackage, cryptography, fetchFromGitHub, isPy3k, lib
+, libusb1, mock, pyasn1, python, pycryptodome, rsa }:
+
+buildPythonPackage rec {
+  pname = "adb-shell";
+  version = "0.3.0";
+
+  disabled = !isPy3k;
+
+  # pypi does not contain tests, using github sources instead
+  src = fetchFromGitHub {
+    owner = "JeffLIrion";
+    repo = "adb_shell";
+    rev = "v${version}";
+    sha256 = "0qnlhcd58zxh39cd5xzdx8yc5hc0pf8kix4rbn4avsapwb0l75n2";
+  };
+
+  propagatedBuildInputs = [ aiofiles cryptography libusb1 pyasn1 rsa ];
+
+  checkInputs = [ mock pycryptodome ];
+  checkPhase = ''
+    ${python.interpreter} -m unittest discover -s tests -t .
+  '';
+
+  meta = with lib; {
+    description =
+      "A 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..de6d72a61ecf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/adblock/default.nix
@@ -0,0 +1,63 @@
+{ stdenv
+, lib
+, rustPlatform
+, fetchFromGitHub
+, pipInstallHook
+, pythonImportsCheckHook
+, maturin
+, pkg-config
+, openssl
+, publicsuffix-list
+, isPy27
+, CoreFoundation
+, Security
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "adblock";
+  version = "0.4.0";
+  disabled = isPy27;
+
+  # Pypi only has binary releases
+  src = fetchFromGitHub {
+    owner = "ArniDagur";
+    repo = "python-adblock";
+    rev = version;
+    sha256 = "10d6ks2fyzbizq3kb69q478idj0h86k6ygjb6wl3zq3mf65ma4zg";
+  };
+  format = "pyproject";
+
+  cargoSha256 = "0di05j942rrm2crpdpp9czhh65fmidyrvdp2n3pipgnagy7nchc0";
+
+  nativeBuildInputs = [ pipInstallHook maturin pkg-config pythonImportsCheckHook ];
+
+  buildInputs = [ openssl ]
+    ++ lib.optionals stdenv.isDarwin [ CoreFoundation Security ];
+
+  PSL_PATH = "${publicsuffix-list}/share/publicsuffix/public_suffix_list.dat";
+
+  buildPhase = ''
+    runHook preBuild
+    maturin build --release --manylinux off --strip
+    runHook postBuild
+  '';
+
+  # There are no rust tests
+  doCheck = false;
+  pythonImportsCheck = [ "adblock" ];
+
+  installPhase = ''
+    runHook preInstall
+    install -Dm644 -t dist target/wheels/*.whl
+    pipInstallPhase
+    runHook postInstall
+  '';
+
+  passthru.meta = with lib; {
+    description = "Python wrapper for Brave's adblocking library, which is written in Rust";
+    homepage = "https://github.com/ArniDagur/python-adblock/";
+    maintainers = with maintainers; [ petabyteboy ];
+    license = with licenses; [ asl20 mit ];
+    platforms = with platforms; [ all ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/addic7ed-cli/default.nix b/nixpkgs/pkgs/development/python-modules/addic7ed-cli/default.nix
new file mode 100644
index 000000000000..bdf6aab3dbfc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/addic7ed-cli/default.nix
@@ -0,0 +1,24 @@
+{ lib, python3Packages, }:
+
+python3Packages.buildPythonApplication rec {
+  pname = "addic7ed-cli";
+  version = "1.4.6";
+
+  src = python3Packages.fetchPypi {
+    inherit pname version;
+    sha256 = "182cpwxpdybsgl1nps850ysvvjbqlnx149kri4hxhgm58nqq0qf5";
+  };
+
+  propagatedBuildInputs = with python3Packages; [
+    requests
+    pyquery
+  ];
+
+  meta = with lib; {
+    description = "A commandline access to addic7ed subtitles";
+    homepage = "https://github.com/BenoitZugmeyer/addic7ed-cli";
+    license = licenses.mit;
+    maintainers = with maintainers; [ aethelz ];
+    platforms = platforms.unix;
+  };
+}
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..f3818c93188b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/adext/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, alarmdecoder
+}:
+
+buildPythonPackage rec {
+  pname = "adext";
+  version = "0.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "184qxw6i5ixnhgkjnby4zwn4jg90mxb8xy9vbg80x5w331p4z50f";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "alarmdecoder==1.13.2" "alarmdecoder>=1.13.2"
+  '';
+
+  propagatedBuildInputs = [ alarmdecoder ];
+
+  # Tests are not published yet
+  doCheck = false;
+  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..b3cbfd212ba6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/adguardhome/default.nix
@@ -0,0 +1,26 @@
+{ aiohttp, aresponses, buildPythonPackage, fetchFromGitHub, isPy3k, lib
+, pytest-asyncio, pytestCheckHook, yarl }:
+
+buildPythonPackage rec {
+  pname = "adguardhome";
+  version = "0.4.2";
+
+  disabled = !isPy3k;
+
+  src = fetchFromGitHub {
+    owner = "frenck";
+    repo = "python-${pname}";
+    rev = "v${version}";
+    sha256 = "0lcf3yg27amrnqvgn5nw4jn2j0vj4yfmyl5p5yncmn7dh6bdbsp8";
+  };
+
+  propagatedBuildInputs = [ aiohttp yarl ];
+  checkInputs = [ aresponses pytest-asyncio pytestCheckHook ];
+
+  meta = with lib; {
+    description = "Asynchronous 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/advantage-air/default.nix b/nixpkgs/pkgs/development/python-modules/advantage-air/default.nix
new file mode 100644
index 000000000000..4d6d91c5716d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/advantage-air/default.nix
@@ -0,0 +1,26 @@
+{ aiohttp, buildPythonPackage, fetchPypi, lib, pythonOlder }:
+
+buildPythonPackage rec {
+  pname = "advantage_air";
+  version = "0.2.2";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit version pname;
+    sha256 = "04q2sjw9r50c00m4sfv98w9cwmmr970830c97m32p5j8ijb10j5x";
+  };
+
+  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/aenum/default.nix b/nixpkgs/pkgs/development/python-modules/aenum/default.nix
new file mode 100644
index 000000000000..f21d8f4195a4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aenum/default.nix
@@ -0,0 +1,31 @@
+{ lib, stdenv, fetchPypi, buildPythonPackage, python, isPy3k, glibcLocales }:
+
+buildPythonPackage rec {
+  pname = "aenum";
+  version = "2.2.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "260225470b49429f5893a195a8b99c73a8d182be42bf90c37c93e7b20e44eaae";
+  };
+
+  # For Python 3, locale has to be set to en_US.UTF-8 for
+  # tests to pass
+  checkInputs = if isPy3k then [ glibcLocales ] else [];
+
+  # py2 likes to reorder tests
+  doCheck = isPy3k;
+  checkPhase = ''
+  runHook preCheck
+  ${if isPy3k then "export LC_ALL=en_US.UTF-8" else ""}
+  PYTHONPATH=`pwd` ${python.interpreter} aenum/test.py
+  runHook postCheck
+  '';
+
+  meta = with lib; {
+    description = "Advanced Enumerations (compatible with Python's stdlib Enum), NamedTuples, and NamedConstants";
+    maintainers = with maintainers; [ vrthra ];
+    license = licenses.bsd3;
+    homepage = "https://github.com/ethanfurman/aenum";
+  };
+}
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..4df6c5f6c493
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/afdko/default.nix
@@ -0,0 +1,74 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, fetchpatch, pythonOlder, python
+, fonttools, defcon, lxml, fs, unicodedata2, zopfli, brotlipy, fontpens
+, brotli, fontmath, mutatormath, booleanoperations
+, ufoprocessor, ufonormalizer, psautohint, tqdm
+, setuptools_scm
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "afdko";
+  version = "3.5.1";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1qg7dgl81yq0sp50pkhgvmf8az1svx20zmpkfa68ka9d0ssh1wjw";
+  };
+
+  # Skip date-dependent test. See
+  # https://github.com/adobe-type-tools/afdko/pull/1232
+  # https://github.com/NixOS/nixpkgs/pull/98158#issuecomment-704321117
+  patches = [
+    (fetchpatch {
+      url = "https://github.com/adobe-type-tools/afdko/commit/2c36ad10f9d964759f643e8ed7b0972a27aa26bd.patch";
+      sha256 = "0p6a485mmzrbfldfbhgfghsypfiad3cabcw7qlw2rh993ivpnibf";
+    })
+  ];
+
+  nativeBuildInputs = [ setuptools_scm ];
+
+  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
+  ];
+
+  # tests are broken on non x86_64
+  # https://github.com/adobe-type-tools/afdko/issues/1163
+  # https://github.com/adobe-type-tools/afdko/issues/1216
+  doCheck = stdenv.isx86_64;
+  checkInputs = [ pytestCheckHook ];
+  preCheck = "export PATH=$PATH:$out/bin";
+  disabledTests = [
+    # Disable slow tests, reduces test time ~25 %
+    "test_report"
+    "test_post_overflow"
+    "test_cjk"
+    "test_extrapolate"
+    "test_filename_without_dir"
+    "test_overwrite"
+    "test_options"
+  ];
+
+  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/affine/default.nix b/nixpkgs/pkgs/development/python-modules/affine/default.nix
new file mode 100644
index 000000000000..89062cde4d97
--- /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.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "00jil4q3b17qml6azim7s7zar6qb1vhsf0g888y637m23bpms11f";
+  };
+
+  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/affinity/default.nix b/nixpkgs/pkgs/development/python-modules/affinity/default.nix
new file mode 100644
index 000000000000..c6eb9543024b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/affinity/default.nix
@@ -0,0 +1,20 @@
+{ lib, buildPythonPackage, fetchPypi, isPy3k }:
+
+buildPythonPackage rec {
+  pname = "affinity";
+  version = "0.1.0";
+
+  # syntax error
+  disabled = isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1i6j7kszvnzh5vh9k48cqwx2kzf73a6abgv9s6bf0j2zmfjl2wb6";
+  };
+
+  meta = {
+    description = "control processor affinity on windows and linux";
+    homepage    = "http://cheeseshop.python.org/pypi/affinity";
+    license     = with lib.licenses; [ psfl ];
+  };
+}
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..099fb1701cb4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/agate-dbf/default.nix
@@ -0,0 +1,20 @@
+{ lib, stdenv, 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..af98bbded8c4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/agate-excel/default.nix
@@ -0,0 +1,28 @@
+{ lib, fetchPypi, buildPythonPackage
+, agate, openpyxl, xlrd, nose
+}:
+
+buildPythonPackage rec {
+  pname = "agate-excel";
+  version = "0.2.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "8f255ef2c87c436b7132049e1dd86c8e08bf82d8c773aea86f3069b461a17d52";
+  };
+
+  propagatedBuildInputs = [ agate openpyxl xlrd ];
+
+  checkInputs = [ nose ];
+
+  checkPhase = ''
+    nosetests
+  '';
+
+  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..566951ea71d1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/agate-sql/default.nix
@@ -0,0 +1,20 @@
+{ lib, stdenv, fetchPypi, buildPythonPackage, agate, sqlalchemy, crate }:
+
+buildPythonPackage rec {
+    pname = "agate-sql";
+    version = "0.5.5";
+
+    src = fetchPypi {
+      inherit pname version;
+      sha256 = "50a39754babef6cd0d1b1e75763324a49593394fe46ab1ea9546791b5e6b69a7";
+    };
+
+    propagatedBuildInputs = [ agate sqlalchemy crate ];
+
+    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..a2b622dd2116
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/agate/default.nix
@@ -0,0 +1,37 @@
+{ lib, fetchFromGitHub, buildPythonPackage, isPy3k
+, six, pytimeparse, parsedatetime, Babel
+, isodate, python-slugify, leather
+, glibcLocales, nose, lxml, cssselect, unittest2 }:
+
+buildPythonPackage rec {
+  pname = "agate";
+  version = "1.6.1";
+
+  # PyPI tarball does not include all test files
+  # https://github.com/wireservice/agate/pull/716
+  src = fetchFromGitHub {
+    owner = "wireservice";
+    repo = pname;
+    rev = version;
+    sha256 = "077zj8xad8hsa3nqywvf7ircirmx3krxdipl8wr3dynv3l3khcpl";
+  };
+
+  propagatedBuildInputs = [
+    six pytimeparse parsedatetime Babel
+    isodate python-slugify leather
+  ];
+
+  checkInputs = [ glibcLocales nose lxml cssselect ]
+    ++ lib.optional (!isPy3k) unittest2;
+
+  checkPhase = ''
+    LC_ALL="en_US.UTF-8" nosetests tests
+  '';
+
+  meta = with lib; {
+    description = "A 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/aioamqp/default.nix b/nixpkgs/pkgs/development/python-modules/aioamqp/default.nix
new file mode 100644
index 000000000000..5be5b6a1dd08
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioamqp/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pamqp
+, pytest
+, asynctest
+, pyrabbit2
+, isPy27
+}:
+
+buildPythonPackage rec {
+  pname = "aioamqp";
+  version = "0.14.0";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "Polyconseil";
+    repo = pname;
+    rev = "${pname}-${version}";
+    sha256 = "1gpfsrc2vi6w33c9zsycd2qn589pr7a222rb41r85m915283zy48";
+  };
+
+  propagatedBuildInputs = [
+    pamqp
+  ];
+
+  checkInputs = [
+    pytest
+    asynctest
+    pyrabbit2
+  ];
+
+  # tests assume rabbitmq server running
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/polyconseil/aioamqp";
+    description = "AMQP implementation using asyncio";
+    license = licenses.bsd3;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..308219865393
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiobotocore/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, pytestrunner
+, typing-extensions
+, wrapt
+, aioitertools
+, aiohttp
+, botocore
+}:
+
+buildPythonPackage rec {
+  pname = "aiobotocore";
+  version = "1.1.2";
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1fn9hgcg3qr9f7srjxc21bzkiix4al9308531slwlm99r0x3xcjl";
+  };
+
+  # relax version constraints: aiobotocore works with newer botocore versions
+  # the pinning used to match some `extras_require` we're not using.
+  preConfigure = ''
+    substituteInPlace setup.py --replace 'botocore>=1.17.44,<1.17.45' 'botocore'
+  '';
+
+  propagatedBuildInputs = [ wrapt aiohttp aioitertools botocore ];
+
+  # tests not distributed on pypi
+  doCheck = false;
+  pythonImportsCheck = [ "aiobotocore" ];
+
+  meta = with lib; {
+    description = "Async client for amazon services using botocore and aiohttp/asyncio.";
+    license = licenses.asl20;
+    homepage = "https://github.com/aio-libs/aiobotocore";
+    maintainers = with maintainers; [ teh ];
+  };
+}
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..c198676e3eb0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioconsole/default.nix
@@ -0,0 +1,30 @@
+{ lib, buildPythonPackage, fetchPypi, 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.3.1";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "7c038bb40b7690bf5be6b17154830b7bff25e7be1c02d8420a346c3efbd5d8e5";
+  };
+
+  # hardcodes a test dependency on an old version of pytest-asyncio
+  doCheck = false;
+
+  meta = {
+    description = "Asynchronous console and interfaces for asyncio";
+    homepage = "https://github.com/vxgmichel/aioconsole";
+    license = lib.licenses.gpl3;
+    maintainers = [ lib.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..728f2b5fa61a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiocontextvars/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestrunner
+, 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 = [
+    pytestrunner
+  ];
+
+  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/aiodns/default.nix b/nixpkgs/pkgs/development/python-modules/aiodns/default.nix
new file mode 100644
index 000000000000..4ba4bd59af27
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiodns/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, pythonOlder
+, isPy27, isPyPy, python, pycares, typing, trollius }:
+
+buildPythonPackage rec {
+  pname = "aiodns";
+  version = "2.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "815fdef4607474295d68da46978a54481dd1e7be153c7d60f9e72773cd38d77d";
+  };
+
+  propagatedBuildInputs = [ pycares ]
+    ++ lib.optional (pythonOlder "3.7") typing
+    ++ lib.optional (isPy27 || isPyPy) trollius;
+
+  checkPhase = ''
+    ${python.interpreter} tests.py
+  '';
+
+  # 'Could not contact DNS servers'
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/saghul/aiodns";
+    license = licenses.mit;
+    description = "Simple DNS resolver for asyncio";
+  };
+}
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..be91e0e95575
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioeafm/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, aiohttp
+, async-timeout
+, 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/aioesphomeapi/default.nix b/nixpkgs/pkgs/development/python-modules/aioesphomeapi/default.nix
new file mode 100644
index 000000000000..03f1ed91cfd8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioesphomeapi/default.nix
@@ -0,0 +1,27 @@
+{ lib, buildPythonPackage, fetchPypi, isPy3k, attrs, protobuf, zeroconf }:
+
+buildPythonPackage rec {
+  pname = "aioesphomeapi";
+  version = "2.6.4";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d8def7a909c0471479e1d8b0965de6bb7644b8de315d6e578f9d848b8a6812d0";
+  };
+
+  propagatedBuildInputs = [ attrs protobuf zeroconf ];
+
+  # no tests implemented
+  doCheck = false;
+
+  pythonImportsCheck = [ "aioesphomeapi" ];
+
+  meta = with lib; {
+    description = "Python Client for ESPHome native API";
+    homepage = "https://github.com/esphome/aioesphomeapi";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aioeventlet/default.nix b/nixpkgs/pkgs/development/python-modules/aioeventlet/default.nix
new file mode 100644
index 000000000000..4bdd2b1327cd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioeventlet/default.nix
@@ -0,0 +1,35 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, eventlet
+, trollius
+, mock
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "aioeventlet";
+  # version is called 0.5.1 on PyPI, but the filename is aioeventlet-0.5.2.tar.gz
+  version = "0.5.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "cecb51ea220209e33b53cfb95124d90e4fcbee3ff8ba8a179a57120b8624b16a";
+  };
+
+  propagatedBuildInputs = [ eventlet trollius ];
+  buildInputs = [ mock ];
+
+  # 2 tests error out
+  doCheck = false;
+  checkPhase = ''
+    ${python.interpreter} runtests.py
+  '';
+
+  meta = with lib; {
+    description = "aioeventlet implements the asyncio API (PEP 3156) on top of eventlet. It makes";
+    homepage = "https://pypi.org/project/aioeventlet/";
+    license = licenses.asl20;
+  };
+
+}
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..3fee1af2f176
--- /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 = "20.11.1621472";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "abfb2a27590f20b04808192e6c9c5f93298656c013546850c4505b5070a8cc82";
+  };
+
+  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..fd77a5587885
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiofiles/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aiofiles";
+  version = "0.6.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "e0281b157d3d5d59d803e3f4557dcc9a3dff28a4dd4829a9ff478adae50ca092";
+  };
+
+  disabled = pythonOlder "3.3";
+
+  # No tests in archive
+  doCheck = false;
+
+  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..60288178def5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioflo/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, aiohttp
+, aresponses
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytest-aiohttp
+, pytest-asyncio
+, pytest-cov
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "aioflo";
+  version = "0.4.2";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "bachya";
+    repo = pname;
+    rev = version;
+    sha256 = "1ppsinmjph6snj7s4hg28p3qa67kpkadc98ikjjg6w65vcm3dlaz";
+  };
+
+  nativeBuildInputs = [ poetry-core ];
+
+  propagatedBuildInputs = [ aiohttp ];
+
+  checkInputs = [
+    aresponses
+    pytest-aiohttp
+    pytest-asyncio
+    pytest-cov
+    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..e3ca13859acc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioftp/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, pytest
+, pytest-asyncio
+, pytestcov
+, trustme
+, async-timeout
+}:
+
+buildPythonPackage rec {
+  pname = "aioftp";
+  version = "0.18.1";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b5a412c748722dd679c4c2e30dd40d70a7c8879636f6eb4489fdbca72965b125";
+  };
+
+  checkInputs = [
+    pytest
+    pytest-asyncio
+    pytestcov
+    trustme
+    async-timeout
+  ];
+
+  doCheck = false; # requires siosocks, not packaged yet
+  checkPhase = ''
+    pytest
+  '';
+
+  pythonImportsCheck = [ "aioftp" ];
+
+  meta = with lib; {
+    description = "Ftp client/server for asyncio";
+    homepage = "https://github.com/aio-libs/aioftp";
+    license = licenses.asl20;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..f6822ede08cd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioguardian/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, aiohttp
+, async-timeout
+, asyncio-dgram
+, asynctest
+, buildPythonPackage
+, cryptography
+, fetchFromGitHub
+, poetry
+, pytest-aiohttp
+, pytest-asyncio
+, pytestCheckHook
+, pythonAtLeast
+, voluptuous
+}:
+
+buildPythonPackage rec {
+  pname = "aioguardian";
+  version = "1.0.4";
+  disabled = pythonAtLeast "3.9";
+
+  src = fetchFromGitHub {
+    owner = "bachya";
+    repo = pname;
+    rev = version;
+    sha256 = "1cbxcsxh9c8r2zx3lsjdns26sm2qmlwnqgah2sfzbgp1lay23vvq";
+  };
+
+  format = "pyproject";
+
+  nativeBuildInputs = [ poetry ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    async-timeout
+    asyncio-dgram
+    voluptuous
+  ];
+
+  checkInputs = [
+    asyncio-dgram
+    asynctest
+    pytest-aiohttp
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  # Ignore the examples as they are prefixed with test_
+  pytestFlagsArray = [ "--ignore 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/aioh2/default.nix b/nixpkgs/pkgs/development/python-modules/aioh2/default.nix
new file mode 100644
index 000000000000..1ae997c60e8c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioh2/default.nix
@@ -0,0 +1,24 @@
+{ lib, buildPythonPackage, isPy3k, fetchPypi, h2, priority }:
+
+buildPythonPackage rec {
+  pname = "aioh2";
+  version = "0.2.2";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "03i24wzpw0mrnrpck3w6qy83iigwl7n99sdrndqzxfyrc69b99wd";
+  };
+
+  propagatedBuildInputs = [ h2 priority ];
+
+  doCheck = false; # https://github.com/decentfox/aioh2/issues/17
+
+  meta = with lib; {
+    homepage = "https://github.com/decentfox/aioh2";
+    description = "HTTP/2 implementation with hyper-h2 on Python 3 asyncio";
+    license = licenses.bsd3;
+    maintainers = [ maintainers.qyliss ];
+    broken = true; # requires h2<4
+  };
+}
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..0b6c68de8b4c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioharmony/default.nix
@@ -0,0 +1,28 @@
+{ lib, buildPythonPackage, fetchPypi, isPy3k, slixmpp, async-timeout, aiohttp }:
+
+buildPythonPackage rec {
+  pname = "aioharmony";
+  version = "0.2.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "90f4d1220d44b48b21a57e0273aa3c4a51599d0097af88e8be26df151e599344";
+  };
+
+  disabled = !isPy3k;
+
+  #aioharmony does not seem to include tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "aioharmony.harmonyapi" "aioharmony.harmonyclient" ];
+
+  propagatedBuildInputs = [ slixmpp async-timeout aiohttp ];
+
+  meta = with lib; {
+    homepage = "https://github.com/ehendrix23/aioharmony";
+    description =
+      "Asyncio Python library for connecting to and controlling the Logitech Harmony";
+    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..5a51f66b16a0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiohomekit/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, cryptography
+, fetchFromGitHub
+, poetry
+, pytest-aiohttp
+, pytestCheckHook
+, pythonAtLeast
+, zeroconf
+}:
+
+buildPythonPackage rec {
+  pname = "aiohomekit";
+  version = "0.2.60";
+  format = "pyproject";
+  disabled = pythonAtLeast "3.9";
+
+  src = fetchFromGitHub {
+    owner = "Jc2k";
+    repo = pname;
+    rev = version;
+    sha256 = "03llk5i22hq163x568kz0qar5h0sda8f8cxbmgya6z2dcxv0a83p";
+  };
+
+  nativeBuildInputs = [ poetry ];
+
+  propagatedBuildInputs = [
+    cryptography
+    zeroconf
+  ];
+
+  checkInputs = [
+    pytest-aiohttp
+    pytestCheckHook
+  ];
+
+  # Some test requires network access
+  disabledTests = [
+    "test_remove_pairing"
+    "test_pair"
+    "test_add_and_remove_pairings"
+  ];
+
+  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-cors/default.nix b/nixpkgs/pkgs/development/python-modules/aiohttp-cors/default.nix
new file mode 100644
index 000000000000..00198cd27cff
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiohttp-cors/default.nix
@@ -0,0 +1,28 @@
+{ lib, buildPythonPackage, fetchPypi, pythonOlder
+, typing, 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..0a939dfb0097
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiohttp-jinja2/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, fetchPypi, aiohttp, jinja2, pytest, pytest-aiohttp, pytestcov }:
+
+buildPythonPackage rec {
+  pname = "aiohttp-jinja2";
+  version = "1.4.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "9c22a0e48e3b277fc145c67dd8c3b8f609dab36bce9eb337f70dfe716663c9a0";
+  };
+
+  propagatedBuildInputs = [ aiohttp jinja2 ];
+
+  checkInputs = [ pytest pytest-aiohttp pytestcov ];
+
+  checkPhase = ''
+    pytest -W ignore::DeprecationWarning
+  '';
+
+  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..8a8f7c4b3132
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiohttp-remotes/default.nix
@@ -0,0 +1,27 @@
+{ lib, fetchpatch, buildPythonPackage, fetchPypi
+, aiohttp, pytest, pytestcov, pytest-aiohttp
+}:
+
+buildPythonPackage rec {
+  pname = "aiohttp_remotes";
+  version = "1.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1vv2ancxsaxlls9sinigjnrqyx95n7cphq37m8nwifkhvs0idv6a";
+  };
+
+  propagatedBuildInputs = [ aiohttp ];
+
+  checkInputs = [ pytest pytestcov pytest-aiohttp ];
+  checkPhase = ''
+    python -m pytest
+  '';
+
+  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/aiohttp-socks/default.nix b/nixpkgs/pkgs/development/python-modules/aiohttp-socks/default.nix
new file mode 100644
index 000000000000..7b0bfe80684a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiohttp-socks/default.nix
@@ -0,0 +1,25 @@
+{ lib, fetchPypi, buildPythonPackage, pythonOlder, aiohttp, attrs }:
+
+buildPythonPackage rec {
+  pname = "aiohttp-socks";
+  version = "0.3.9";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "aiohttp_socks";
+    sha256 = "1mn2ng66951mri49f99zh3660j83kvqhr6dpx90s9fkjwk83hmjy";
+  };
+
+  propagatedBuildInputs = [ aiohttp attrs ];
+
+  # Checks needs internet access
+  doCheck = false;
+
+  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..36b1c2353459
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiohttp-swagger/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, aiohttp
+, flake8
+, jinja2
+, pytestCheckHook
+, pytest-aiohttp
+, pyyaml
+}:
+
+buildPythonPackage rec {
+  pname = "aiohttp-swagger";
+  version = "1.0.5";
+
+  src = fetchFromGitHub {
+    owner = "cr0hn";
+    repo = pname;
+    rev = "5a59e86f8c5672d2cc97dd35dc730c2f809d95ce"; # corresponds to 1.0.5 on PyPi, no tag on GitHub
+    sha256 = "1vpfk5b3f7s9qzr2q48g776f39xzqppjwm57scfzqqmbldkk5nv7";
+  };
+
+  propagatedBuildInputs = [ aiohttp jinja2 pyyaml ];
+
+  checkInputs = [ flake8 pytestCheckHook pytest-aiohttp ];
+
+  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/default.nix b/nixpkgs/pkgs/development/python-modules/aiohttp/default.nix
new file mode 100644
index 000000000000..514d1d308e12
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiohttp/default.nix
@@ -0,0 +1,94 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, attrs
+, chardet
+, multidict
+, async-timeout
+, yarl
+, idna-ssl
+, typing-extensions
+, pytestrunner
+, pytestCheckHook
+, gunicorn
+, async_generator
+, pytest_xdist
+, pytestcov
+, pytest-mock
+, trustme
+, brotlipy
+, freezegun
+, isPy38
+, re-assert
+}:
+
+buildPythonPackage rec {
+  pname = "aiohttp";
+  version = "3.7.3";
+  # https://github.com/aio-libs/aiohttp/issues/4525 python3.8 failures
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "9c1a81af067e72261c9cbe33ea792893e83bc6aa987bfbd6fdc1e5e7b22777c4";
+  };
+
+  checkInputs = [
+    pytestrunner pytestCheckHook gunicorn async_generator pytest_xdist
+    pytest-mock pytestcov trustme brotlipy freezegun
+    re-assert
+  ];
+
+  propagatedBuildInputs = [
+    attrs
+    chardet
+    multidict
+    async-timeout
+    typing-extensions
+    yarl
+  ] ++ lib.optionals (pythonOlder "3.7") [
+    idna-ssl
+  ];
+
+  disabledTests = [
+    # disable tests which attempt to do loopback connections
+    "get_valid_log_format_exc"
+    "test_access_logger_atoms"
+    "aiohttp_request_coroutine"
+    "server_close_keepalive_connection"
+    "connector"
+    "client_disconnect"
+    "handle_keepalive_on_closed_connection"
+    "proxy_https_bad_response"
+    "partially_applied_handler"
+    "middleware"
+    "test_mark_formdata_as_processed"
+    # no longer compatible with pytest>=6
+    "aiohttp_plugin_async_fixture"
+  ] ++ lib.optionals stdenv.is32bit [
+    "test_cookiejar"
+  ] ++ lib.optionals isPy38 [
+    # Python 3.8  https://github.com/aio-libs/aiohttp/issues/4525
+    "test_read_boundary_with_incomplete_chunk"
+    "test_read_incomplete_chunk"
+    "test_request_tracing_exception"
+  ] ++ lib.optionals stdenv.isDarwin [
+    "test_addresses"  # https://github.com/aio-libs/aiohttp/issues/3572
+    "test_close"
+  ];
+
+  # aiohttp in current folder shadows installed version
+  # Probably because we run `python -m pytest` instead of `pytest` in the hook.
+  preCheck = ''
+    cd tests
+  '';
+
+  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..b495bf4df463
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiohue/default.nix
@@ -0,0 +1,19 @@
+{ lib, buildPythonPackage, fetchPypi, aiohttp }:
+
+buildPythonPackage rec {
+  pname = "aiohue";
+  version = "2.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "35696d04d6eb0328b7031ea3c0a3cfe5d83dfcf62f920522e4767d165c6bc529";
+  };
+
+  propagatedBuildInputs = [ aiohttp ];
+
+  meta = with lib; {
+    description = "asyncio package to talk to Philips Hue";
+    homepage = "https://github.com/balloob/aiohue";
+    license = licenses.asl20;
+  };
+}
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..6345755bffc7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioimaplib/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, asynctest
+, buildPythonPackage
+, docutils
+, fetchFromGitHub
+, imaplib2
+, mock
+, nose
+, pyopenssl
+, pytestCheckHook
+, pythonOlder
+, pytz
+, tzlocal
+}:
+
+buildPythonPackage rec {
+  pname = "aioimaplib";
+  version = "0.7.18";
+
+  src = fetchFromGitHub {
+    owner = "bamthomas";
+    repo = pname;
+    rev = version;
+    sha256 = "037fxwmkdfb95cqcykrhn37p138wg9pvlsgdf45vyn1mhz5crky5";
+  };
+
+  checkInputs = [
+    asynctest
+    docutils
+    imaplib2
+    mock
+    nose
+    pyopenssl
+    pytestCheckHook
+    pytz
+    tzlocal
+  ];
+
+  # Project is using asynctest with doesn't work with Python 3.8 and above
+  # https://github.com/bamthomas/aioimaplib/issues/54
+  doCheck = pythonOlder "3.8";
+  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/aioitertools/default.nix b/nixpkgs/pkgs/development/python-modules/aioitertools/default.nix
new file mode 100644
index 000000000000..1c5ce1e2faeb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioitertools/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, typing-extensions
+, coverage
+, python
+, toml
+}:
+
+buildPythonPackage rec {
+  pname = "aioitertools";
+  version = "0.7.1";
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "18ql6k2j1839jf2rmmmm29v6fb7mr59l75z8nlf0sadmydy6r9al";
+  };
+
+  propagatedBuildInputs = [ typing-extensions ];
+  checkInputs = [ coverage toml ];
+
+  checkPhase = ''
+    ${python.interpreter} -m coverage run -m aioitertools.tests
+  '';
+
+  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..68c34df1afba
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiojobs/default.nix
@@ -0,0 +1,45 @@
+{ buildPythonPackage
+, fetchPypi
+, isPy27
+, aiohttp
+, pytest
+, pytest-aiohttp
+, pygments
+, lib
+}:
+
+buildPythonPackage rec {
+  pname = "aiojobs";
+  version = "0.2.2";
+  format = "flit";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "01a0msjh4w58fd7jplmblh0hwgpzwjs5xkgqz3d0p5yv3cykwjwf";
+  };
+
+  nativeBuildInputs = [
+    pygments
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  checkInputs = [
+    pytest
+    pytest-aiohttp
+  ];
+
+  checkPhase = ''
+    pytest tests
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/aio-libs/aiojobs";
+    description = "Jobs scheduler for managing background task (asyncio)";
+    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..ba32976b96b1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiokafka/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, isPy27
+, kafka-python
+, cython
+, zlib
+}:
+
+buildPythonPackage rec {
+  pname = "aiokafka";
+  version = "0.7.0";
+
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "aio-libs";
+    repo = "aiokafka";
+    rev = "v${version}";
+    sha256 = "16pcgv38syqy6sj3w7zx95zgynpd642n3i95dpiw0ivhpqrxxhrf";
+  };
+
+  nativeBuildInputs = [
+    cython
+  ];
+
+  buildInputs = [
+    zlib
+  ];
+
+  propagatedBuildInputs = [
+    kafka-python
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+       --replace "kafka-python==1.4.6" "kafka-python"
+  '';
+
+  # checks require running kafka server
+  doCheck = false;
+
+  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-effects/default.nix b/nixpkgs/pkgs/development/python-modules/aiolifx-effects/default.nix
new file mode 100644
index 000000000000..0a06144c65c3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiolifx-effects/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, isPy3k
+, aiolifx
+}:
+
+buildPythonPackage rec {
+  pname = "aiolifx-effects";
+  version = "0.2.1";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "aiolifx_effects";
+    sha256 = "cb4ac52deeb220783fc6449251cf40833fcffa28648270be64b1b3e83e06b503";
+  };
+
+  # tests are not implemented
+  doCheck = false;
+
+  disabled = !isPy3k;
+
+  propagatedBuildInputs = [ aiolifx ];
+
+  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..748ed242ae9a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiolifx/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, isPy3k
+, ifaddr
+, bitstring
+}:
+
+buildPythonPackage rec {
+  pname = "aiolifx";
+  version = "0.6.9";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0c28e9c058ee504a07eec11cb333bc6496d233da100dcab9c33549e9eb4985c0";
+  };
+
+  # tests are not implemented
+  doCheck = false;
+
+  disabled = !isPy3k;
+
+  propagatedBuildInputs = [ bitstring ifaddr ];
+
+  meta = with lib; {
+    homepage = "https://github.com/frawau/aiolifx";
+    license = licenses.mit;
+    description = "API for local communication with LIFX devices over a LAN with asyncio";
+    maintainers = with maintainers; [ netixx ];
+  };
+}
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..9b648d595379
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiomultiprocess/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "aiomultiprocess";
+  version = "0.8.0";
+
+  src = fetchFromGitHub {
+    owner = "omnilib";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0vkj1vgvlv828pi3sn0hjzdy9f0j63gljs2ylibbsaixa7mbkpvy";
+  };
+
+  checkInputs = [ pytestCheckHook ];
+
+  pytestFlagsArray = [ "aiomultiprocess/tests/*.py" ];
+  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/aiomysql/default.nix b/nixpkgs/pkgs/development/python-modules/aiomysql/default.nix
new file mode 100644
index 000000000000..803f642406c8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiomysql/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pymysql
+, pytest
+, isPy27
+}:
+
+buildPythonPackage rec {
+  pname = "aiomysql";
+  version = "0.0.21";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "aio-libs";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1qvy3phbsxp55161dnppjfx2m1kn82v0irc3xzqw0adfd81vaiad";
+  };
+
+  propagatedBuildInputs = [
+    pymysql
+  ];
+
+  checkInputs = [
+    pytest
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "PyMySQL>=0.9,<=0.9.3" "PyMySQL"
+  '';
+
+  checkPhase = ''
+    pytest
+  '';
+
+  # tests require mysql database
+  doCheck = false;
+
+  meta = with lib; {
+    description = "MySQL driver for asyncio";
+    homepage = "https://github.com/aio-libs/aiomysql";
+    license = licenses.mit;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..93177733dedc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aionotify/default.nix
@@ -0,0 +1,32 @@
+{ 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";
+
+  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; [ thiagokokada ];
+  };
+}
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..04963f1d09b1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioprocessing/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonAtLeast
+}:
+
+buildPythonPackage rec {
+  pname = "aioprocessing";
+  version = "1.1.0";
+  disabled = !(pythonAtLeast "3.4");
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "4603c86ff3fea673d4c643ad3adc519988cd778771b75079bc3be9e5ed4c5b66";
+  };
+
+  # Tests aren't included in pypi package
+  doCheck = false;
+
+  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..3df005d17907
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiopulse/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, async-timeout
+}:
+
+buildPythonPackage rec {
+  pname = "aiopulse";
+  version = "0.4.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0fnscm27l77c8cd7jhbn35axyalq61kksy3fcqzv21fz55lklsm0";
+  };
+
+  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/aioredis/default.nix b/nixpkgs/pkgs/development/python-modules/aioredis/default.nix
new file mode 100644
index 000000000000..94f503fe2cc3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioredis/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi
+, pkgs, async-timeout, hiredis, isPyPy, isPy27
+}:
+
+buildPythonPackage rec {
+  pname = "aioredis";
+  version = "1.3.1";
+
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0fi7jd5hlx8cnv1m97kv9hc4ih4l8v15wzkqwsp73is4n0qazy0m";
+  };
+
+  propagatedBuildInputs = [
+    async-timeout
+  ] ++ 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..6a0d69371a8e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioresponses/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, pbr
+, aiohttp
+, ddt
+, asynctest
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "aioresponses";
+  version = "0.7.1";
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f65bba2be1e9a4997ee166bc0161a50be0fef7350ad09e6afdb2adccf74dfefe";
+  };
+
+  nativeBuildInputs = [
+    pbr
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  checkInputs = [
+    asynctest
+    ddt
+    pytest
+  ];
+
+  # Skip a test which makes requests to httpbin.org
+  checkPhase = ''
+    pytest -k "not (test_address_as_instance_of_url_combined_with_pass_through or test_pass_through_with_origin_params)"
+  '';
+
+  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/aiorpcx/default.nix b/nixpkgs/pkgs/development/python-modules/aiorpcx/default.nix
new file mode 100644
index 000000000000..5b270319661a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiorpcx/default.nix
@@ -0,0 +1,25 @@
+{ lib, fetchPypi, buildPythonPackage, pythonOlder, attrs }:
+
+buildPythonPackage rec {
+  pname = "aiorpcx";
+  version = "0.18.4";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "aiorpcX";
+    sha256 = "0jpvrkan6w8bpq017m8si7r9hb1pyw3ip4vr1fl2pmi8ngzc1jdy";
+  };
+
+  propagatedBuildInputs = [ attrs ];
+
+  disabled = pythonOlder "3.6";
+
+  # Checks needs internet access
+  doCheck = false;
+
+  meta = {
+    description = "Transport, protocol and framing-independent async RPC client and server implementation";
+    license = lib.licenses.mit;
+    homepage = "https://github.com/kyuupichan/aiorpcX";
+  };
+}
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..a0a3d74e5780
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiorun/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, isPy27
+, pygments
+, pytest
+, pytestcov
+, uvloop
+}:
+
+buildPythonPackage rec {
+  pname = "aiorun";
+  version = "2020.6.1";
+  format = "flit";
+
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "cjrh";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "00mq5ylhhdfdqrh7zdqabf3wy85jrkqvgfb1421ll46fsjim2d14";
+  };
+
+  propagatedBuildInputs = [
+    pygments
+  ];
+
+  checkInputs = [
+    pytest
+    pytestcov
+    uvloop
+  ];
+
+  # allow for writable directory for darwin
+  preBuild = ''
+    export HOME=$TMPDIR
+  '';
+
+  checkPhase = ''
+     pytest
+  '';
+
+  meta = with lib; {
+    description = "Boilerplate for asyncio applications";
+    homepage = "https://github.com/cjrh/aiorun";
+    license = licenses.asl20;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..f53877e03a3c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioshelly/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, netifaces
+}:
+
+buildPythonPackage rec {
+  pname = "aioshelly";
+  version = "0.5.4";
+
+  src = fetchFromGitHub {
+    owner = "home-assistant-libs";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-EjzWx3wcmTfB3OmN0OB37K6wYKVO3HzGEIf+uihas8k=";
+  };
+
+  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/aiosmtpd/default.nix b/nixpkgs/pkgs/development/python-modules/aiosmtpd/default.nix
new file mode 100644
index 000000000000..7bdddb42d4e3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiosmtpd/default.nix
@@ -0,0 +1,35 @@
+{ lib, isPy3k, fetchFromGitHub, buildPythonPackage
+, atpublic }:
+
+buildPythonPackage rec {
+  pname = "aiosmtpd";
+  version = "1.2.1";
+  disabled = !isPy3k;
+
+  # Release not published to Pypi
+  src = fetchFromGitHub {
+    owner = "aio-libs";
+    repo = pname;
+    rev = version;
+    sha256 = "14c30dm6jzxiblnsah53fdv68vqhxwvb9x0aq9bc4vcdas747vr7";
+  };
+
+  propagatedBuildInputs = [
+    atpublic
+  ];
+
+  # Tests need network access
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://aiosmtpd.readthedocs.io/en/latest/";
+    description = "Asyncio based SMTP server";
+    longDescription = ''
+      This is a server for SMTP and related protocols, similar in utility to the
+      standard library's smtpd.py module, but rewritten to be based on asyncio for
+      Python 3.
+    '';
+    license = licenses.asl20;
+    maintainers = with maintainers; [ eadwu ];
+  };
+}
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..44cae12cba52
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiosqlite/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, aiounittest
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, pytestCheckHook
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "aiosqlite";
+  version = "0.16.0";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1a0fjmlvadyzsml10g5p1qif7192k0swy5zwjp8v48y5zc3yy56h";
+  };
+
+  checkInputs = [
+    aiounittest
+    pytestCheckHook
+    typing-extensions
+  ];
+
+  # tests are not pick-up automatically by the hook
+  pytestFlagsArray = [ "aiosqlite/tests/*.py" ];
+
+  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/aiostream/default.nix b/nixpkgs/pkgs/development/python-modules/aiostream/default.nix
new file mode 100644
index 000000000000..a48e2ae02401
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiostream/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytestCheckHook
+, pytestcov
+, pytest-asyncio
+}:
+
+buildPythonPackage rec {
+  pname = "aiostream";
+  version = "0.4.1";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "vxgmichel";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1wwnjrzkd61k3arxzk7yhg7cc1099bcwr5kz5n91ai6ma5ln139s";
+  };
+
+  checkInputs = [ pytestCheckHook pytestcov 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..115da7dfca40
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioswitcher/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, aiohttp
+, asynctest
+, buildPythonPackage
+, fetchFromGitHub
+, poetry
+, pytest-aiohttp
+, pytest-asyncio
+, pytest-sugar
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "aioswitcher";
+  version = "1.2.2";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "TomerFi";
+    repo = pname;
+    rev = version;
+    sha256 = "0wvca1jbyj4bwrpkpklbxnkvdp9zs7mrvg5b9vkx2hpyr81vyxam";
+  };
+
+  nativeBuildInputs = [ poetry ];
+
+  propagatedBuildInputs = [ aiohttp ];
+
+  checkInputs = [
+    asynctest
+    pytest-aiohttp
+    pytest-asyncio
+    pytest-sugar
+    pytestCheckHook
+  ];
+
+  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/aiounifi/default.nix b/nixpkgs/pkgs/development/python-modules/aiounifi/default.nix
new file mode 100644
index 000000000000..7d6276e53e64
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiounifi/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, fetchPypi, isPy3k
+, aiohttp }:
+
+buildPythonPackage rec {
+  pname = "aiounifi";
+  version = "26";
+
+  disabled = ! isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "3dd0f9fc59edff5d87905ddef3eecc93f974c209d818d3a91061b05925da04af";
+  };
+
+  propagatedBuildInputs = [ aiohttp ];
+
+  # upstream has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "An asynchronous Python library for communicating with Unifi Controller API";
+    homepage    = "https://pypi.python.org/pypi/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..eeb0ea0af577
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiounittest/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, nose
+, coverage
+, isPy27
+}:
+
+buildPythonPackage rec {
+  pname = "aiounittest";
+  version = "1.3.1";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "kwarunek";
+    repo = pname;
+    rev = version;
+    sha256 = "0mlic2q49cb0vv62mixy4i4x8c91qb6jlji7khiamcxcg676nasl";
+  };
+
+  checkInputs = [
+    nose
+    coverage
+  ];
+
+  checkPhase = ''
+    nosetests
+  '';
+
+  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/aiowinreg/default.nix b/nixpkgs/pkgs/development/python-modules/aiowinreg/default.nix
new file mode 100644
index 000000000000..3b02916d229f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiowinreg/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aiowinreg";
+  version = "0.0.4";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "956278a90ef6958f9e2392891b2a305273f695b15b14489cd2097197d6cbe155";
+  };
+
+  # 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/aiozeroconf/default.nix b/nixpkgs/pkgs/development/python-modules/aiozeroconf/default.nix
new file mode 100644
index 000000000000..d73ae2b35dfb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiozeroconf/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv
+, 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..e75653fb684a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/airly/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, aiohttp
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "airly";
+  version = "1.0.0";
+
+  src = fetchFromGitHub {
+    owner = "ak-ambi";
+    repo = "python-airly";
+    rev = "v${version}";
+    sha256 = "0an6nbl0i5pahxm6x4z03s9apzgqrw9zf7srjcs0r3y1ppicb4s6";
+  };
+
+  propagatedBuildInputs = [ aiohttp ];
+
+  checkInputs = [ pytestCheckHook ];
+
+  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/ajpy/default.nix b/nixpkgs/pkgs/development/python-modules/ajpy/default.nix
new file mode 100644
index 000000000000..0dd135e139fd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ajpy/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv, 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/alabaster/default.nix b/nixpkgs/pkgs/development/python-modules/alabaster/default.nix
new file mode 100644
index 000000000000..b4cc69e555bc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/alabaster/default.nix
@@ -0,0 +1,23 @@
+{ lib, stdenv, 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/alarmdecoder/default.nix b/nixpkgs/pkgs/development/python-modules/alarmdecoder/default.nix
new file mode 100644
index 000000000000..b563a80447f2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/alarmdecoder/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub, pyserial, pyftdi, pyusb
+, pyopenssl, nose, isPy3k, pythonOlder, mock }:
+
+buildPythonPackage rec {
+  pname = "alarmdecoder";
+  version = "1.13.9";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "nutechsoftware";
+    repo = "alarmdecoder";
+    rev = version;
+    sha256 = "0plr2h1qn4ryawbaxf29cfna4wailghhaqy1jcm9kxq6q7b9xqqy";
+  };
+
+  propagatedBuildInputs = [ pyserial pyftdi pyusb pyopenssl ];
+
+  doCheck = !isPy3k;
+  checkInputs = [ nose mock ];
+  pythonImportsCheck = [ "alarmdecoder" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/nutechsoftware/alarmdecoder";
+    description =
+      "Python interface for the Alarm Decoder (AD2) family of alarm devices. (AD2USB, AD2SERIAL and AD2PI)";
+    license = licenses.mit;
+  };
+}
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..142c6d1c416c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/alembic/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi
+, pytest, pytestcov, mock, coverage, setuptools
+, Mako, sqlalchemy, python-editor, dateutil
+}:
+
+buildPythonPackage rec {
+  pname = "alembic";
+  version = "1.4.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "5334f32314fb2a56d86b4c4dd1ae34b08c03cae4cb888bc699942104d66bc245";
+  };
+
+  buildInputs = [ pytest pytestcov mock coverage ];
+  propagatedBuildInputs = [ Mako sqlalchemy python-editor dateutil setuptools ];
+
+  # no traditional test suite
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://bitbucket.org/zzzeek/alembic";
+    description = "A database migration tool for SQLAlchemy";
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/alerta-server/default.nix b/nixpkgs/pkgs/development/python-modules/alerta-server/default.nix
new file mode 100644
index 000000000000..dd2d82578ea2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/alerta-server/default.nix
@@ -0,0 +1,45 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, pythonOlder
+, bcrypt, blinker, flask, flask-compress, flask-cors, mohawk, psycopg2, pyjwt, pymongo, python-dateutil, pytz, pyyaml, requests, requests-hawk, sentry-sdk
+}:
+
+buildPythonPackage rec {
+  pname = "alerta-server";
+  version = "8.3.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a2713a31c6e326c774a3ee0328f424f944b951935ff1b893a4a66598d61c5a97";
+  };
+
+  propagatedBuildInputs = [
+    bcrypt
+    blinker
+    flask
+    flask-compress
+    flask-cors
+    mohawk
+    psycopg2
+    pyjwt
+    pymongo
+    python-dateutil
+    pytz
+    pyyaml
+    requests
+    requests-hawk
+    sentry-sdk
+  ];
+
+  doCheck = false; # We can't run the tests from Nix, because they rely on the presence of a working MongoDB server
+
+  postInstall = ''
+    wrapProgram $out/bin/alertad --prefix PYTHONPATH : "$PYTHONPATH"
+  '';
+
+  disabled = pythonOlder "3.5";
+
+  meta = with lib; {
+    homepage = "https://alerta.io";
+    description = "Alerta Monitoring System server";
+    license = licenses.asl20;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/alerta/default.nix b/nixpkgs/pkgs/development/python-modules/alerta/default.nix
new file mode 100644
index 000000000000..19dd17ee3f02
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/alerta/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi
+, six, click, requests, requests-hawk, pytz, tabulate, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "alerta";
+  version = "8.3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "83c7d751bad0cb9bd7886700da4cd83c5451b2e8eb8d4cc697966e02d6a565f8";
+  };
+
+  propagatedBuildInputs = [ six click requests requests-hawk pytz tabulate ];
+
+  doCheck = false;
+
+  postInstall = ''
+    wrapProgram $out/bin/alerta --prefix PYTHONPATH : "$PYTHONPATH"
+  '';
+
+  disabled = pythonOlder "3.5";
+
+  meta = with lib; {
+    homepage = "https://alerta.io";
+    description = "Alerta Monitoring System command-line interface";
+    license = licenses.asl20;
+  };
+}
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..8a46d405799b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/algebraic-data-types/default.nix
@@ -0,0 +1,28 @@
+{ lib, buildPythonPackage, fetchFromGitHub, pythonOlder, hypothesis, mypy }:
+
+buildPythonPackage rec {
+  pname = "algebraic-data-types";
+  version = "0.1.1";
+
+  src = fetchFromGitHub {
+    owner = "jspahrsummers";
+    repo = "adt";
+    rev = "v" + version;
+    sha256 = "1py94jsgh6wch59n9dxnwvk74psbpa1679zfmripa1qfc2218kqi";
+  };
+
+  disabled = pythonOlder "3.6";
+
+  checkInputs = [
+    hypothesis
+    mypy
+  ];
+
+  meta = with lib; {
+    description = "Algebraic data types for Python";
+    homepage = "https://github.com/jspahrsummers/adt";
+    license = licenses.mit;
+    maintainers = with maintainers; [ uri-canva ];
+    platforms = platforms.unix;
+  };
+}
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/alot/default.nix b/nixpkgs/pkgs/development/python-modules/alot/default.nix
new file mode 100644
index 000000000000..21c6aaff2fbc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/alot/default.nix
@@ -0,0 +1,70 @@
+{ stdenv, lib, buildPythonPackage, python, fetchFromGitHub, fetchpatch, isPy3k
+, notmuch, urwid, urwidtrees, twisted, python_magic, configobj, mock, file, gpgme
+, service-identity
+, gnupg ? null, sphinx, awk ? null, procps ? null, future ? null
+, withManpage ? false }:
+
+
+buildPythonPackage rec {
+  pname = "alot";
+  version = "0.9.1";
+  outputs = [ "out" ] ++ lib.optional withManpage "man";
+
+  disabled = !isPy3k;
+
+  src = fetchFromGitHub {
+    owner = "pazz";
+    repo = "alot";
+    rev = version;
+    sha256 = "0s94m17yph1gq9f2svipb3bbwbw1s4j3zf2xkg5h91006v8286r6";
+  };
+
+  postPatch = ''
+    substituteInPlace alot/settings/manager.py --replace /usr/share "$out/share"
+  '';
+
+  nativeBuildInputs = lib.optional withManpage sphinx;
+
+  propagatedBuildInputs = [
+    notmuch
+    urwid
+    urwidtrees
+    twisted
+    python_magic
+    configobj
+    service-identity
+    file
+    gpgme
+  ];
+
+  # some twisted tests need the network (test_env_set... )
+  doCheck = false;
+  postBuild = lib.optionalString withManpage "make -C docs man";
+
+  checkInputs =  [ awk future mock gnupg procps ];
+
+  postInstall = let
+    completionPython = python.withPackages (ps: [ ps.configobj ]);
+  in lib.optionalString withManpage ''
+    mkdir -p $out/man
+    cp -r docs/build/man $out/man
+  ''
+  + ''
+    mkdir -p $out/share/{applications,alot}
+    cp -r extra/themes $out/share/alot
+
+    substituteInPlace extra/completion/alot-completion.zsh \
+      --replace "python3" "${completionPython.interpreter}"
+    install -D extra/completion/alot-completion.zsh $out/share/zsh/site-functions/_alot
+
+    sed "s,/usr/bin,$out/bin,g" extra/alot.desktop > $out/share/applications/alot.desktop
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/pazz/alot";
+    description = "Terminal MUA using notmuch mail";
+    license = licenses.gpl3;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ edibopp ];
+  };
+}
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..a3b515ebeca8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/altair/default.nix
@@ -0,0 +1,62 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, isPy27
+, entrypoints
+, glibcLocales
+, ipython
+, jinja2
+, jsonschema
+, numpy
+, pandas
+, pytest
+, pythonOlder
+, recommonmark
+, six
+, sphinx
+, toolz
+, typing
+, vega_datasets
+}:
+
+buildPythonPackage rec {
+  pname = "altair";
+  version = "4.1.0";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0c99q5dy6f275yg1f137ird08wmwc1z8wmvjickkf2mvyka31p9y";
+  };
+
+  propagatedBuildInputs = [
+    entrypoints
+    jsonschema
+    numpy
+    pandas
+    six
+    toolz
+  ] ++ lib.optionals (pythonOlder "3.5") [ typing ];
+
+  checkInputs = [
+    glibcLocales
+    ipython
+    jinja2
+    pytest
+    recommonmark
+    sphinx
+    vega_datasets
+  ];
+
+  checkPhase = ''
+    export LANG=en_US.UTF-8
+    # histogram_responsive.py attempt network access, and cannot be disabled through pytest flags
+    rm altair/examples/histogram_responsive.py
+    pytest --doctest-modules altair
+  '';
+
+  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/amazon_kclpy/default.nix b/nixpkgs/pkgs/development/python-modules/amazon_kclpy/default.nix
new file mode 100644
index 000000000000..ed266c0db788
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/amazon_kclpy/default.nix
@@ -0,0 +1,34 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub, python, mock, boto, pytest }:
+
+buildPythonPackage rec {
+  pname = "amazon_kclpy";
+  version = "2.0.1";
+
+  src = fetchFromGitHub {
+    owner = "awslabs";
+    repo = "amazon-kinesis-client-python";
+    rev = "v${version}";
+    sha256 = "13iq217fg0bxafp2rl684pg1rz4jbwid8cc8ip4rim07kzn65lbg";
+  };
+
+  # 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/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..772b8fbaa046
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/amcrest/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, argcomplete
+, buildPythonPackage
+, fetchFromGitHub
+, mock
+, pytestCheckHook
+, requests
+, responses
+, urllib3
+}:
+
+buildPythonPackage rec {
+  pname = "amcrest";
+  version = "1.7.2";
+
+  src = fetchFromGitHub {
+    owner = "tchellomello";
+    repo = "python-amcrest";
+    rev = version;
+    sha256 = "06gbrshf6vqvq3k813d1w37k2kmps0g6msa4lp2f9xvzw3iczshy";
+  };
+
+  propagatedBuildInputs = [
+    argcomplete
+    requests
+    urllib3
+  ];
+
+  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/amply/default.nix b/nixpkgs/pkgs/development/python-modules/amply/default.nix
new file mode 100644
index 000000000000..32bcbb4589ab
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/amply/default.nix
@@ -0,0 +1,36 @@
+{ lib, stdenv
+, fetchPypi
+, buildPythonPackage
+, setuptools_scm
+, docutils
+, pyparsing
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "amply";
+  version = "0.1.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "cb12dcb49d16b168c02be128a1527ecde50211e4bd94af76ff4e67707f5a2d38";
+  };
+
+  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..b614ae453d25
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/amqp/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, pytestCheckHook, case, vine }:
+
+buildPythonPackage rec {
+  pname = "amqp";
+  version = "5.0.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1733ebf713050504fd9d2ebc661f1fc95b3588f99ee87d2e39c84c27bfd815dc";
+  };
+
+  propagatedBuildInputs = [ vine ];
+
+  checkInputs = [ pytestCheckHook case ];
+  disabledTests = [
+    "test_rmq.py" # requires network access
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/celery/py-amqp";
+    description = "Python client for the Advanced Message Queuing Procotol (AMQP). This is a fork of amqplib which is maintained by the Celery project";
+    license = licenses.lgpl21;
+  };
+}
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..c7b4dc865bb8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/amqplib/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv, 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/androguard/default.nix b/nixpkgs/pkgs/development/python-modules/androguard/default.nix
new file mode 100644
index 000000000000..ec19f4730a55
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/androguard/default.nix
@@ -0,0 +1,93 @@
+{ lib
+, fetchpatch
+, buildPythonPackage
+, fetchFromGitHub
+, future
+, networkx
+, pygments
+, lxml
+, colorama
+, matplotlib
+, asn1crypto
+, click
+, pydot
+, ipython
+, 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 {
+  version = "3.3.5";
+  pname = "androguard";
+
+  # No tests in pypi tarball
+  src = fetchFromGitHub {
+    repo = pname;
+    owner = pname;
+    rev = "v${version}";
+    sha256 = "0zc8m1xnkmhz2v12ddn47q0c01p3sbna2v5npfxhcp88szswlr9y";
+  };
+
+  propagatedBuildInputs = [
+    future
+    networkx
+    pygments
+    lxml
+    colorama
+    matplotlib
+    asn1crypto
+    click
+    pydot
+    ipython
+  ] ++ lib.optionals withGui [
+    pyqt5
+    pyperclip
+  ];
+
+  checkInputs = [
+    pyqt5
+    pyperclip
+    nose
+    nose-timer
+    codecov
+    coverage
+    mock
+    python_magic
+  ];
+  inherit doCheck;
+
+  nativeBuildInputs = lib.optionals withGui [ qt5.wrapQtAppsHook ];
+
+  # 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 = {
+    description = "Tool and python library to interact with Android Files";
+    homepage = "https://github.com/androguard/androguard";
+    license = lib.licenses.asl20;
+    maintainers = [ lib.maintainers.pmiddend ];
+  };
+}
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..91140dc0bf1a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/androidtv/default.nix
@@ -0,0 +1,31 @@
+{ aiofiles, adb-shell, buildPythonPackage, fetchFromGitHub, isPy3k, lib, mock
+, pure-python-adb, python }:
+
+buildPythonPackage rec {
+  pname = "androidtv";
+  version = "0.0.50";
+
+  # pypi does not contain tests, using github sources instead
+  src = fetchFromGitHub {
+    owner = "JeffLIrion";
+    repo = "python-androidtv";
+    rev = "v${version}";
+    sha256 = "1iqw40szwgzvhv3fbnx2wwfnw0d3clcwk9vsq1xsn30fjil2vl7b";
+  };
+
+  propagatedBuildInputs = [ adb-shell pure-python-adb ]
+    ++ lib.optionals (isPy3k) [ aiofiles ];
+
+  checkInputs = [ mock ];
+  checkPhase = ''
+    ${python.interpreter} -m unittest discover -s tests -t .
+  '';
+
+  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/aniso8601/default.nix b/nixpkgs/pkgs/development/python-modules/aniso8601/default.nix
new file mode 100644
index 000000000000..804402a4ca67
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aniso8601/default.nix
@@ -0,0 +1,22 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi
+, dateutil, mock, isPy3k }:
+
+buildPythonPackage rec {
+  pname = "aniso8601";
+  version = "8.1.0";
+
+  meta = with lib; {
+    description = "Parses ISO 8601 strings.";
+    homepage    = "https://bitbucket.org/nielsenb/aniso8601";
+    license     = licenses.bsd3;
+  };
+
+  propagatedBuildInputs = [ dateutil ];
+
+  checkInputs = lib.optional (!isPy3k) mock;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "246bf8d3611527030889e6df970878969d3a2f760ba3eb694fa1fb10e6ce53f9";
+  };
+}
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..a508e7b27111
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/annexremote/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, isPy3k
+, buildPythonPackage
+, fetchFromGitHub
+, future
+, mock
+, nose
+}:
+
+buildPythonPackage rec {
+  pname = "annexremote";
+  version = "1.4.5";
+
+  # use fetchFromGitHub instead of fetchPypi because the test suite of
+  # the package is not included into the PyPI tarball
+  src = fetchFromGitHub {
+    rev = "v${version}";
+    owner = "Lykos153";
+    repo = "AnnexRemote";
+    sha256 = "0r5chdk2aiqcz7z8r8m1j657cz79f6bbv96xdmhj4m5fiqn672if";
+  };
+
+  propagatedBuildInputs = [ future ];
+
+  checkInputs = [ nose ] ++ lib.optional (!isPy3k) mock;
+  checkPhase = "nosetests -v";
+
+  meta = with lib; {
+    description = "Helper module to easily develop git-annex remotes";
+    homepage = "https://github.com/Lykos153/AnnexRemote";
+    license = licenses.gpl3;
+    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..0bd060843809
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/annoy/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, h5py
+, nose
+}:
+
+buildPythonPackage rec {
+  version = "1.17.0";
+  pname = "annoy";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "9891e264041d1dcf3af42f67fbb16cb273c5404bc8c869d0915a3087f71d58dd";
+  };
+
+  nativeBuildInputs = [ h5py ];
+
+  checkInputs = [
+    nose
+  ];
+
+  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..9c1b3abf9800
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/anonip/default.nix
@@ -0,0 +1,24 @@
+{ stdenv, lib, buildPythonPackage, fetchFromGitHub, ipaddress, isPy27 }:
+
+buildPythonPackage rec {
+  pname = "anonip";
+  version = "1.0.0";
+
+  src = fetchFromGitHub {
+    owner = "DigitaleGesellschaft";
+    repo = "Anonip";
+    rev = "v${version}";
+    sha256 = "0y5xqivcinp6pwx4whc8ca1n2wxrvff7a2lpbz2dhivilfanmljs";
+  };
+
+  propagatedBuildInputs = lib.optionals isPy27 [ ipaddress ];
+
+  checkPhase = "python tests.py";
+
+  meta = with lib; {
+    homepage = "https://github.com/DigitaleGesellschaft/Anonip";
+    description = "A tool to anonymize IP-addresses in log-files";
+    license = licenses.bsd3;
+    maintainers = [ 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..d198fde80bb8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ansi/default.nix
@@ -0,0 +1,21 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "ansi";
+  version = "0.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "98e9b27c4bb187867a69480cbc63b843331622fec7e7d090873d806e1b5d8a80";
+  };
+
+  checkPhase = ''
+    python -c "import 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..df115cf7c470
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ansi2html/default.nix
@@ -0,0 +1,28 @@
+{ lib, buildPythonPackage, fetchPypi, isPy3k, six, mock, pytestCheckHook, setuptools, setuptools_scm, toml }:
+
+buildPythonPackage rec {
+  pname = "ansi2html";
+  version = "1.6.0";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0f124ea7efcf3f24f1f9398e527e688c9ae6eab26b0b84e1299ef7f94d92c596";
+  };
+
+  nativeBuildInputs = [ setuptools_scm toml ];
+  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-kernel/default.nix b/nixpkgs/pkgs/development/python-modules/ansible-kernel/default.nix
new file mode 100644
index 000000000000..670b6330eaa5
--- /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 = "0.9.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a59039a1724c0f4f4435316e2ad3383f2328ae61f190e74414a66cc8c4637636";
+  };
+
+  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-lint/default.nix b/nixpkgs/pkgs/development/python-modules/ansible-lint/default.nix
new file mode 100644
index 000000000000..2718ba7670b5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ansible-lint/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, isPy27
+, ansible
+, pyyaml
+, setuptools_scm
+, ruamel_yaml
+, rich
+, pytestCheckHook
+, pytestcov
+, pytest_xdist
+, git
+}:
+
+buildPythonPackage rec {
+  pname = "ansible-lint";
+  version = "4.3.7";
+  # pip is not able to import version info on raumel.yaml
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0kwwv9dv9rgsqvp15r2vma7hii9lkkqn0n2irvp5h32cbhzzq4hh";
+  };
+
+  format = "pyproject";
+
+  nativeBuildInputs = [ setuptools_scm ];
+  propagatedBuildInputs = [ pyyaml ansible ruamel_yaml rich ];
+  checkInputs = [ pytestCheckHook pytestcov pytest_xdist git ];
+
+  postPatch = ''
+    patchShebangs bin/ansible-lint
+    substituteInPlace setup.cfg \
+      --replace "setuptools_scm_git_archive>=1.0" ""
+  '';
+
+  # give a hint to setuptools_scm on package version
+  preBuild = ''
+    export SETUPTOOLS_SCM_PRETEND_VERSION="v${version}"
+    export HOME=$(mktemp -d)
+  '';
+
+  checkPhase = ''
+    pytest -k 'not test_run_playbook_github and not test_run_single_role_path_no_trailing_slash_script'
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/ansible/ansible-lint";
+    description = "Best practices checker for Ansible";
+    license = licenses.mit;
+    maintainers = [ maintainers.sengaya ];
+  };
+}
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..7f29bb5695c6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ansible-runner/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, psutil
+, pexpect
+, python-daemon
+, pyyaml
+, six
+, stdenv
+, ansible
+, pytest
+, mock
+}:
+
+buildPythonPackage rec {
+  pname = "ansible-runner";
+  version = "1.4.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "53605de32f7d3d3442a6deb8937bf1d9c1f91c785e3f71003d22c3e63f85c71d";
+  };
+
+  checkInputs = [ pytest mock ];
+  propagatedBuildInputs = [
+    ansible
+    psutil
+    pexpect
+    python-daemon
+    pyyaml
+    six
+  ];
+
+  # test_process_isolation_settings is currently broken on Darwin Catalina
+  # https://github.com/ansible/ansible-runner/issues/413
+  checkPhase = ''
+    HOME=$TMPDIR pytest \
+      --ignore test/unit/test_runner.py \
+      -k "not prepare ${lib.optionalString stdenv.isDarwin "and not process_isolation_settings"}"
+  '';
+
+  meta = with lib; {
+    description = "Helps when interfacing with Ansible";
+    homepage = "https://github.com/ansible/ansible-runner";
+    license = licenses.asl20;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..245375c26be0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ansible/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, pycrypto
+, paramiko
+, jinja2
+, pyyaml
+, httplib2
+, six
+, netaddr
+, dnspython
+, jmespath
+, dopy
+, ncclient
+, windowsSupport ? false
+, pywinrm
+}:
+
+buildPythonPackage rec {
+  pname = "ansible";
+  version = "2.9.12";
+
+  src = fetchFromGitHub {
+    owner = "ansible";
+    repo = "ansible";
+    rev = "v${version}";
+    sha256 = "0c794k0cyl54807sh9in0l942ah6g6wlz5kf3qvy5lhd581zlgyb";
+  };
+
+  prePatch = ''
+    # ansible-connection is wrapped, so make sure it's not passed
+    # through the python interpreter.
+    sed -i "s/\[python, /[/" lib/ansible/executor/task_executor.py
+  '';
+
+  postInstall = ''
+    for m in docs/man/man1/*; do
+      install -vD $m -t $out/share/man/man1
+    done
+  '';
+
+  propagatedBuildInputs = [
+    pycrypto paramiko jinja2 pyyaml httplib2
+    six netaddr dnspython jmespath dopy ncclient
+  ] ++ lib.optional windowsSupport pywinrm;
+
+  # dificult to test
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "http://www.ansible.com";
+    description = "Radically simple IT automation";
+    license = [ licenses.gpl3 ] ;
+    maintainers = with maintainers; [ joamaki costrouc hexa ];
+    platforms = platforms.linux ++ platforms.darwin;
+  };
+}
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..3d96061362e9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ansicolor/default.nix
@@ -0,0 +1,18 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "ansicolor";
+  version = "0.2.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d17e1b07b9dd7ded31699fbca53ae6cd373584f9b6dcbc124d1f321ebad31f1d";
+  };
+
+  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..7d6dd2127e67
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ansicolors/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv, 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..6a3571960d03
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ansiconv/default.nix
@@ -0,0 +1,23 @@
+{ lib, stdenv, 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/ansiwrap/default.nix b/nixpkgs/pkgs/development/python-modules/ansiwrap/default.nix
new file mode 100644
index 000000000000..1af39e970bcd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ansiwrap/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, tox
+, pytest
+, ansicolors
+, coverage
+, pytestcov
+, textwrap3
+}:
+
+buildPythonPackage rec {
+  pname = "ansiwrap";
+  version = "0.8.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "ca0c740734cde59bf919f8ff2c386f74f9a369818cdc60efe94893d01ea8d9b7";
+  };
+
+  checkInputs = [
+    tox
+    pytest
+    ansicolors
+    coverage
+    pytestcov
+  ];
+
+  propagatedBuildInputs = [
+    textwrap3
+  ];
+
+  checkPhase = ''
+    pytest
+  '';
+
+  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-python2-runtime/default.nix b/nixpkgs/pkgs/development/python-modules/antlr4-python2-runtime/default.nix
new file mode 100644
index 000000000000..aa18a0fe2907
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/antlr4-python2-runtime/default.nix
@@ -0,0 +1,21 @@
+{ lib, buildPythonPackage, isPy3k, python
+, antlr4
+}:
+
+buildPythonPackage rec {
+  pname = "antlr4-python2-runtime";
+  inherit (antlr4.runtime.cpp) version src;
+  disabled = isPy3k;
+
+  sourceRoot = "source/runtime/Python2";
+
+  checkPhase = ''
+    ${python.interpreter} tests/TestTokenStreamRewriter.py
+  '';
+
+  meta = with lib; {
+    description = "Runtime for ANTLR";
+    homepage = "https://www.antlr.org/";
+    license = licenses.bsd3;
+  };
+}
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..0fade1362c9c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/antlr4-python3-runtime/default.nix
@@ -0,0 +1,22 @@
+{ lib, buildPythonPackage, isPy3k, python
+, antlr4
+}:
+
+buildPythonPackage rec {
+  pname = "antlr4-python3-runtime";
+  inherit (antlr4.runtime.cpp) version src;
+  disabled = !isPy3k;
+
+  sourceRoot = "source/runtime/Python3";
+
+  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/anyio/default.nix b/nixpkgs/pkgs/development/python-modules/anyio/default.nix
new file mode 100644
index 000000000000..f79bf23896fd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/anyio/default.nix
@@ -0,0 +1,62 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, idna
+, sniffio
+, typing-extensions
+, curio
+, hypothesis
+, pytestCheckHook
+, trio
+, trustme
+, uvloop
+}:
+
+buildPythonPackage rec {
+  pname = "anyio";
+  version = "2.0.2";
+  format = "pyproject";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "agronholm";
+    repo = pname;
+    rev = version;
+    sha256 = "06nazfrm2sclp3lpgsn9wl8vmqxvx36s3gr2gnqz3zhjpf3glkxv";
+  };
+
+  propagatedBuildInputs = [
+    idna
+    sniffio
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    typing-extensions
+  ];
+
+  checkInputs = [
+    curio
+    hypothesis
+    pytestCheckHook
+    trio
+    trustme
+    uvloop
+  ];
+
+  pytestFlagsArray = [
+    # lots of DNS lookups
+    "--ignore=tests/test_sockets.py"
+  ] ++ lib.optionals stdenv.isDarwin [
+    # darwin sandboxing limitations
+    "--ignore=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/anyjson/default.nix b/nixpkgs/pkgs/development/python-modules/anyjson/default.nix
new file mode 100644
index 000000000000..1d0d02988f83
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/anyjson/default.nix
@@ -0,0 +1,22 @@
+{ lib, buildPythonPackage, fetchPypi, isPy3k, nose }:
+
+buildPythonPackage rec {
+  pname = "anyjson";
+  version = "0.3.3";
+
+  # The tests are written in a python2 syntax but anyjson is python3 valid
+  doCheck = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "37812d863c9ad3e35c0734c42e0bf0320ce8c3bed82cd20ad54cb34d158157ba";
+  };
+
+  buildInputs = [ nose ];
+
+  meta = with lib; {
+    homepage = "https://bitbucket.org/runeh/anyjson/";
+    description = "Wrapper that selects the best available JSON implementation";
+    license = licenses.bsd2;
+  };
+}
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..c11833ba5793
--- /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 = [ maintainers.worldofpeace ];
+  };
+}
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/apache-airflow/default.nix b/nixpkgs/pkgs/development/python-modules/apache-airflow/default.nix
new file mode 100644
index 000000000000..ca2cb03f9672
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/apache-airflow/default.nix
@@ -0,0 +1,196 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, fetchFromGitHub
+, fetchpatch
+, alembic
+, cached-property
+, configparser
+, colorlog
+, croniter
+, dill
+, flask
+, flask-appbuilder
+, flask-admin
+, flask-caching
+, flask_login
+, flask-swagger
+, flask_wtf
+, flask-bcrypt
+, funcsigs
+, future
+, GitPython
+, gunicorn
+, iso8601
+, json-merge-patch
+, jinja2
+, ldap3
+, lxml
+, lazy-object-proxy
+, markdown
+, pandas
+, pendulum
+, psutil
+, pygments
+, python-daemon
+, python-dateutil
+, requests
+, setproctitle
+, snakebite
+, sqlalchemy
+, tabulate
+, tenacity
+, termcolor
+, text-unidecode
+, thrift
+, tzlocal
+, unicodecsv
+, zope_deprecation
+, enum34
+, typing
+, nose
+, python
+, pythonOlder
+, pythonAtLeast
+}:
+
+buildPythonPackage rec {
+  pname = "apache-airflow";
+  version = "1.10.5";
+  # Upstream does not yet support python 3.8
+  # https://github.com/apache/airflow/issues/8674
+  disabled = pythonOlder "3.5" || pythonAtLeast "3.8";
+
+  src = fetchFromGitHub rec {
+    owner = "apache";
+    repo = "airflow";
+    rev = version;
+    sha256 = "14fmhfwx977c9jdb2kgm93i6acx43l45ggj30rb37r68pzpb6l6h";
+  };
+
+  patches = [
+       # Not yet accepted: https://github.com/apache/airflow/pull/6562
+     (fetchpatch {
+       name = "avoid-warning-from-abc.collections";
+       url = "https://patch-diff.githubusercontent.com/raw/apache/airflow/pull/6562.patch";
+       sha256 = "0swpay1qlb7f9kgc56631s1qd9k82w4nw2ggvkm7jvxwf056k61z";
+     })
+       # Not yet accepted: https://github.com/apache/airflow/pull/6561
+     (fetchpatch {
+       name = "pendulum2-compatibility";
+       url = "https://patch-diff.githubusercontent.com/raw/apache/airflow/pull/6561.patch";
+       sha256 = "17hw8qyd4zxvib9zwpbn32p99vmrdz294r31gnsbkkcl2y6h9knk";
+     })
+  ];
+
+  propagatedBuildInputs = [
+    alembic
+    cached-property
+    colorlog
+    configparser
+    croniter
+    dill
+    flask
+    flask-admin
+    flask-appbuilder
+    flask-bcrypt
+    flask-caching
+    flask_login
+    flask-swagger
+    flask_wtf
+    funcsigs
+    future
+    GitPython
+    gunicorn
+    iso8601
+    json-merge-patch
+    jinja2
+    ldap3
+    lxml
+    lazy-object-proxy
+    markdown
+    pandas
+    pendulum
+    psutil
+    pygments
+    python-daemon
+    python-dateutil
+    requests
+    setproctitle
+    sqlalchemy
+    tabulate
+    tenacity
+    termcolor
+    text-unidecode
+    thrift
+    tzlocal
+    unicodecsv
+    zope_deprecation
+  ];
+
+  checkInputs = [
+    snakebite
+    nose
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "flask>=1.1.0, <2.0" "flask" \
+      --replace "jinja2>=2.10.1, <2.11.0" "jinja2" \
+      --replace "pandas>=0.17.1, <1.0.0" "pandas" \
+      --replace "flask-caching>=1.3.3, <1.4.0" "flask-caching" \
+      --replace "flask-appbuilder>=1.12.5, <2.0.0" "flask-appbuilder" \
+      --replace "flask-admin==1.5.3" "flask-admin" \
+      --replace "flask-login>=0.3, <0.5" "flask-login" \
+      --replace "pendulum==1.4.4" "pendulum" \
+      --replace "cached_property~=1.5" "cached_property" \
+      --replace "dill>=0.2.2, <0.3" "dill" \
+      --replace "configparser>=3.5.0, <3.6.0" "configparser" \
+      --replace "jinja2>=2.10.1, <2.11.0" "jinja2" \
+      --replace "colorlog==4.0.2" "colorlog" \
+      --replace "funcsigs==1.0.0" "funcsigs" \
+      --replace "flask-swagger==0.2.13" "flask-swagger" \
+      --replace "python-daemon>=2.1.1, <2.2" "python-daemon" \
+      --replace "alembic>=1.0, <2.0" "alembic" \
+      --replace "markdown>=2.5.2, <3.0" "markdown" \
+      --replace "future>=0.16.0, <0.17" "future" \
+      --replace "tenacity==4.12.0" "tenacity" \
+      --replace "text-unidecode==1.2" "text-unidecode" \
+      --replace "tzlocal>=1.4,<2.0.0" "tzlocal" \
+      --replace "sqlalchemy~=1.3" "sqlalchemy" \
+      --replace "gunicorn>=19.5.0, <20.0" "gunicorn"
+
+    # dumb-init is only needed for CI and Docker, not relevant for NixOS.
+    substituteInPlace setup.py \
+      --replace "'dumb-init>=1.2.2'," ""
+
+    substituteInPlace tests/core.py \
+      --replace "/bin/bash" "${stdenv.shell}"
+  '';
+
+  # allow for gunicorn processes to have access to python packages
+  makeWrapperArgs = [ "--prefix PYTHONPATH : $PYTHONPATH" ];
+
+  checkPhase = ''
+   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 initdb
+   airflow resetdb -y
+   nosetests tests.core.CoreTest
+   ## all tests
+   # nosetests --cover-package=airflow
+  '';
+
+  meta = with lib; {
+    description = "Programmatically author, schedule and monitor data pipelines";
+    homepage = "http://airflow.apache.org/";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ bhipple costrouc ingenieroariel ];
+  };
+}
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..604c37b42ba1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/apipkg/default.nix
@@ -0,0 +1,41 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi
+, pytest, setuptools_scm, isPy3k }:
+
+buildPythonPackage rec {
+  pname = "apipkg";
+  version = "1.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "37228cda29411948b422fae072f57e31d3396d2ee1c9783775980ee9c9990af6";
+  };
+
+  nativeBuildInputs = [ setuptools_scm ];
+  checkInputs = [ pytest ];
+
+  # Fix pytest 4 support. See: https://github.com/pytest-dev/apipkg/issues/14
+  postPatch = ''
+    substituteInPlace "test_apipkg.py" \
+      --replace "py.test.ensuretemp('test_apipkg')" "py.path.local('test_apipkg')"
+  '';
+
+  # Failing tests on Python 3
+  # https://github.com/pytest-dev/apipkg/issues/17
+  checkPhase = let
+    disabledTests = lib.optionals isPy3k [
+      "test_error_loading_one_element"
+      "test_aliasmodule_proxy_methods"
+      "test_eagerload_on_bython"
+    ];
+    testExpression = lib.optionalString (disabledTests != [])
+    "-k 'not ${lib.concatStringsSep " and not " disabledTests}'";
+  in ''
+    py.test ${testExpression}
+  '';
+
+  meta = with lib; {
+    description = "Namespace control and lazy-import mechanism";
+    homepage = "https://github.com/pytest-dev/apipkg";
+    license = licenses.mit;
+  };
+}
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..0dea059f76af
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/apispec/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pyyaml
+, prance
+, marshmallow
+, pytestCheckHook
+, mock
+, openapi-spec-validator
+}:
+
+buildPythonPackage rec {
+  pname = "apispec";
+  version = "4.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "360e28e5e84a4d7023b16de2b897327fe3da63ddc8e01f9165b9113b7fe1c48a";
+  };
+
+  checkInputs = [
+    pyyaml
+    prance
+    openapi-spec-validator
+    marshmallow
+    mock
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "A pluggable API specification generator. Currently supports the OpenAPI Specification (f.k.a. the Swagger specification";
+    homepage = "https://github.com/marshmallow-code/apispec";
+    license = licenses.mit;
+    maintainers = [ 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..e253c610c214
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aplpy/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, numpy
+, astropy
+, astropy-helpers
+, matplotlib
+, reproject
+, pyavm
+, pyregion
+, pillow
+, scikitimage
+, shapely
+, pytest
+, pytest-astropy
+}:
+
+buildPythonPackage rec {
+  pname = "aplpy";
+  version = "2.0.3";
+  format = "pyproject";
+
+  src = fetchPypi {
+    pname = "APLpy";
+    inherit version;
+    sha256 = "239f3d83635ca4251536aeb577df7c60df77fc4d658097b92094719739aec3f3";
+  };
+
+  patches = [ (fetchpatch {
+      # Can be removed in next release after 2.0.3
+      url = "https://github.com/aplpy/aplpy/pull/448.patch";
+      sha256 = "1pnzh7ykjc8hwahzbzyryrzv5a8fddgd1bmzbhagkrn6lmvhhpvq";
+      excludes = [ "tox.ini" "azure-pipelines.yml" ".circleci/config.yml" "MANIFEST.in" ".gitignore"
+       "setup.cfg" "appveyor.yml" "readthedocs.yml" "CHANGES.rst" ".gitmodules" ".travis.yml" "astropy_helpers" ];
+    })
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    astropy
+    matplotlib
+    reproject
+    pyavm
+    pyregion
+    pillow
+    scikitimage
+    shapely
+  ];
+
+  nativeBuildInputs = [ astropy-helpers ];
+  checkInputs = [ pytest pytest-astropy ];
+
+  checkPhase = ''
+    OPENMP_EXPECTED=0 pytest aplpy
+  '';
+
+  meta = with lib; {
+    description = "The Astronomical Plotting Library in Python";
+    homepage = "http://aplpy.github.io";
+    license = licenses.mit;
+    maintainers = [ 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/application/default.nix b/nixpkgs/pkgs/development/python-modules/application/default.nix
new file mode 100644
index 000000000000..90b21baafdda
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/application/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, fetchFromGitHub, zope_interface, isPy3k }:
+
+buildPythonPackage rec {
+  pname = "python-application";
+  version = "2.8.0";
+  disabled = isPy3k;
+
+  src = fetchFromGitHub {
+    owner = "AGProjects";
+    repo = pname;
+    rev = "release-${version}";
+    sha256 = "1xd2gbpmx2ghap9cnr1h6sxjai9419bdp3y9qp5lh67977m0qg30";
+  };
+
+  buildInputs = [ zope_interface ];
+
+  # No tests upstream to run
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Basic building blocks for python applications";
+    homepage = "https://github.com/AGProjects/python-application";
+    changelog = "https://github.com/AGProjects/python-application/blob/master/ChangeLog";
+    license = licenses.lgpl2Plus;
+  };
+}
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..9f77d4352647
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/applicationinsights/default.nix
@@ -0,0 +1,24 @@
+{ buildPythonPackage
+, lib
+, fetchPypi
+, portalocker
+}:
+
+buildPythonPackage rec {
+  version = "0.11.9";
+  pname = "applicationinsights";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1hyjdv6xnswgqvip8y164piwfach9hjkbp7vc2qzhd7amjpim89h";
+  };
+
+  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..2380fb7d8adf
--- /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.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "8b995ffe925347a2138d7ac0fe77155e4311a0ea6d6da4f5128fe4b3cbe5ed71";
+  };
+
+  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..c3f318503884
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/apprise/default.nix
@@ -0,0 +1,37 @@
+{ lib, buildPythonPackage, fetchPypi, installShellFiles
+, Babel, requests, requests_oauthlib, six, click, markdown, pyyaml
+, pytestrunner, coverage, flake8, mock, pytestCheckHook, pytestcov, tox, gntp, sleekxmpp
+}:
+
+buildPythonPackage rec {
+  pname = "apprise";
+  version = "0.9.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "bab3563bc1e0c64938c4c7700112797bd99f20eb5d4a3e6038338bc8f060e153";
+  };
+
+  nativeBuildInputs = [ Babel installShellFiles ];
+
+  propagatedBuildInputs = [
+    requests requests_oauthlib six click markdown pyyaml
+  ];
+
+  checkInputs = [
+    pytestrunner coverage flake8 mock pytestCheckHook pytestcov tox gntp sleekxmpp
+  ];
+
+  disabledTests = [ "test_apprise_cli_nux_env"  ];
+
+  postInstall = ''
+    installManPage packaging/man/apprise.1
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/caronc/apprise";
+    description = "Push Notifications that work with just about every platform!";
+    license = licenses.mit;
+    maintainers = [ 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..bc47de371288
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/approvaltests/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub, isPy37, pyperclip }:
+
+buildPythonPackage rec {
+  version = "0.2.6";
+  pname = "approvaltests";
+
+  # no tests included in PyPI tarball
+  src = fetchFromGitHub {
+    owner = "approvals";
+    repo = "ApprovalTests.Python";
+    rev = version;
+    sha256 = "1k1bj8q1qm89a8xm4az6qk4qswwmgxw5jpdjcxmf93zh5hrcy9h9";
+  };
+
+  propagatedBuildInputs = [ pyperclip ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "pyperclip==1.5.27" "pyperclip>=1.5.27"
+  '';
+
+  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/apptools/default.nix b/nixpkgs/pkgs/development/python-modules/apptools/default.nix
new file mode 100644
index 000000000000..a03b051b11d2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/apptools/default.nix
@@ -0,0 +1,39 @@
+{ lib, fetchPypi, buildPythonPackage, fetchpatch
+, configobj, six, traitsui
+, nose, tables, pandas
+}:
+
+buildPythonPackage rec {
+  pname = "apptools";
+  version = "4.5.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "10h52ibhr2aw076pivqxiajr9rpcr1mancg6xlpxzckcm3if02i6";
+  };
+
+  # PyTables issue; should be merged in next post-4.5.0 release (#117)
+  patches = [ (fetchpatch {
+      url = "https://github.com/enthought/apptools/commit/3734289d1a0ebd8513fa67f75288add31ed0113c.patch";
+      sha256 = "001012q1ib5cbib3nq1alh9ckzj588bfrywr8brkd1f6y1pgvngk";
+    })
+  ];
+
+  propagatedBuildInputs = [ configobj six traitsui ];
+
+  checkInputs = [
+    nose
+    tables
+    pandas
+  ];
+
+  doCheck = true;
+  checkPhase = "HOME=$TMP nosetests";
+
+  meta = with lib; {
+    description = "Set of packages that Enthought has found useful in creating a number of applications.";
+    homepage = "https://github.com/enthought/apptools";
+    maintainers = with maintainers; [ knedlsepp ];
+    license = licenses.bsdOriginal;
+  };
+}
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..de74480765a0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/apsw/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub, fetchpatch
+, sqlite, isPyPy }:
+
+buildPythonPackage rec {
+  pname = "apsw";
+  version = "3.33.0-r1";
+
+  disabled = isPyPy;
+
+  src = fetchFromGitHub {
+    owner = "rogerbinns";
+    repo = "apsw";
+    rev = version;
+    sha256 = "05mxcw1382xx22285fnv92xblqby3adfrvvalaw4dc6rzsn6kcan";
+  };
+
+  buildInputs = [ sqlite ];
+
+  meta = with lib; {
+    description = "A Python wrapper for the SQLite embedded relational database engine";
+    homepage = "https://github.com/rogerbinns/apsw";
+    license = licenses.zlib;
+  };
+}
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..ad5f64146a69
--- /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.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "zzGPpdUdLSJPpJv2vbu0aE9r0sBot1z84OYH+JrBmdw=";
+  };
+
+  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/archinfo/default.nix b/nixpkgs/pkgs/development/python-modules/archinfo/default.nix
new file mode 100644
index 000000000000..4506f422f928
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/archinfo/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, nose
+}:
+
+buildPythonPackage rec {
+  pname = "archinfo";
+  version = "9.0.5327";
+
+  src = fetchFromGitHub {
+    owner = "angr";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0r7nj2hf51c954ihfxyhpbz1sd9lrc6i9zfkz11s22wpggvp06mz";
+  };
+
+  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 = [ maintainers.fab ];
+  };
+}
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..53353a137886
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aresponses/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, isPy3k
+, pytest
+, pytest-asyncio
+, pytest-cov
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "aresponses";
+  version = "2.1.2";
+
+  disabled = !isPy3k;
+
+  src = fetchFromGitHub {
+    owner = "CircleUp";
+    repo = pname;
+    rev = version;
+    sha256 = "007wrk4wdy97a81imgzxd6sm5dly9v7abmxh9fyfi0vp1p7s75bw";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  buildInputs = [
+    pytest
+    pytest-asyncio
+  ];
+
+  checkInputs = [
+    aiohttp
+    pytest-asyncio
+    pytest-cov
+    pytestCheckHook
+  ];
+
+  # Disable tests which requires network access
+  disabledTests = [
+    "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..f2a9db40f60f
--- /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 = "1.12.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "de0e1282330940d52ea92a80fea2e4b9e0da1932aaa570f84d268939d1897b04";
+  };
+
+  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..0e2beb6a31eb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/argh/default.nix
@@ -0,0 +1,34 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, pytest
+, py
+, mock
+, glibcLocales
+, iocapture
+}:
+
+buildPythonPackage rec {
+  pname = "argh";
+  version = "0.26.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "e9535b8c84dc9571a48999094fda7f33e63c3f1b74f3e5f3ac0105a58405bb65";
+  };
+
+  checkInputs = [ pytest py mock glibcLocales iocapture ];
+
+  checkPhase = ''
+    export LANG="en_US.UTF-8"
+    py.test
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/neithere/argh/";
+    description = "An unobtrusive argparse wrapper with natural syntax";
+    license = licenses.lgpl2;
+    maintainers = with maintainers; [ domenkozar ];
+  };
+
+}
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..85c6c4b638a5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/argon2_cffi/default.nix
@@ -0,0 +1,34 @@
+{ cffi
+, six
+, enum34
+, hypothesis
+, pytest
+, wheel
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+, lib
+}:
+
+buildPythonPackage rec {
+  pname = "argon2_cffi";
+  version = "19.2.0";
+
+  src = fetchPypi {
+    pname = "argon2-cffi";
+    inherit version;
+    sha256 = "ffaa623eea77b497ffbdd1a51e941b33d3bf552c60f14dbee274c4070677bda3";
+  };
+
+  propagatedBuildInputs = [ cffi six ] ++ lib.optional (!isPy3k) enum34;
+  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/args/default.nix b/nixpkgs/pkgs/development/python-modules/args/default.nix
new file mode 100644
index 000000000000..cb349484f276
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/args/default.nix
@@ -0,0 +1,16 @@
+{ lib, stdenv, 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..076fec8c56ba
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aria2p/default.nix
@@ -0,0 +1,43 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub, pythonOlder
+, aria2, poetry, pytest, pytestcov, 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 pytestcov 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..29c5e4381036
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/arpeggio/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, glibcLocales
+, pytestrunner
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "Arpeggio";
+  version = "1.10.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "920d12cc762edb2eb56daae64a14c93e43dc181b481c88fc79314c0df6ee639e";
+  };
+
+  # Shall not be needed for next release
+  LC_ALL = "en_US.UTF-8";
+  buildInputs = [ glibcLocales ];
+
+  nativeBuildInputs = [ pytestrunner ];
+
+  checkInputs = [ pytestCheckHook ];
+
+  disabledTests = [ "test_examples" "test_issue_22" ];
+
+  dontUseSetuptoolsCheck = true;
+
+  meta = {
+    description = "Packrat parser interpreter";
+    license = lib.licenses.mit;
+  };
+}
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..82c8fc93267f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/arrayqueues/default.nix
@@ -0,0 +1,25 @@
+{ lib, pkgs, buildPythonPackage, fetchPypi, isPy3k
+, numpy
+}:
+
+buildPythonPackage rec {
+  pname = "arrayqueues";
+  version = "1.2.0b0";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1gvrxb2rw0dk469wq5azylar7hhanfp07gl5mc6ajdbgz9gsd6ln";
+  };
+
+  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/arrow/default.nix b/nixpkgs/pkgs/development/python-modules/arrow/default.nix
new file mode 100644
index 000000000000..7dbe3b98fca3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/arrow/default.nix
@@ -0,0 +1,40 @@
+{ stdenv, lib, buildPythonPackage, fetchPypi, isPy27
+, nose, chai, simplejson, backports_functools_lru_cache
+, python-dateutil, pytz, pytest-mock, sphinx, dateparser, pytestcov
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "arrow";
+  version = "0.17.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ff08d10cda1d36c68657d6ad20d74fbea493d980f8b2d45344e00d6ed2bf6ed4";
+  };
+
+  propagatedBuildInputs = [ python-dateutil ]
+    ++ lib.optionals isPy27 [ backports_functools_lru_cache ];
+
+  checkInputs = [
+    dateparser
+    pytestCheckHook
+    pytestcov
+    pytest-mock
+    pytz
+    simplejson
+    sphinx
+  ];
+
+  # ParserError: Could not parse timezone expression "America/Nuuk"
+  disabledTests = [
+    "test_parse_tz_name_zzz"
+  ];
+
+  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..4005c8668117
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/arviz/default.nix
@@ -0,0 +1,92 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, bokeh
+, emcee
+, matplotlib
+, netcdf4
+, numba
+, numpy
+, pandas
+, pytest
+, scipy
+, setuptools
+, tensorflow-probability
+, xarray
+#, h5py (used by disabled tests)
+#, pymc3 (broken)
+#, pyro-ppl (broken)
+#, pystan (not packaged)
+#, numpyro (not packaged)
+}:
+
+buildPythonPackage rec {
+  pname = "arviz";
+  version = "0.10.0";
+
+  src = fetchFromGitHub {
+    owner = "arviz-devs";
+    repo = "arviz";
+    rev = "v${version}";
+    sha256 = "1cnj972knkvi084cfcpc12lv0wxm8xm9clfd55r3hvv42g1ms5d9";
+  };
+
+  propagatedBuildInputs = [
+    # needed to install
+    matplotlib
+    netcdf4
+    pandas
+    xarray
+    # needed to import
+    setuptools
+    # not needed to import, but used by many functions
+    # and is listed as a dependency in the documentation
+    numpy
+    scipy
+  ];
+
+  checkInputs = [
+    bokeh
+    emcee
+    numba
+    pytest
+    tensorflow-probability
+    #h5py (used by disabled tests)
+    #pymc3 (broken)
+    #pyro-ppl (broken)
+    #pystan (not packaged)
+    #numpyro (not packaged)
+  ];
+
+  # check requires pymc3 and pyro-ppl, which are currently broken, and pystan
+  # and numpyro, which are not yet packaged, some checks also need to make
+  # directories and do not have permission to do so. So we can only check part
+  # of the package
+  # Additionally, there are some failures with the plots test, which revolve
+  # around attempting to output .mp4 files through an interface that only wants
+  # to output .html files.
+  # The following test have been disabled as a result: data_cmdstanpy,
+  # data_numpyro, data_pyro, data_pystan, and plots.
+  checkPhase = ''
+    cd arviz/tests/
+    export HOME=$TMPDIR
+    pytest \
+      base_tests/test_data.py \
+      base_tests/test_diagnostics.py \
+      base_tests/test_plot_utils.py \
+      base_tests/test_rcparams.py \
+      base_tests/test_stats.py \
+      base_tests/test_stats_utils.py \
+      base_tests/test_utils.py \
+      external_tests/test_data_cmdstan.py \
+      external_tests/test_data_emcee.py \
+      external_tests/test_data_tfp.py
+  '';
+
+  meta = with lib; {
+    description = "ArviZ is a Python package for exploratory analysis of Bayesian models";
+    homepage = "https://arviz-devs.github.io/arviz/";
+    license = licenses.asl20;
+    maintainers = [ 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..ed5e441df970
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/asana/default.nix
@@ -0,0 +1,37 @@
+{ buildPythonPackage, pythonAtLeast, pytest, requests, requests_oauthlib, six
+, fetchFromGitHub, responses, lib, stdenv
+}:
+
+buildPythonPackage rec {
+  pname = "asana";
+  version = "0.10.3";
+
+  # upstream reportedly doesn't support 3.7 yet, blocked on
+  # https://bugs.python.org/issue34226
+  disabled = pythonAtLeast "3.7";
+
+  src = fetchFromGitHub {
+    owner = "asana";
+    repo = "python-asana";
+    rev = "v${version}";
+    sha256 = "11nsfygcfpc2qb2gy4npi9w00cqfh88g7k3rsfq7xambz1zjdz1n";
+  };
+
+  checkInputs = [ pytest responses ];
+  propagatedBuildInputs = [ requests requests_oauthlib six ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "requests_oauthlib >= 0.8.0, == 0.8.*" "requests_oauthlib>=0.8.0<2.0"
+  '';
+
+  checkPhase = ''
+    py.test tests
+  '';
+
+  meta = with lib; {
+    description = "Python client library for Asana";
+    homepage = "https://github.com/asana/python-asana";
+    license = licenses.mit;
+  };
+}
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..aafbaa15ffe7
--- /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.12.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "4120461a3fb345638dee4fe0f8a3d3f9b6d2d2e003f95c5f914523f94463158d";
+  };
+
+  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/default.nix b/nixpkgs/pkgs/development/python-modules/asdf/default.nix
new file mode 100644
index 000000000000..4006a034d48d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/asdf/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest-astropy
+, semantic-version
+, pyyaml
+, jsonschema
+, six
+, numpy
+, isPy27
+, astropy
+, setuptools_scm
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "asdf";
+  version = "2.7.1";
+  disabled = isPy27;
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "4ba2e31cb24b974a10dfae3edee23db2e6bea2d00608604d062366aa3af6e81a";
+  };
+
+  checkInputs = [
+    pytest-astropy
+    astropy
+  ];
+
+  propagatedBuildInputs = [
+    semantic-version
+    pyyaml
+    jsonschema
+    six
+    numpy
+    setuptools_scm
+    setuptools
+  ];
+
+  checkPhase = ''
+    PY_IGNORE_IMPORTMISMATCH=1 pytest
+  '';
+
+  meta = with lib; {
+    description = "Python tools to handle ASDF files";
+    homepage = "https://github.com/spacetelescope/asdf";
+    license = licenses.bsd3;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ase/3.17.nix b/nixpkgs/pkgs/development/python-modules/ase/3.17.nix
new file mode 100644
index 000000000000..40b9b405aab1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ase/3.17.nix
@@ -0,0 +1,36 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, numpy
+, scipy
+, matplotlib
+, flask
+, pillow
+, psycopg2
+}:
+
+buildPythonPackage rec {
+  pname = "ase";
+  version = "3.17.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1d4gxypaahby45zcpl0rffcn2z7n55dg9lcd8sv6jjsmbbf9vr4g";
+  };
+
+  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;
+
+  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/ase/default.nix b/nixpkgs/pkgs/development/python-modules/ase/default.nix
new file mode 100644
index 000000000000..fcbeb1f1f4d9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ase/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, isPy27
+, numpy
+, scipy
+, matplotlib
+, flask
+, pillow
+, psycopg2
+}:
+
+buildPythonPackage rec {
+  pname = "ase";
+  version = "3.20.1";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "72c81f21b6adb907595fce8d883c0231301cbd8e9f6e5ce8e98bab927054daca";
+  };
+
+  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;
+
+  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/asgi-csrf/default.nix b/nixpkgs/pkgs/development/python-modules/asgi-csrf/default.nix
new file mode 100644
index 000000000000..4988a04e8e44
--- /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.8";
+  pname = "asgi-csrf";
+  disabled = isPy27;
+
+  # PyPI tarball doesn't include tests directory
+  src = fetchFromGitHub {
+    owner = "simonw";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-0I/p9SjVVZhJQeR7s1R3tooP9XMNLPlcxl0dBSzsVaw=";
+  };
+
+  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/asgiref/default.nix b/nixpkgs/pkgs/development/python-modules/asgiref/default.nix
new file mode 100644
index 000000000000..ec630c40d034
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/asgiref/default.nix
@@ -0,0 +1,40 @@
+{ stdenv
+, async-timeout
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, lib
+}:
+
+buildPythonPackage rec {
+  version = "3.3.1";
+  pname = "asgiref";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "django";
+    repo = pname;
+    rev = version;
+    sha256 = "00r4l9x425wkbac6b6c2ksm2yjinrvvdf0ajizrzq32h0jg82016";
+  };
+
+  propagatedBuildInputs = [ async-timeout ];
+
+  checkInputs = [
+    pytestCheckHook
+    pytest-asyncio
+  ];
+
+  disabledTests = lib.optionals stdenv.isDarwin [
+    "test_multiprocessing"
+  ];
+
+  meta = with lib; {
+    description = "Reference ASGI adapters and channel layers";
+    license = licenses.bsd3;
+    homepage = "https://github.com/django/asgiref";
+  };
+}
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..2735bbf2f70f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/asn1ate/default.nix
@@ -0,0 +1,22 @@
+{ lib, stdenv, 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..989b974c64a6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/asn1crypto/default.nix
@@ -0,0 +1,23 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "asn1crypto";
+  version = "1.4.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f4f6e119474e58e04a2b1af817eb585b4fd72bdd89b998624712b5c99be7641c";
+  };
+
+  # No tests included
+  doCheck = false;
+
+  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/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/astor/default.nix b/nixpkgs/pkgs/development/python-modules/astor/default.nix
new file mode 100644
index 000000000000..0d7aa3877125
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/astor/default.nix
@@ -0,0 +1,29 @@
+{ lib, buildPythonPackage, fetchPypi, isPy27, pytestCheckHook, fetchpatch }:
+
+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..4ea53e17eb0e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/astral/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv, 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/1.6.nix b/nixpkgs/pkgs/development/python-modules/astroid/1.6.nix
new file mode 100644
index 000000000000..2c763e214e87
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/astroid/1.6.nix
@@ -0,0 +1,39 @@
+{ lib, fetchPypi, buildPythonPackage
+, lazy-object-proxy, six, wrapt, enum34, singledispatch, backports_functools_lru_cache
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "astroid";
+  version = "1.6.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d25869fc7f44f1d9fb7d24fd7ea0639656f5355fc3089cd1f3d18c6ec6b124c7";
+  };
+
+  # From astroid/__pkginfo__.py
+  propagatedBuildInputs = [
+    lazy-object-proxy
+    six
+    wrapt
+    enum34
+    singledispatch
+    backports_functools_lru_cache
+  ];
+
+  checkInputs = [ pytest ];
+
+  checkPhase = ''
+    # test_builtin_help is broken
+    pytest -k "not test_builtin_help and not test_namespace_and_file_mismatch and not test_namespace_package_pth_support and not test_nested_namespace_import" astroid
+  '';
+
+  meta = with lib; {
+    description = "An abstract syntax tree for Python with inference support";
+    homepage = "https://github.com/PyCQA/astroid";
+    license = licenses.lgpl2;
+    platforms = platforms.all;
+    maintainers = with maintainers; [ nand0p ];
+  };
+}
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..49f04bcb9116
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/astroid/default.nix
@@ -0,0 +1,35 @@
+{ lib, fetchPypi, buildPythonPackage, pythonOlder, isPyPy, pythonAtLeast
+, lazy-object-proxy, six, wrapt, typing, typed-ast
+, pytestrunner, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "astroid";
+  version = "2.4.2";
+
+  disabled = pythonOlder "3.4" || pythonAtLeast "3.9";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "2f4078c2a41bf377eea06d71c9d2ba4eb8f6b1af2135bec27bbbb7d8f12bb703";
+  };
+
+  postPatch = ''
+    substituteInPlace astroid/__pkginfo__.py --replace "lazy_object_proxy==1.4.*" "lazy_object_proxy"
+  '';
+
+  # From astroid/__pkginfo__.py
+  propagatedBuildInputs = [ lazy-object-proxy six wrapt ]
+    ++ lib.optional (pythonOlder "3.5") typing
+    ++ lib.optional (!isPyPy) typed-ast;
+
+  checkInputs = [ pytestrunner pytest ];
+
+  meta = with lib; {
+    description = "An abstract syntax tree for Python with inference support";
+    homepage = "https://github.com/PyCQA/astroid";
+    license = licenses.lgpl2;
+    platforms = platforms.all;
+    maintainers = with maintainers; [ nand0p ];
+  };
+}
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..bd9dca338fcd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/astropy-extension-helpers/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "extension-helpers";
+  version = "0.1";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "10iqjzmya2h4sk765dlm1pbqypwlqyh8rw59a5m9i63d3klnz2mc";
+  };
+
+  patches = [ ./permissions.patch ];
+
+  checkInputs = [ pytestCheckHook ];
+
+  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 = [ 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..61f49322d3bb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/astropy-healpix/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, numpy
+, astropy
+, astropy-helpers
+}:
+
+buildPythonPackage rec {
+  pname = "astropy-healpix";
+  version = "0.5";
+
+  doCheck = false; # tests require pytest-astropy
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1bfdq33mj6mwk5fkc6n23f9bc9z8j7kmvql3zchz4h58jskmvqas";
+  };
+
+  propagatedBuildInputs = [ numpy astropy astropy-helpers ];
+
+  # Disable automatic update of the astropy-helper module
+  postPatch = ''
+    substituteInPlace setup.cfg --replace "auto_use = True" "auto_use = False"
+  '';
+
+  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..9ffcba63954b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/astropy/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, fetchPypi
+, setuptools_scm
+, buildPythonPackage
+, isPy3k
+, cython
+, jinja2
+, numpy
+, pytest
+, pytest-astropy
+, astropy-helpers
+, astropy-extension-helpers
+, pyerfa
+}:
+
+buildPythonPackage rec {
+  pname = "astropy";
+  version = "4.2";
+  format = "pyproject";
+
+  disabled = !isPy3k; # according to setup.py
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "2c194f8a429b8399de64a413a06881ea49f0525cabaa2d78fc132b9e970adc6a";
+  };
+
+  nativeBuildInputs = [ setuptools_scm astropy-helpers astropy-extension-helpers cython jinja2 ];
+  propagatedBuildInputs = [ numpy pyerfa ];
+  checkInputs = [ pytest pytest-astropy ];
+
+  preBuild = ''
+    export SETUPTOOLS_SCM_PRETEND_VERSION="${version}"
+  '';
+
+  # Tests must be run from the build directory.  astropy/samp tests
+  # require a network connection, so we ignore them. For some reason
+  # pytest --ignore does not work, so we delete the tests instead.
+  checkPhase = ''
+    cd build/lib.*
+    rm -f astropy/samp/tests/*
+    pytest
+  '';
+
+  # 368 failed, 10889 passed, 978 skipped, 69 xfailed in 196.24s
+  # doCheck = false;
+  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..f7764149a663
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/astroquery/default.nix
@@ -0,0 +1,48 @@
+{ pkgs
+, buildPythonPackage
+, fetchPypi
+, astropy
+, requests
+, keyring
+, beautifulsoup4
+, html5lib
+, pytest
+, pytest-astropy
+, astropy-helpers
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "astroquery";
+  version = "0.4.1";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0xpqrl9h7sg55mql38xsfpbz9rxsm3mxfha1biqyly1gmxpmd47a";
+  };
+
+  disabled = !isPy3k;
+
+  propagatedBuildInputs = [ astropy requests keyring beautifulsoup4 html5lib ];
+
+  nativeBuildInputs = [ astropy-helpers ];
+
+  # Tests disabled until pytest-astropy has been updated to include pytest-astropy-header
+  doCheck = false;
+  checkInputs = [ pytest pytest-astropy ];
+
+  # Tests must be run in the build directory. The tests create files
+  # in $HOME/.astropy so we need to set HOME to $TMPDIR.
+  checkPhase = ''
+    cd build/lib
+    HOME=$TMPDIR pytest
+  '';
+
+  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..0f090d14abad
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/asttokens/default.nix
@@ -0,0 +1,25 @@
+{ lib, fetchPypi, buildPythonPackage,
+  setuptools_scm, toml, six, astroid, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "asttokens";
+  version = "2.0.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0a2ixiz04aw4p0aivxh47k3fa9ql804l3y5iv5gcih9aizi5fbm4";
+  };
+
+  propagatedBuildInputs = [ setuptools_scm toml six astroid ];
+
+  checkInputs = [ pytest ];
+
+  meta = with lib; {
+    homepage = "https://github.com/gristlabs/asttokens";
+    description = "Annotate Python AST trees with source text and token information";
+    license = licenses.asl20;
+    platforms = platforms.all;
+    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..c9001da5c70f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/astunparse/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv
+, 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-upnp-client/default.nix b/nixpkgs/pkgs/development/python-modules/async-upnp-client/default.nix
new file mode 100644
index 000000000000..6697cb5d13e8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/async-upnp-client/default.nix
@@ -0,0 +1,36 @@
+{ lib, buildPythonPackage, fetchFromGitHub, pythonOlder
+, voluptuous, aiohttp, async-timeout, python-didl-lite, defusedxml
+, pytest_6, pytest-asyncio }:
+
+buildPythonPackage rec {
+  pname = "async-upnp-client";
+  version = "0.14.15";
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "StevenLooman";
+    repo = "async_upnp_client";
+    rev = version;
+    sha256 = "1mr65msdc51wq7326z3q41x79yi9dsmcjrmyzkgj9h9vgpxdk2nw";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    async-timeout
+    defusedxml
+    python-didl-lite
+    voluptuous
+  ];
+
+  checkInputs = [
+    pytest_6
+    pytest-asyncio
+  ];
+
+  meta = with lib; {
+    description = "Asyncio UPnP Client library for Python/asyncio.";
+    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..dfbd0dbb9968
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/async_generator/default.nix
@@ -0,0 +1,28 @@
+{ lib, buildPythonPackage, fetchPypi, pythonOlder, isPy35, pytest, pytest-asyncio }:
+
+buildPythonPackage rec {
+  pname = "async_generator";
+  version = "1.10";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "6ebb3d106c12920aaae42ccb6f787ef5eefdcdd166ea3d628fa8476abe712144";
+  };
+
+  checkInputs = [ pytest pytest-asyncio ];
+
+  checkPhase = ''
+    pytest -W error -ra -v --pyargs async_generator
+  '';
+
+  # disable tests on python3.5 to avoid circular dependency with pytest-asyncio
+  doCheck = !isPy35;
+
+  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 ];
+  };
+}
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..bb57a7f1ecf3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/async_stagger/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, pythonOlder
+, pytestCheckHook
+, pytest-asyncio
+, pytest-mock
+}:
+
+buildPythonPackage rec {
+  pname = "async_stagger";
+  version = "0.3.1";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1mj3daaqxjdavbxcjrdwx5ky9maa2blbv53aa6d7w9zxkrz3b7xa";
+  };
+
+  checkInputs = [
+    pytestCheckHook
+    pytest-asyncio
+    pytest-mock
+  ];
+
+  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..a1dbb521ce3d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/async_timeout/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "async-timeout";
+  version = "3.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0c3c816a028d47f659d6ff5c745cb2acf1f966da1fe5c19c77a70282b25f4c5f";
+  };
+
+  # Circular dependency on aiohttp
+  doCheck = false;
+
+  disabled = pythonOlder "3.4";
+
+  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/asyncio-dgram/default.nix b/nixpkgs/pkgs/development/python-modules/asyncio-dgram/default.nix
new file mode 100644
index 000000000000..14c800f568b0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/asyncio-dgram/default.nix
@@ -0,0 +1,37 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pytest-asyncio
+}:
+
+buildPythonPackage rec {
+  pname = "asyncio-dgram";
+  version = "1.1.1";
+
+  src = fetchFromGitHub {
+    owner = "jsbronder";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1zkmjvq47zw2fsbnzhr5mh9rsazx0z1f8m528ash25jrxsza5crm";
+  };
+
+  # OSError: AF_UNIX path too long
+  doCheck = !stdenv.isDarwin;
+
+  checkInputs = [
+    pytestCheckHook
+    pytest-asyncio
+  ];
+
+  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-throttle/default.nix b/nixpkgs/pkgs/development/python-modules/asyncio-throttle/default.nix
new file mode 100644
index 000000000000..bf08aec41a5b
--- /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.1";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "hallazzang";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0raqnrnp42cn1c7whbm7ajbgaczx33k6hbxsj30nh998pqxhh4sj";
+  };
+
+  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/asyncpg/default.nix b/nixpkgs/pkgs/development/python-modules/asyncpg/default.nix
new file mode 100644
index 000000000000..826ee6103fc0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/asyncpg/default.nix
@@ -0,0 +1,31 @@
+{ lib, isPy3k, fetchPypi, fetchpatch, buildPythonPackage
+, uvloop, postgresql }:
+
+buildPythonPackage rec {
+  pname = "asyncpg";
+  version = "0.21.0";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "53cb2a0eb326f61e34ef4da2db01d87ce9c0ebe396f65a295829df334e31863f";
+  };
+
+  checkInputs = [
+    uvloop
+    postgresql
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/MagicStack/asyncpg";
+    description = "An asyncio PosgtreSQL driver";
+    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/asyncssh/default.nix b/nixpkgs/pkgs/development/python-modules/asyncssh/default.nix
new file mode 100644
index 000000000000..d3684ea57200
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/asyncssh/default.nix
@@ -0,0 +1,55 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, pythonOlder
+, cryptography
+, bcrypt, gssapi, libnacl, libsodium, nettle, pyopenssl
+, openssl, openssh, pytestCheckHook }:
+
+buildPythonPackage rec {
+  pname = "asyncssh";
+  version = "2.5.0";
+  disabled = pythonOlder "3.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0b65e2af73a2e39a271bd627abbe4f7e4b0345486ed403e65987d79c72fcb70b";
+  };
+
+  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
+  ];
+
+  # Disables windows specific test (specifically the GSSAPI wrapper for Windows)
+  postPatch = ''
+    rm tests/sspi_stub.py
+  '';
+
+  propagatedBuildInputs = [
+    bcrypt
+    cryptography
+    gssapi
+    libnacl
+    libsodium
+    nettle
+    pyopenssl
+  ];
+
+  checkInputs = [
+    openssh
+    openssl
+    pytestCheckHook
+  ];
+
+  disabledTests = [ "test_expired_root" "test_confirm" ];
+
+  meta = with lib; {
+    description = "Provides an asynchronous client and server implementation of the SSHv2 protocol on top of the Python asyncio framework";
+    homepage = "https://asyncssh.readthedocs.io/en/latest";
+    license = licenses.epl20;
+    maintainers = with maintainers; [ worldofpeace ];
+  };
+}
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/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..077c5078caae
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/asyncwhois/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, aiodns
+, tldextract
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "asyncwhois";
+  version = "0.2.3";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "95df90d5be581e3c69398abc6a3ec69a4e568852d9d6df4582bfcc0e22ffb3bb";
+  };
+
+  propagatedBuildInputs = [
+    aiodns
+    tldextract
+  ];
+
+  # tests are only present at GitHub but not the released source tarballs
+  # https://github.com/pogzyb/asyncwhois/issues/10
+  doCheck = false;
+  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..66c66535a127
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/asysocks/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "asysocks";
+  version = "0.0.11";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "11ygrhkqm524i4qp2myjvpsmg1lsn32nsqxqla96sbj84qfnhv0q";
+  };
+
+  # 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..c8307608204a
--- /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.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1np9p3d180c26p54nw33alb003lhx6fprr21h45dd8gqk3slm13c";
+  };
+
+  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..b1f0df0b3bc0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/atlassian-python-api/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+, certifi
+, chardet
+, deprecated
+, idna
+, oauthlib
+, requests
+, requests_oauthlib
+, six
+, urllib3
+, pytestrunner
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "atlassian-python-api";
+  version = "2.1.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f852bfd293fdcb0ab2d7a9ea907f8303cf14fe6f55e90c103d4de00393ea9555";
+  };
+
+  checkInputs = [ pytestrunner pytest ];
+
+  propagatedBuildInputs = [ deprecated oauthlib requests requests_oauthlib six ];
+
+  meta = with lib; {
+    description = "Python Atlassian REST API Wrapper";
+    homepage = "https://github.com/atlassian-api/atlassian-python-api";
+    license = licenses.asl20;
+    maintainers = [ 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..cb9503fe6e9c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/atom/default.nix
@@ -0,0 +1,24 @@
+{ lib, buildPythonPackage, fetchPypi, future, cppy }:
+
+buildPythonPackage rec {
+  pname = "atom";
+  version = "0.6.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "df65a654744ccdc4843ce09c38612fd8f702c84be501b1d955c3ac0b9ad28dc5";
+  };
+
+  buildInputs = [ cppy ];
+  propagatedBuildInputs = [ future ];
+
+  # Tests not released to pypi
+  doCheck = true;
+
+  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..7bcb36d548d8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/atomiclong/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv, 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/default.nix b/nixpkgs/pkgs/development/python-modules/atomicwrites/default.nix
new file mode 100644
index 000000000000..e958b0f16d62
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/atomicwrites/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, pytest }:
+
+buildPythonPackage rec {
+  pname = "atomicwrites";
+  version = "1.4.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a";
+  };
+
+  # 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..147d2e77debc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/atomman/default.nix
@@ -0,0 +1,39 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub, isPy27
+, cython
+, datamodeldict
+, matplotlib
+, numericalunits
+, numpy
+, pandas
+, pytest
+, scipy
+, toolz
+, xmltodict
+}:
+
+buildPythonPackage rec {
+  version = "1.3.0";
+  pname = "atomman";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "usnistgov";
+    repo  = "atomman";
+    rev = "v${version}";
+    sha256 = "09pfykd96wmw00s3kgabghykjn8b4yjml4ybpi7kwy7ygdmzcx51";
+  };
+
+  checkInputs = [ pytest ];
+  propagatedBuildInputs = [ xmltodict datamodeldict numpy matplotlib scipy pandas cython numericalunits toolz ];
+
+  checkPhase = ''
+    py.test tests -k 'not test_atomic'
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/usnistgov/atomman/";
+    description = "Atomistic Manipulation Toolkit";
+    license = licenses.mit;
+    maintainers = [ 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..41353598f895
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/atpublic/default.nix
@@ -0,0 +1,46 @@
+{ lib, isPy3k, pythonOlder, fetchPypi, buildPythonPackage
+, pytest
+, pytestcov
+, sybil
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "atpublic";
+  version = "2.1.1";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "fa1d48bcb85bbed90f6ffee6936578f65ff0e93aa607397bd88eaeb408bd96d8";
+  };
+
+  propagatedBuildInputs = lib.optionals (pythonOlder "3.8") [
+    typing-extensions
+  ];
+
+  checkInputs = [
+    pytest pytestcov sybil
+  ];
+
+  checkPhase = ''
+    pytest
+  '';
+
+  meta = with lib; {
+    homepage = "https://public.readthedocs.io/en/latest/";
+    description = "A decorator and function which populates a module's __all__ and globals";
+    longDescription = ''
+      This is a very simple decorator and function which populates a module's
+      __all__ and optionally the module globals.
+
+      This provides both a pure-Python implementation and a C implementation. It is
+      proposed that the C implementation be added to builtins_ for Python 3.6.
+
+      This proposal seems to have been rejected, for more information see
+      https://bugs.python.org/issue26632.
+    '';
+    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..6b8b8dccef81
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/atsim_potentials/default.nix
@@ -0,0 +1,49 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, configparser
+, pyparsing
+, pytest
+, future
+, openpyxl
+, wrapt
+}:
+
+buildPythonPackage rec {
+  version = "0.3.0";
+  pname = "atsim.potentials";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "70082fc40b0ab7565a671c2d764fe3db08bc6ce45da44e1c1e8b77a65d1f7a23";
+  };
+
+  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..5c7514f9da63
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/attrdict/default.nix
@@ -0,0 +1,19 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, coverage, nose, six }:
+
+buildPythonPackage rec {
+  pname = "attrdict";
+  version = "2.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "35c90698b55c683946091177177a9e9c0713a0860f0e049febd72649ccd77b70";
+  };
+
+  propagatedBuildInputs = [ coverage nose six ];
+
+  meta = with lib; {
+    description = "A dict with attribute-style access";
+    homepage = "https://github.com/bcj/AttrDict";
+    license = licenses.mit;
+  };
+}
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..7513aa04f300
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/attrs/default.nix
@@ -0,0 +1,30 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, pytest, hypothesis, zope_interface
+, pympler, coverage, six, clang }:
+
+buildPythonPackage rec {
+  pname = "attrs";
+  version = "20.3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700";
+  };
+
+  # macOS needs clang for testing
+  checkInputs = [
+    pytest hypothesis zope_interface pympler coverage six
+  ] ++ lib.optionals (stdenv.isDarwin) [ clang ];
+
+  checkPhase = ''
+    py.test
+  '';
+
+  # To prevent infinite recursion with pytest
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Python attributes without boilerplate";
+    homepage = "https://github.com/hynek/attrs";
+    license = licenses.mit;
+  };
+}
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..4616e1b6ed3f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aubio/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, numpy
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "aubio";
+  version = "0.4.9";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = version;
+    sha256 = "0fhxikvlr010nbh02g455d5y8bq6j5yw180cdh4gsd0hb43y3z26";
+  };
+
+  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/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..a4f6d9057654
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/audioread/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestrunner
+}:
+
+buildPythonPackage rec {
+  pname = "audioread";
+  version = "2.1.9";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a3480e42056c8e80a8192a54f6729a280ef66d27782ee11cbd63e9d4d1523089";
+  };
+
+  nativeBuildInputs = [ pytestrunner ];
+
+  # 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..1ad216082749
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/audiotools/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchurl
+, stdenv
+, darwin
+}:
+
+buildPythonPackage rec {
+  pname = "audiotools";
+  version = "3.1.1";
+
+  buildInputs = lib.optionals stdenv.isDarwin (with darwin.apple_sdk.frameworks; [
+    AudioToolbox
+    AudioUnit
+    CoreServices
+  ]);
+
+  src = fetchurl {
+    url = "https://github.com/tuffy/python-audio-tools/archive/v${version}.tar.gz";
+    sha256 = "0ymlxvqkqhzk4q088qwir3dq0zgwqlrrdfnq7f0iq97g05qshm2c";
+  };
+
+  meta = {
+    description = "Utilities and Python modules for handling audio";
+    homepage = "http://audiotools.sourceforge.net/";
+    license = lib.licenses.gpl2Plus;
+  };
+}
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..cf1d4544e4ad
--- /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 = if stdenv.isDarwin then "libaugeas.dylib" else "libaugeas.so";
+      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/auth0-python/default.nix b/nixpkgs/pkgs/development/python-modules/auth0-python/default.nix
new file mode 100644
index 000000000000..79844afe318e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/auth0-python/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, requests
+, mock
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "auth0-python";
+  version = "3.14.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ac7808d00676c5e7ffa9eaa228807ca1f8db7a0f4dc115337c80fb6d7eb2b50a";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  checkInputs = [
+    mock
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    # jwt package is not available in nixpkgs
+    "--ignore=auth0/v3/test/authentication/test_token_verifier.py"
+  ];
+
+  # tries to ping websites (e.g. google.com)
+  disabledTests = [
+    "can_timeout"
+  ];
+
+  meta = with lib; {
+    description = "Auth0 Python SDK";
+    homepage = "https://github.com/auth0/auth0-python";
+    license = licenses.mit;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..a1d049ebb151
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/authheaders/default.nix
@@ -0,0 +1,22 @@
+{ buildPythonPackage, fetchPypi, isPy27, lib
+, authres, dnspython, dkimpy, ipaddress, publicsuffix2
+}:
+
+buildPythonPackage rec {
+  pname = "authheaders";
+  version = "0.13.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "935726b784cc636cbcfed2c977f1a6887dc60056806da4eff60db932c5896692";
+  };
+
+  propagatedBuildInputs = [ authres dnspython dkimpy publicsuffix2 ]
+                          ++ lib.optional isPy27 ipaddress;
+
+  meta = {
+    description = "Python library for the generation of email authentication headers";
+    homepage = "https://github.com/ValiMail/authentication-headers";
+    license = lib.licenses.mit;
+  };
+}
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..3e6faae9af09
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/authlib/default.nix
@@ -0,0 +1,35 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, pytest
+, mock
+, cryptography
+, requests
+}:
+
+buildPythonPackage rec {
+  version = "0.15.3";
+  pname = "authlib";
+
+  src = fetchFromGitHub {
+    owner = "lepture";
+    repo = "authlib";
+    rev = "v${version}";
+    sha256 = "1lqicv8awyygqh1z8vhwvx38dw619kgbirdn8c9sc3qilagq1rdx";
+  };
+
+  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..c3d0402d48d1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/authres/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv, 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..12aa86774d88
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/autobahn/default.nix
@@ -0,0 +1,34 @@
+{ lib, buildPythonPackage, fetchPypi, isPy3k,
+  six, txaio, twisted, zope_interface, cffi, trollius, futures,
+  mock, pytest, cryptography, pynacl
+}:
+buildPythonPackage rec {
+  pname = "autobahn";
+  version = "20.12.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "15b8zm7jalwisfwc08szxy3bh2bnn0hd41dbsnswi0lqwbh962j1";
+  };
+
+  propagatedBuildInputs = [ six txaio twisted zope_interface cffi cryptography pynacl ] ++
+    (lib.optionals (!isPy3k) [ trollius futures ]);
+
+  checkInputs = [ mock pytest ];
+  checkPhase = ''
+    runHook preCheck
+    USE_TWISTED=true py.test $out
+    runHook postCheck
+  '';
+
+  # Tests do no seem to be compatible yet with pytest 5.1
+  # https://github.com/crossbario/autobahn-python/issues/1235
+  doCheck = false;
+
+  meta = with lib; {
+    description = "WebSocket and WAMP in Python for Twisted and asyncio.";
+    homepage    = "https://crossbar.io/autobahn";
+    license     = licenses.mit;
+    maintainers = with maintainers; [ nand0p ];
+  };
+}
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..fef97a7a6f48
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/autograd/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, numpy, future }:
+
+buildPythonPackage rec {
+  pname = "autograd";
+  version = "1.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1i1ylf03b7220n8znk63zg6sgdd3py9wlh1pvqvy03g1fxsi8pd1";
+  };
+
+  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/autologging/default.nix b/nixpkgs/pkgs/development/python-modules/autologging/default.nix
new file mode 100644
index 000000000000..7cd66dc2c3fe
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/autologging/default.nix
@@ -0,0 +1,19 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "Autologging";
+  version = "1.3.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "117659584d8aab8cf62046f682f8e57b54d958b8571c737fa8bf15c32937fbb6";
+    extension = "zip";
+  };
+
+  meta = with lib; {
+    homepage = "http://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..fa395f119ee5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/automat/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi,
+  m2r, setuptools_scm, six, attrs }:
+
+buildPythonPackage rec {
+  version = "20.2.0";
+  pname = "Automat";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "7979803c74610e11ef0c0d68a2942b152df52da55336e0c9d58daf1831cbdf33";
+  };
+
+  buildInputs = [ m2r setuptools_scm ];
+  propagatedBuildInputs = [ six attrs ];
+
+  # Some tests require twisetd, but twisted requires Automat to build.
+  # this creates a circular dependency.
+  doCheck = false;
+
+  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 = [ ];
+  };
+}
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..afeaef406611
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/autopep8/default.nix
@@ -0,0 +1,31 @@
+{ lib, stdenv, fetchPypi, buildPythonPackage, pycodestyle, glibcLocales
+, toml
+}:
+
+buildPythonPackage rec {
+  pname = "autopep8";
+  version = "1.5.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d21d3901cb0da6ebd1e83fc9b0dfbde8b46afc2ede4fe32fbda0c7c6118ca094";
+  };
+
+  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..c2edbdcf6a38
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/av/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, numpy
+, ffmpeg
+, pkg-config
+}:
+
+buildPythonPackage rec {
+  pname = "av";
+  version = "8.0.2";
+  disabled = isPy27; # setup.py no longer compatible
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a3bba6bf68766b8a1a057f28869c7078cf0a1ec3207c7788c2ce8fe6f6bd8267";
+  };
+
+  checkInputs = [ numpy ];
+
+  nativeBuildInputs = [ pkg-config ];
+  buildInputs = [ ffmpeg ];
+
+  # Tests require downloading files from internet
+  doCheck = false;
+
+  meta = {
+    description = "Pythonic bindings for FFmpeg/Libav";
+    homepage = "https://github.com/mikeboers/PyAV/";
+    license = lib.licenses.bsd2;
+  };
+}
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/avro-python3/default.nix b/nixpkgs/pkgs/development/python-modules/avro-python3/default.nix
new file mode 100644
index 000000000000..3e9a0e492d3c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/avro-python3/default.nix
@@ -0,0 +1,23 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, isPy3k, pycodestyle, isort }:
+
+buildPythonPackage rec {
+  pname = "avro-python3";
+  version = "1.10.1";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "9027abeab63dd9b66bd3c564fa0670c70f78027ecb1978d96c6af7ed415b626b";
+  };
+
+  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..35cab724a862
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/avro/default.nix
@@ -0,0 +1,30 @@
+{ lib, stdenv, buildPythonPackage, isPy3k, fetchPypi, pycodestyle, isort }:
+
+buildPythonPackage rec {
+  pname = "avro";
+  version = "1.10.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b3a405df5aa8654b992d2aca7b80482b858a1919a44dc0b10a682162e8ee340a";
+  };
+
+  patchPhase = ''
+    # this test requires network access
+    sed -i 's/test_server_with_path/noop/' avro/test/test_ipc.py
+  '' + (lib.optionalString isPy3k ''
+    # these files require twisted, which is not python3 compatible
+    rm avro/txipc.py
+    rm avro/test/txsample*
+  '');
+
+  nativeBuildInputs = [ pycodestyle ];
+  propagatedBuildInputs = [ isort ];
+
+  meta = with lib; {
+    description = "A serialization and RPC framework";
+    homepage = "https://pypi.python.org/pypi/avro/";
+    license = licenses.asl20;
+    maintainers = [ 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..b600bc75c7a3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/avro3k/default.nix
@@ -0,0 +1,19 @@
+{ lib, stdenv, 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..00882cb08279
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/awesome-slugify/default.nix
@@ -0,0 +1,34 @@
+{ lib, stdenv, 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..2c00baf39a8b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/awesomeversion/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "awesomeversion";
+  version = "21.1.3";
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "ludeeus";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-D31wmBrYFCArHddAINWjfTPow4K2TD+wGfmRUuIaBdA=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py --replace "main" ${version}
+  '';
+
+  propagatedBuildInputs = [ requests ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  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..298074f300d9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/awkward/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, cmake
+, numba
+, numpy
+, pytestCheckHook
+, rapidjson
+}:
+
+buildPythonPackage rec {
+  pname = "awkward";
+  version = "1.0.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "3468cb80cab51252a1936e5e593c7df4588ea0e18dcb6fb31e3d2913ba883928";
+  };
+
+  nativeBuildInputs = [ cmake ];
+  buildInputs = [ rapidjson ];
+  propagatedBuildInputs = [ numpy ];
+
+  dontUseCmakeConfigure = true;
+
+  checkInputs = [ pytestCheckHook numba ];
+  dontUseSetuptoolsCheck = true;
+
+  meta = with lib; {
+    description = "Manipulate JSON-like data with NumPy-like idioms";
+    homepage = "https://github.com/scikit-hep/awkward-1.0";
+    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..c248c81da751
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/awkward0/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, numpy
+, pandas
+, pytestrunner
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "awkward0";
+  version = "0.15.2";
+
+  src = fetchFromGitHub {
+    owner = "scikit-hep";
+    repo = "awkward-0.x";
+    rev = version;
+    sha256 = "sha256-C6/byIGcabGjws5QI9sh5BO2M4Lhqkooh4mSjUEKCKU=";
+  };
+
+  nativeBuildInputs = [ pytestrunner ];
+
+  propagatedBuildInputs = [ numpy ];
+
+  checkInputs = [ pandas pytestCheckHook ];
+
+  checkPhase = ''
+    # Almost all tests in this file fail
+    rm tests/test_persist.py
+    py.test
+  '';
+
+  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..ce4c6f789263
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aws-adfs/default.nix
@@ -0,0 +1,35 @@
+{ lib, buildPythonPackage, fetchPypi
+, pytest, pytestrunner, pytestcov, mock, glibcLocales, lxml, botocore
+, requests, requests-kerberos, click, configparser, fido2, isPy27 }:
+
+buildPythonPackage rec {
+  pname = "aws-adfs";
+  version = "1.24.5";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "6a78bd31477ea9988166215ae86abcbfe1413bee20373ecdf0dd170b7290db55";
+  };
+
+  # Relax version constraint
+  patchPhase = ''
+    sed -i 's/coverage < 4/coverage/' setup.py
+  '';
+
+  # Test suite writes files to $HOME/.aws/, or /homeless-shelter if unset
+  HOME = ".";
+
+  # Required for python3 tests, along with glibcLocales
+  LC_ALL = "en_US.UTF-8";
+
+  checkInputs = [ glibcLocales pytest pytestrunner pytestcov mock ];
+  propagatedBuildInputs = [ botocore lxml requests requests-kerberos click configparser fido2 ];
+
+  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 = [ 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..804ad078acb7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aws-lambda-builders/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, six
+, pathlib
+, pytest
+, mock
+, parameterized
+, isPy27
+, isPy35
+}:
+
+buildPythonPackage rec {
+  pname = "aws-lambda-builders";
+  version = "1.1.0";
+
+  # No tests available in PyPI tarball
+  src = fetchFromGitHub {
+    owner = "awslabs";
+    repo = "aws-lambda-builders";
+    rev = "v${version}";
+    sha256 = "1r4939m5k1nj6l9bv972z4fkmkl0z5f5r29bq7588yk113kkqr0c";
+  };
+
+  # Package is not compatible with Python 3.5
+  disabled = isPy35;
+
+  propagatedBuildInputs = [
+    six
+  ] ++ lib.optionals isPy27 [ pathlib ];
+
+  checkInputs = [
+    pytest
+    mock
+    parameterized
+  ];
+
+  checkPhase = ''
+    export PATH=$out/bin:$PATH
+    pytest tests/functional -k 'not can_invoke_pip'
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/awslabs/aws-lambda-builders";
+    description = "A tool to compile, build and package AWS Lambda functions";
+    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..52298faa0cc8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aws-sam-translator/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, boto3
+, enum34
+, jsonschema
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "aws-sam-translator";
+  version = "1.31.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "3a1d73d098161e60966b0d53bb310c98e4f66101688cce3d1697903643782d79";
+  };
+
+  # Tests are not included in the PyPI package
+  doCheck = false;
+
+  propagatedBuildInputs = [
+    boto3
+    jsonschema
+    six
+  ] ++ lib.optionals (pythonOlder "3.4") [ enum34 ];
+
+  meta = {
+    homepage = "https://github.com/awslabs/serverless-application-model";
+    description = "Python library to transform SAM templates into AWS CloudFormation templates";
+    license = lib.licenses.asl20;
+    maintainers = [ lib.maintainers.andreabedini ];
+  };
+}
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..313dd4241d5c
--- /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.6.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "abf5b90f740e1f402e23414c9670e59cb9772e235e271fef2bce62b9100cbc77";
+  };
+
+  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/awsiotpythonsdk/default.nix b/nixpkgs/pkgs/development/python-modules/awsiotpythonsdk/default.nix
new file mode 100644
index 000000000000..68b44ea5a5d5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/awsiotpythonsdk/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+}:
+
+buildPythonPackage rec {
+  pname = "AWSIoTPythonSDK";
+  version = "1.4.9";
+
+  src = fetchFromGitHub {
+    owner = "aws";
+    repo = "aws-iot-device-sdk-python";
+    rev = "v${version}";
+    sha256 = "0mbppz1lnia4br5vjz1l4z4vw47y3bzcfpckzhs9lxhj4vq6d001";
+  };
+
+  # Project 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/axis/default.nix b/nixpkgs/pkgs/development/python-modules/axis/default.nix
new file mode 100644
index 000000000000..707d958bab53
--- /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 = "43";
+
+  src = fetchFromGitHub {
+    owner = "Kane610";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1p9yfixsrkw7rxbvgybcb653rbqv0x18wzqkh620g193snm9sgm2";
+  };
+
+  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..5626b33462b5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-appconfiguration/default.nix
@@ -0,0 +1,29 @@
+{ lib, buildPythonPackage, fetchPypi, isPy27
+, azure-core
+, msrest
+}:
+
+buildPythonPackage rec {
+  pname = "azure-appconfiguration";
+  version = "1.1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "b83cd2cb63d93225de84e27abbfc059212f8de27766f4c58dd3abb839dff0be4";
+  };
+
+  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..e43e37720217
--- /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.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "6e1839169bb6ffd2d2c21ee3f4afbdd068ea428ad47cf884ea3167ecf7fd0859";
+  };
+
+  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..942ae218fdd8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-batch/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, msrest
+, azure-common
+, msrestazure
+}:
+
+buildPythonPackage rec {
+  pname = "azure-batch";
+  version = "10.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "83d7a2b0be42ca456ac2b56fa3dc6ce704c130e888d37d924072c1d3718f32d0";
+  };
+
+  propagatedBuildInputs = [
+    msrest
+    msrestazure
+    azure-common
+  ];
+
+  # has no tests
+  doCheck = false;
+
+  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..f77c938b1d7f
--- /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.26";
+  pname = "azure-common";
+  disabled = isPyPy;
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "b2866238aea5d7492cfb0282fc8b8d5f6d06fb433872345864d45753c10b6e4f";
+  };
+
+  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-core/default.nix b/nixpkgs/pkgs/development/python-modules/azure-core/default.nix
new file mode 100644
index 000000000000..e91a0fb07493
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-core/default.nix
@@ -0,0 +1,55 @@
+{ lib, buildPythonPackage, fetchPypi, isPy27
+, aiodns
+, aiohttp
+, mock
+, msrest
+, pytest
+, pytest-asyncio
+, pytest-trio
+, pytestCheckHook
+, requests
+, six
+, trio
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  version = "1.10.0";
+  pname = "azure-core";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "b9cddf3eb239e32b14cf44750b21d7bc8d78b82aa53d57628523598dcd006803";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    six
+  ];
+
+  checkInputs = [
+    aiodns
+    aiohttp
+    mock
+    msrest
+    pytest
+    pytest-trio
+    pytest-asyncio
+    pytestCheckHook
+    trio
+    typing-extensions
+  ];
+
+  pytestFlagsArray = [ "tests/" ];
+  # disable tests which touch network
+  disabledTests = [ "aiohttp" "multipart_send" "response" "request" "timeout" ];
+
+  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..4fa05ada8504
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-cosmos/default.nix
@@ -0,0 +1,31 @@
+{ buildPythonPackage
+, lib
+, python
+, fetchPypi
+, six
+, requests
+}:
+
+buildPythonPackage rec {
+  version = "3.1.2";
+  pname = "azure-cosmos";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "7f8ac99e4e40c398089fc383bfadcdc83376f72b88532b0cac0b420357cd08c7";
+  };
+
+  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..5c580ccd3e2f
--- /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
+, 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-datalake-store/default.nix b/nixpkgs/pkgs/development/python-modules/azure-datalake-store/default.nix
new file mode 100644
index 000000000000..0e97752ae578
--- /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
+, pathlib2
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "azure-datalake-store";
+  version = "0.0.51";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b871ebb3bcfd292e8a062dbbaacbc132793d98f1b60f549a8c3b672619603fc1";
+  };
+
+  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..9781fcecaaf2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-eventgrid/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, msrest
+, azure-common
+, msrestazure
+}:
+
+buildPythonPackage rec {
+  pname = "azure-eventgrid";
+  version = "1.3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "c82c4bf6ea59aeec69ce8f95f1b6a4edc6d733874aeb056669c9d2806168c86e";
+  };
+
+  propagatedBuildInputs = [
+    msrest
+    msrestazure
+    azure-common
+  ];
+
+  # 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-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..a0120ae35060
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-identity/default.nix
@@ -0,0 +1,54 @@
+{ buildPythonPackage
+, fetchPypi
+, isPy38
+, lib
+
+# pythonPackages
+, azure-common
+, azure-core
+, azure-nspkg
+, cryptography
+, mock
+, msal
+, msal-extensions
+, msrest
+, msrestazure
+}:
+
+buildPythonPackage rec {
+  pname = "azure-identity";
+  version = "1.5.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "872adfa760b2efdd62595659b283deba92d47b7a67557eb9ff48f0b5d04ee396";
+  };
+
+  propagatedBuildInputs = [
+    azure-common
+    azure-core
+    azure-nspkg
+    cryptography
+    mock
+    msal
+    msal-extensions
+    msrest
+    msrestazure
+  ];
+
+  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..e72dc036989b
--- /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.0.0b1";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "1kmf2x3jdmfm9c7ldvajzckkm79gxxvl1l2968lizjwiyjbbsih5";
+  };
+
+  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..56ccb8b5fb0d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-keyvault-certificates/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python
+, isPy3k
+, azure-common
+, azure-core
+, msrest
+, msrestazure
+}:
+
+buildPythonPackage rec {
+  pname = "azure-keyvault-certificates";
+  version = "4.2.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "ea651883ad00d0a9a25b38e51feff7111f6c7099c6fb2597598da5bb21d3451c";
+  };
+
+  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..bbdc06d52d4d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-keyvault-keys/default.nix
@@ -0,0 +1,49 @@
+{ lib, buildPythonPackage, isPy27, fetchPypi
+, aiohttp
+, azure-common
+, azure-core
+, azure-nspkg
+, cryptography
+, msrest
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "azure-keyvault-keys";
+  version = "4.3.1";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "fbf67bca913ebf68b9075ee9d2e2b899dc3c7892cc40abfe1b08220a382f6ed9";
+  };
+
+  propagatedBuildInputs = [
+    azure-common
+    azure-core
+    msrest
+    cryptography
+  ];
+
+  pythonNamespaces = [ "azure.keyvault" ];
+
+  # requires relative paths to utilities in the mono-repo
+  doCheck = false;
+  checkInputs = [ aiohttp pytestCheckHook ];
+
+  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..704d2951cc97
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-keyvault-secrets/default.nix
@@ -0,0 +1,35 @@
+{ lib, buildPythonPackage, fetchPypi, isPy27
+, azure-common
+, azure-core
+, msrest
+}:
+
+buildPythonPackage rec {
+  pname = "azure-keyvault-secrets";
+  version = "4.2.0";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "1083ab900da5ec63c518ffef49d9fdca02c81ddffdf80c52c03cd9da479e021f";
+  };
+
+  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..f5b83df26640
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-keyvault/default.nix
@@ -0,0 +1,40 @@
+{ lib, buildPythonPackage, isPy27, fetchPypi
+, azure-keyvault-certificates
+, azure-keyvault-keys
+, azure-keyvault-secrets
+}:
+
+buildPythonPackage rec {
+  pname = "azure-keyvault";
+  version = "4.1.0";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "69002a546921a8290eb54d9a3805cfc515c321bc1d4c0bfcfb463620245eca40";
+  };
+
+  propagatedBuildInputs = [
+    azure-keyvault-certificates
+    azure-keyvault-keys
+    azure-keyvault-secrets
+  ];
+
+  # this is just a meta package, which contains keys and secrets
+  doCheck = false;
+
+  pythonNamespaces = [ "azure" ];
+
+  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..1eed45d72f5a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-loganalytics/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python
+, isPy3k
+, msrest
+, azure-common
+}:
+
+buildPythonPackage rec {
+  version = "0.1.0";
+  pname = "azure-loganalytics";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "3ceb350def677a351f34b0a0d1637df6be0c6fe87ff32a5270b17f540f6da06e";
+  };
+
+  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..4432595a12e7
--- /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 = "1.0.0";
+  pname = "azure-mgmt-apimanagement";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "3ad7e2c3d20dd0141f9e2c0ae923121f7cbe7333bb314850e6f8b606636e3589";
+    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..9fea2cf87d06
--- /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 = "1.0.1";
+  pname = "azure-mgmt-appconfiguration";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b58bbe82a7429ba589292024896b58d96fe9fa732c578569cac349928dc2ca5f";
+    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..7330ef5fb3e1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-applicationinsights/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, python
+, fetchPypi
+, msrest
+, msrestazure
+, azure-common
+, azure-mgmt-nspkg
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-applicationinsights";
+  version = "0.3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "3c788a54db4fbca1a8850151462ec1471ff59c86b3a10d6082952bbdaa7e6651";
+  };
+
+  propagatedBuildInputs = [
+    msrest
+    msrestazure
+    azure-common
+  ] ++ 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..a622c6a94c90
--- /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 = "1.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "9a9fc16866b46387853381ab4fa0f84c1765e0afea5b0124709ea9fae10ee752";
+  };
+
+  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..033ef0cccea4
--- /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
+, azure-mgmt-nspkg
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-batch";
+  version = "14.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "1d3b2c9ebd57c8874e11d29e7dd05a1f078d2156fc9683e2f2ad41024e448bf6";
+  };
+
+  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 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..6f7aedacfae2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-batchai/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, azure-common
+, azure-mgmt-nspkg
+, msrestazure
+, python
+, isPy3k
+}:
+
+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-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..d1cb009355de
--- /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-nspkg
+, python
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-billing";
+  version = "1.0.0"; #pypi's 0.2.0 doesn't build ootb
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "8b55064546c8e94839d9f8c98e9ea4b021004b3804e192bf39fa65b603536ad0";
+    extension = "zip";
+  };
+
+  propagatedBuildInputs = [
+    msrestazure
+    azure-common
+    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..d9375942b4d3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-botservice/default.nix
@@ -0,0 +1,31 @@
+{ lib, buildPythonPackage, fetchPypi, isPy27
+, azure-common
+, msrest
+, msrestazure
+}:
+
+buildPythonPackage rec {
+  version = "0.2.0";
+  pname = "azure-mgmt-botservice";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "10sxllwvybjlp35h5mjdxhkw2wzpl4b03i08p4jnv8cswrc8h7dj";
+    extension = "zip";
+  };
+
+  propagatedBuildInputs = [ azure-common 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..b204add2b5e9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-cdn/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, msrest
+, msrestazure
+, azure-common
+, azure-mgmt-nspkg
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-cdn";
+  version = "6.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "590cd35c9f1556a2d93d93a88b5c5661f716de094f22db30f4d05dc58a131c84";
+  };
+
+  propagatedBuildInputs = [
+    msrest
+    msrestazure
+    azure-common
+  ] ++ 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..09800f9cef36
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-cognitiveservices/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, azure-common
+, azure-mgmt-core
+, azure-mgmt-nspkg
+, msrestazure
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-cognitiveservices";
+  version = "11.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "71414e3cd7445e44fc18f217f2d22df05c36877e1233328b2297d07ddf27e82a";
+  };
+
+  propagatedBuildInputs = [
+    msrestazure
+    azure-common
+    azure-mgmt-core
+    azure-mgmt-nspkg
+  ];
+
+  # 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..32e6cebd1f59
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-commerce/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, msrestazure
+, azure-common
+, azure-mgmt-core
+, azure-mgmt-nspkg
+, python
+, isPy3k
+}:
+
+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..e8a45ebf5aa4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-compute/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python
+, azure-mgmt-common
+, azure-mgmt-core
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  version = "18.1.0";
+  pname = "azure-mgmt-compute";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "02de691c5ce7237993e65b0ae6154b3bf8ec32bcb15f13ade72bc7f3cb3183d4";
+  };
+
+  propagatedBuildInputs = [
+    azure-mgmt-common
+    azure-mgmt-core
+  ];
+
+  pythonNamespaces = [ "azure.mgmt" ];
+
+  # has no tests
+  doCheck = false;
+
+  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..be22e14b574b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-consumption/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python
+, isPy3k
+, msrestazure
+, azure-common
+, azure-mgmt-core
+, azure-mgmt-nspkg
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-consumption";
+  version = "8.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "b4cc167648634f864394066d5621afc137c1be795ee76f7539125f9538a2bf37";
+  };
+
+  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 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..7a4d8005c9e1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-containerinstance/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-containerinstance";
+  version = "7.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "9f624df0664ba80ba886bc96ffe5e468c620eb5b681bc3bc2a28ce26042fd465";
+  };
+
+  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 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..821c7db0d324
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-containerregistry/default.nix
@@ -0,0 +1,31 @@
+{ lib, buildPythonPackage, fetchPypi, isPy27
+, azure-common
+, msrest
+, msrestazure
+}:
+
+buildPythonPackage rec {
+  version = "2.8.0";
+  pname = "azure-mgmt-containerregistry";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "193k07a77z7bj61zn2gxvvfqi20cgxksvxp7if71bwsl1l2y2jxj";
+    extension = "zip";
+  };
+
+  propagatedBuildInputs = [ azure-common 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..8e93026b6021
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-containerservice/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-containerservice";
+  version = "14.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "fbb13448fb52a4090ee91940ae8676403dbe8ae81044b7a5cd3c9e58b47d66de";
+  };
+
+  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 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..c824f3725a7e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-core/default.nix
@@ -0,0 +1,36 @@
+{ pkgs
+, buildPythonPackage
+, fetchPypi
+, python
+, azure-core
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  version = "1.2.2";
+  pname = "azure-mgmt-core";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "4246810996107f72482a9351cf918d380c257e90942144ec9c0c2abda1d0a312";
+  };
+
+  propagatedBuildInputs = [
+    azure-core
+  ];
+
+  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..3814770b2e57
--- /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
+, azure-mgmt-nspkg
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-cosmosdb";
+  version = "6.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "15e4140870f2756fbd43965ccceca55361a634a0504bbdb033a1909eff14dfb1";
+  };
+
+  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 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..317019844cb0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-databoxedge/default.nix
@@ -0,0 +1,32 @@
+{ lib, buildPythonPackage, fetchPypi
+, msrestazure
+, azure-common
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-databoxedge";
+  version = "0.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "g8BtUpIGOse8Jrws48gQ/o7sgymlgX0XIxl1ThHS3XA=";
+  };
+
+  propagatedBuildInputs = [
+    msrestazure
+    azure-common
+  ];
+
+  # 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..91f420f11ae8
--- /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
+, azure-mgmt-nspkg
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-datafactory";
+  version = "1.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "d4f3984eca74b1e3691467aadc09626e578ed1fc5ef410872d474f3e7653916a";
+  };
+
+  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 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..8fc8b44f3e6a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-datalake-analytics/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python
+, isPy3k
+, 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..fc5d8ba6f018
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-datalake-store/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python
+, isPy3k
+, pythonNamespacesHook
+, 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..f8f0818598d3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-datamigration/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python
+, isPy3k
+, msrest
+, msrestazure
+, azure-common
+, azure-mgmt-nspkg
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-datamigration";
+  version = "4.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "c33d1deb0ee173a15c8ec21a1e714ba544fe5f4895d3b1d8b0581f3c1b2e8ce4";
+  };
+
+  propagatedBuildInputs = [
+    msrest
+    msrestazure
+    azure-common
+  ] ++ 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..f6be961060e6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-deploymentmanager/default.nix
@@ -0,0 +1,31 @@
+{ lib, buildPythonPackage, fetchPypi, isPy27
+, azure-common
+, msrest
+, msrestazure
+}:
+
+buildPythonPackage rec {
+  version = "0.2.0";
+  pname = "azure-mgmt-deploymentmanager";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0c6pyr36n9snx879vas5r6l25db6nlp2z96xn759mz4kg4i45qs6";
+    extension = "zip";
+  };
+
+  propagatedBuildInputs = [ azure-common 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..820f737c5489
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-devtestlabs/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python
+, 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..37511456fe6f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-dns/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python
+, isPy3k
+, msrest
+, msrestazure
+, azure-common
+, azure-mgmt-nspkg
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-dns";
+  version = "3.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "0zxkcczf01b64qfwj98jqdvnwqahygcyccf37rcxpdcfgpkg9kbf";
+  };
+
+  propagatedBuildInputs = [
+    msrest
+    msrestazure
+    azure-common
+    azure-mgmt-nspkg
+  ];
+
+  # 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..1b244818f913
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-eventgrid/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-eventgrid";
+  version = "8.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "a8a6e1bb105a14f1d3545ecb07c190370f21a145f8ba51599ed169f1dc8d5dcc";
+  };
+
+  propagatedBuildInputs = [
+    msrest
+    msrestazure
+    azure-mgmt-core
+    azure-common
+  ] ++ lib.optionals (!isPy3k) [
+    azure-mgmt-nspkg
+  ];
+
+  # 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..6b86973bccd9
--- /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
+, azure-mgmt-nspkg
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-eventhub";
+  version = "8.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "ae02b1e3ccbb9ec45849de544dea4d8ef36ea767707207d055ae2b4f756c0d79";
+  };
+
+  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 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-hanaonazure/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-hanaonazure/default.nix
new file mode 100644
index 000000000000..9a23d31309b2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-hanaonazure/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, msrest
+, msrestazure
+, azure-common
+, azure-mgmt-nspkg
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-hanaonazure";
+  version = "0.14.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "7f8b912ca62431c1697b4914c12cc5f8123e60ee6c65d123591f937744d204e0";
+  };
+
+  propagatedBuildInputs = [
+    msrest
+    msrestazure
+    azure-common
+  ] ++ 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..5547eb032d0e
--- /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 = "7.0.0";
+  pname = "azure-mgmt-hdinsight";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d0070817ee2be611d45af91eabc5665dd53f024eaa7a55e490ace4f71a55c733";
+    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..404caf4ebf5b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-imagebuilder/default.nix
@@ -0,0 +1,31 @@
+{ lib, buildPythonPackage, fetchPypi, isPy27
+, azure-common
+, msrest
+, msrestazure
+}:
+
+buildPythonPackage rec {
+  version = "0.4.0";
+  pname = "azure-mgmt-imagebuilder";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "4c9291bf16b40b043637e5e4f15650f71418ac237393e62219cab478a7951733";
+    extension = "zip";
+  };
+
+  propagatedBuildInputs = [ azure-common msrest msrestazure ];
+
+  # no tests included
+  doCheck = false;
+
+  pythonImportsCheck = [ "azure.common" "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..2f368b826491
--- /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 = "4.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "ab793fde2b5eeb73ab37434013d4b5ba7750031220013edb3c1758c45a00a91a";
+  };
+
+  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..c51d43ec4447
--- /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 = "1.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "7acf24088395a299974dd26406db2686d8d59a3fffbe47c24617b36d445f2de8";
+  };
+
+  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..3401ed898c8f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-iothubprovisioningservices/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python
+, isPy3k
+, msrest
+, msrestazure
+, azure-common
+, azure-mgmt-nspkg
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-iothubprovisioningservices";
+  version = "0.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "8c37acfd1c33aba845f2e0302ef7266cad31cba503cc990a48684659acb7b91d";
+  };
+
+  propagatedBuildInputs = [
+    msrest
+    msrestazure
+    azure-common
+    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..10c4604ec186
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-keyvault/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python
+, isPy3k
+, msrest
+, msrestazure
+, azure-common
+, azure-mgmt-nspkg
+, azure-mgmt-core
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-keyvault";
+  version = "8.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "2c974c6114d8d27152642c82a975812790a5e86ccf609bf370a476d9ea0d2e7d";
+  };
+
+  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 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..9f5c04adb265
--- /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 = "0.1.0";
+  pname = "azure-mgmt-apimanagement";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "06bqqkn5mx127x1z7ycm6rl8ajxlrmrm2kcdpgkbl4baii1x6iax";
+    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..93c78c401f0c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-kusto/default.nix
@@ -0,0 +1,31 @@
+{ lib, buildPythonPackage, fetchPypi, isPy27
+, azure-common
+, msrest
+, msrestazure
+}:
+
+buildPythonPackage rec {
+  version = "0.10.0";
+  pname = "azure-mgmt-kusto";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "09e8d4928e19d12feb374adb47651b474f3ee3bc6a12704e4b70c9b38e3bcd9e";
+    extension = "zip";
+  };
+
+  propagatedBuildInputs = [ azure-common 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..9eb1d2afc149
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-loganalytics/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python
+, isPy3k
+, msrest
+, msrestazure
+, azure-common
+, azure-mgmt-nspkg
+, azure-mgmt-core
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-loganalytics";
+  version = "8.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "3e7a93186594c328a6f34f0e0d9209a05021228baa85aa4c1c4ffdbf8005a45f";
+  };
+
+  propagatedBuildInputs = [
+    msrest
+    msrestazure
+    azure-common
+    azure-mgmt-nspkg
+    azure-mgmt-core
+  ];
+
+  pythonNamespaces = [ "azure.mgmt" ];
+
+  # has no tests
+  doCheck = false;
+
+  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..bc63084410ce
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-logic/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, msrest
+, msrestazure
+, azure-common
+, azure-mgmt-core
+, azure-mgmt-nspkg
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-logic";
+  version = "9.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "d3a780d299c4db59134bd984c4c9281b9b6ae5d4ba185bcbae43f6c3af04f85a";
+  };
+
+  propagatedBuildInputs = [
+    msrest
+    msrestazure
+    azure-common
+    azure-mgmt-core
+    azure-mgmt-nspkg
+  ];
+
+  # 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..4d059480c442
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-managedservices/default.nix
@@ -0,0 +1,31 @@
+{ lib, buildPythonPackage, fetchPypi, isPy27
+, azure-common
+, msrest
+, msrestazure
+}:
+
+buildPythonPackage rec {
+  version = "1.0.0";
+  pname = "azure-mgmt-managedservices";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "06ddfqriqlvwjsjhqka9r5vhshardyj9c10xgjissfkpqsgkkn7y";
+    extension = "zip";
+  };
+
+  propagatedBuildInputs = [ azure-common 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..e09646373b6e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-managementgroups/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, msrest
+, msrestazure
+, azure-common
+, azure-mgmt-nspkg
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-managementgroups";
+  version = "0.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "3d5237947458dc94b4a392141174b1c1258d26611241ee104e9006d1d798f682";
+  };
+
+  propagatedBuildInputs = [
+    msrest
+    msrestazure
+    azure-common
+  ] ++ 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..d42fb5b05c39
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-managementpartner/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, msrestazure
+, azure-common
+, azure-mgmt-nspkg
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-managementpartner";
+  version = "0.1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "1bvcmx7dkf2adi26z7c2ga63ggpzdfqj8q1gzcic1yn03v6nb8i7";
+  };
+
+  propagatedBuildInputs = [
+    msrestazure
+    azure-common
+    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..c0f418ed725c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-maps/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python
+, isPy3k
+, msrest
+, msrestazure
+, azure-common
+, azure-mgmt-nspkg
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-maps";
+  version = "0.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "c120e210bb61768da29de24d28b82f8d42ae24e52396eb6569b499709e22f006";
+  };
+
+  propagatedBuildInputs = [
+    msrest
+    msrestazure
+    azure-common
+    azure-mgmt-nspkg
+  ];
+
+  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..9538ed2a2345
--- /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.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "85103080f9e59215036bdfb8f806d91ea182d72c46a13f55c3acc479849351e3";
+  };
+
+  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..90effb44c69c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-media/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, msrest
+, msrestazure
+, azure-common
+, azure-mgmt-nspkg
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-media";
+  version = "3.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "8944775725c5253614d257576d841ee68afa34f570b05c0924a7f73f1db28a24";
+  };
+
+  propagatedBuildInputs = [
+    msrest
+    msrestazure
+    azure-common
+  ] ++ lib.optionals (!isPy3k) [
+    azure-mgmt-nspkg
+  ];
+
+  # has no tests
+  doCheck = false;
+
+  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..db4aa3fb77cf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-monitor/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python
+, isPy3k
+, msrest
+, msrestazure
+, azure-common
+, azure-mgmt-core
+, azure-mgmt-nspkg
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-monitor";
+  version = "2.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "e7f7943fe8f0efe98b3b1996cdec47c709765257a6e09e7940f7838a0f829e82";
+  };
+
+  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 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..4bd0a493ddae
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-msi/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python
+, isPy3k
+, msrest
+, msrestazure
+, azure-common
+, azure-mgmt-nspkg
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-msi";
+  version = "1.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "0n4gbwk843z66hhpcp1kcrnwqkzygbbc2ma01r9asgfv4nmklvyl";
+  };
+
+  propagatedBuildInputs = [
+    msrest
+    msrestazure
+    azure-common
+    azure-mgmt-nspkg
+  ];
+
+  pythonNamespaces = [ "azure.mgmt" ];
+
+  # has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "This is the Microsoft Azure MSI 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-netapp/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-netapp/default.nix
new file mode 100644
index 000000000000..a89d94f3d706
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-netapp/default.nix
@@ -0,0 +1,37 @@
+{ lib, buildPythonPackage, fetchPypi, isPy27
+, azure-common
+, azure-mgmt-core
+, msrest
+, msrestazure
+}:
+
+buildPythonPackage rec {
+  version = "0.15.0";
+  pname = "azure-mgmt-netapp";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "5e98c360609a77b443b2fe431e0337e5cb705b4f02d0204791f9985f7ce68836";
+    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..95bcd9dbc406
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-network/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, azure-common
+, azure-mgmt-common
+, azure-mgmt-core
+, msrest
+, msrestazure
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  version = "17.0.0";
+  pname = "azure-mgmt-network";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "3694f2675e152afccb1588a6cc7bb4b4795d442a4e5d7082cdf1f4e32a779199";
+  };
+
+  propagatedBuildInputs = [
+    azure-common
+    azure-mgmt-core
+    msrest
+    msrestazure
+  ];
+
+  # 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..bf9d9bab576b
--- /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 = "7.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "92ffed71a2999ff5db41afd66c6ba5cfef9d467f732c7bb45b7c41db371c6e4a";
+  };
+
+  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..b3503e23d613
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-nspkg/default.nix
@@ -0,0 +1,29 @@
+{ pkgs
+, buildPythonPackage
+, fetchPypi
+, azure-nspkg
+, python
+, isPy3k
+}:
+
+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..98855730ba34
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-privatedns/default.nix
@@ -0,0 +1,31 @@
+{ lib, buildPythonPackage, fetchPypi, isPy27
+, azure-common
+, msrest
+, msrestazure
+}:
+
+buildPythonPackage rec {
+  version = "0.1.0";
+  pname = "azure-mgmt-privatedns";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "08wdvfkk8jh90m3l4nz7knd5vikgfvsx70lk7mkhcvl0xj6gv76j";
+    extension = "zip";
+  };
+
+  propagatedBuildInputs = [ azure-common 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..c7cb274d68b6
--- /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 = "8.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "8b018543048fc4fddb4155d9f22246ad0c4be2fb582a29dbb21ec4022724a119";
+  };
+
+  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..d1f49355f8b9
--- /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 = "1.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "ab87108c0d5ce27d80583b4bfad966ad07049dcbc0e9ac28c64aa6bbdae64e22";
+  };
+
+  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..4ce18c4ae3b0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-recoveryservicesbackup/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, msrest
+, msrestazure
+, azure-common
+, azure-mgmt-nspkg
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-recoveryservicesbackup";
+  version = "0.11.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "f2b85d1d7d7db2af106000910ea5f8b95639874176a5de2f7ab37a2caa67af6b";
+  };
+
+  propagatedBuildInputs = [
+    msrest
+    msrestazure
+    azure-common
+    azure-mgmt-nspkg
+  ];
+
+  # has no tests
+  doCheck = false;
+
+  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..323aa26472ca
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-redhatopenshift/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python
+, msrest
+, msrestazure
+, azure-common
+, isPy27
+}:
+
+buildPythonPackage rec {
+  version = "0.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 = "1g65lbia1i1jw6qkyjz2ldyl3p90rbr78l8kfryg70sj7z3gnnjn";
+  };
+
+  propagatedBuildInputs = [
+    msrest
+    msrestazure
+    azure-common
+  ];
+
+  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..fb43f130ba3a
--- /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 = "12.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "8ae563e3df82a2f206d0483ae6f05d93d0d1835111c0bbca7236932521eed356";
+  };
+
+  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..9b7444a6ecb1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-relay/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python
+, isPy3k
+, msrestazure
+, azure-common
+, azure-mgmt-core
+, azure-mgmt-nspkg
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-relay";
+  version = "1.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "38f6dd9d122a316efa921e72933e01ec4d76ed39d4682655b17a997079e8b20a";
+  };
+
+  propagatedBuildInputs = [
+    msrestazure
+    azure-common
+    azure-mgmt-core
+    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..61ef82d74acc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-reservations/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, msrest
+, msrestazure
+, azure-common
+, azure-mgmt-nspkg
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-reservations";
+  version = "0.8.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "b12318392e6f5100246c60de88879e24b15db104d00f9704a4ff51e7344594f1";
+  };
+
+  propagatedBuildInputs = [
+    msrest
+    msrestazure
+    azure-common
+  ] ++ lib.optionals (!isPy3k) [
+    azure-mgmt-nspkg
+  ];
+
+  # 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..bdba89498877
--- /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 = "15.0.0";
+  pname = "azure-mgmt-resource";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "80ecb69aa21152b924edf481e4b26c641f11aa264120bc322a14284811df9c14";
+  };
+
+  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..2deaf2b91dd7
--- /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
+, azure-mgmt-nspkg
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-servicebus";
+  version = "6.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "f6c64ed97d22d0c03c4ca5fc7594bd0f3d4147659c10110160009b93f541298e";
+  };
+
+  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 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..abb117d00466
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-servicefabric/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python
+, isPy3k
+, msrest
+, msrestazure
+, azure-common
+, azure-mgmt-nspkg
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-servicefabric";
+  version = "0.5.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "5771f24516c8d4a27f5569f23f3a606f6f106e4ad502eec7f38aedfcd3eadc74";
+  };
+
+  propagatedBuildInputs = [
+    msrest
+    msrestazure
+    azure-common
+    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-signalr/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-signalr/default.nix
new file mode 100644
index 000000000000..4a452cb919cb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-signalr/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, msrest
+, msrestazure
+, azure-common
+, azure-mgmt-nspkg
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-signalr";
+  version = "0.4.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "6503ddda9d6f4b634dfeb8eb4bcd14ede5e0900585f6c83bf9010cf82215c126";
+  };
+
+  propagatedBuildInputs = [
+    msrest
+    msrestazure
+    azure-common
+    azure-mgmt-nspkg
+  ];
+
+  # 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..60c1022e6037
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-sql/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-sql";
+  version = "1.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "c7904f8798fbb285a2160c41c8bd7a416c6bd987f5d36a9b98c16f41e24e9f47";
+  };
+
+  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 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..a34ebae2b812
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-sqlvirtualmachine/default.nix
@@ -0,0 +1,31 @@
+{ lib, buildPythonPackage, fetchPypi, isPy27
+, azure-common
+, 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 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..2f1032c2bb9b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-storage/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python
+, azure-mgmt-common
+, azure-mgmt-core
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  version = "16.0.0";
+  pname = "azure-mgmt-storage";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "2f9d714d9722b1ef4bac6563676612e6e795c4e90f6f3cd323616fdadb0a99e5";
+  };
+
+  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..d4238cc8204f
--- /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 = "1.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "22f606f298419f466a8149811fc762686c93da00a7dc15d3b7cdbf22b96cf5db";
+  };
+
+  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..22b6281fa769
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-synapse/default.nix
@@ -0,0 +1,32 @@
+{ lib, buildPythonPackage, fetchPypi, pythonOlder
+, azure-common
+, msrest
+, msrestazure
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-synapse";
+  version = "0.6.0";
+  disabled = pythonOlder "3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f81cb52b220774aab93ffcf25bdc17e03fd84b6916836640789f86fbf636b984";
+    extension = "zip";
+  };
+
+  propagatedBuildInputs = [
+    azure-common
+    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..dd7ed3b19b21
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-trafficmanager/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, msrest
+, msrestazure
+, azure-common
+, azure-mgmt-nspkg
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-trafficmanager";
+  version = "0.51.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "fc8ae77022cfe52fda4379a2f31e0b857574d536e41291a7b569b5c0f4104186";
+  };
+
+  propagatedBuildInputs = [
+    msrest
+    msrestazure
+    azure-common
+  ] ++ 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..f02bee6befe6
--- /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 = "1.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "c4b218a5d1353cd7c55b39c9b2bd1b13bfbe3b8a71bc735122b171eab81670d1";
+  };
+
+  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..18e4a12d3b36
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-multiapi-storage/default.nix
@@ -0,0 +1,50 @@
+{ lib, python, buildPythonPackage, fetchPypi, isPy27
+, fetchpatch
+, azure-common
+, azure-core
+, msrest
+, msrestazure
+, requests
+}:
+
+buildPythonPackage rec {
+  version = "0.4.1";
+  pname = "azure-multiapi-storage";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0h7bzaqwyl3j9xqzjbnwxp59kmg6shxk76pml9kvvqbwsq9w6fx3";
+  };
+
+  propagatedBuildInputs = [
+    azure-common
+    azure-core
+    msrest
+    msrestazure
+    requests
+  ];
+
+  # Fix to actually install the package
+  patches = [
+    (fetchpatch {
+      url = "https://github.com/Azure/azure-multiapi-storage-python/pull/29/commits/1c8b08dfc9c5445498de3475dec8820eafbd0ca1.patch";
+      sha256 = "1f80sdbw4pagrlp9dhcimhp23sdmy0whiba07aa84agkpv4df9ny";
+    })
+  ];
+
+  # 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..25636053a6b3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-nspkg/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python
+, isPy3k
+}:
+
+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..356de52212d0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-servicebus/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, uamqp
+, azure-common
+, azure-core
+, msrestazure
+, futures
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "azure-servicebus";
+  version = "7.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "46d1e7b9da537da831c3184d42d3e2bc3c7ab9234e204a9d4c2e5dc54010721b";
+  };
+
+  propagatedBuildInputs = [
+    uamqp
+    azure-common
+    azure-core
+    msrestazure
+  ] ++ lib.optionals (!isPy3k) [
+    futures
+  ];
+
+  # has no tests
+  doCheck = false;
+
+  # python2 will fail due to pep 420
+  pythonImportsCheck = lib.optionals isPy3k [ "azure.servicebus" ];
+
+  meta = with lib; {
+    description = "This is the 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..743f0abd9256
--- /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 = "7.2.0.46";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "c15fd5e8fe33a12295435f16e007edcfd8f660547795742f9b74ef8fb3a431ba";
+  };
+
+  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..cd42be98f9ff
--- /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
+}:
+
+buildPythonPackage rec {
+  pname = "azure-storage-blob";
+  version = "12.7.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "c6249f211684929ea6c9d34b5151b06d039775344f0d48fcf479736ed4c11b9e";
+  };
+
+  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..c6413f191fce
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-storage-file-share/default.nix
@@ -0,0 +1,45 @@
+{ buildPythonPackage
+, fetchPypi
+, isPy3k
+, lib
+
+# pythonPackages
+, azure-core
+, cryptography
+, msrest
+, futures
+}:
+
+buildPythonPackage rec {
+  pname = "azure-storage-file-share";
+  version = "12.4.1";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "7503d05882970abc977529ff5a4b81e79f62fd51b238fe306f72e13f57a522ca";
+  };
+
+  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..088b5260e65b
--- /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
+}:
+
+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..e2037bb7d21f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-storage/default.nix
@@ -0,0 +1,36 @@
+{ pkgs
+, buildPythonPackage
+, fetchPypi
+, python
+, azure-common
+, futures
+, dateutil
+, requests
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  version = "0.36.0";
+  pname = "azure-storage";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0pyasfxkin6j8j00qmky7d9cvpxgis4fi9bscgclj6yrpvf14qpv";
+  };
+
+  propagatedBuildInputs = [ azure-common 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..1f8ba7dbe8af
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-synapse-accesscontrol/default.nix
@@ -0,0 +1,31 @@
+{ lib, buildPythonPackage, fetchPypi
+, azure-common
+, azure-core
+, msrest
+}:
+
+buildPythonPackage rec {
+  pname = "azure-synapse-accesscontrol";
+  version = "0.4.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a4f32423d9facaae512c433f5460b4ceec73a6c20b44b00e9de9de7a0e86dacd";
+    extension = "zip";
+  };
+
+  propagatedBuildInputs = [
+    azure-common
+    azure-core
+    msrest
+  ];
+
+  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..5a414388c4c8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-synapse-artifacts/default.nix
@@ -0,0 +1,31 @@
+{ lib, buildPythonPackage, fetchPypi
+, azure-common
+, azure-core
+, msrest
+}:
+
+buildPythonPackage rec {
+  pname = "azure-synapse-artifacts";
+  version = "0.4.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "09fd9cf8c25c901d2daf7e436062065ada866f212f371f9d66f394d39ccaa23b";
+  };
+
+  propagatedBuildInputs = [
+    azure-common
+    azure-core
+    msrest
+  ];
+
+  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-spark/default.nix b/nixpkgs/pkgs/development/python-modules/azure-synapse-spark/default.nix
new file mode 100644
index 000000000000..571f3f9d08da
--- /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.4.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "7f5881fda4108363c8c6fdee0494fa067ba81e60f038883859d23fc197f5f286";
+    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..da43f6e5690e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/b2sdk/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, setuptools_scm, isPy27, pytestCheckHook
+, requests, arrow, logfury, tqdm }:
+
+buildPythonPackage rec {
+  pname = "b2sdk";
+  version = "1.2.0";
+
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "8e46ff9d47a9b90d8b9beab1969fcf4920300b02e20e6bf0745be04e09e8a6ff";
+  };
+
+  pythonImportsCheck = [ "b2sdk" ];
+
+  nativebuildInputs = [ setuptools_scm ];
+  propagatedBuildInputs = [ requests arrow logfury tqdm ];
+
+  # requires unpackaged dependencies like liccheck
+  doCheck = false;
+
+  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;
+  };
+}
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..5ac044292156
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/babelfish/default.nix
@@ -0,0 +1,19 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, setuptools }:
+
+buildPythonPackage rec {
+  pname = "babelfish";
+  version = "0.5.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "8380879fa51164ac54a3e393f83c4551a275f03617f54a99d70151358e444104";
+  };
+
+  propagatedBuildInputs = [ setuptools ];
+
+  meta = with lib; {
+    homepage = "https://pypi.python.org/pypi/babelfish";
+    description = "A module to work with countries and languages";
+    license = licenses.bsd3;
+  };
+}
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..0df03754127b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/babelgladeextractor/default.nix
@@ -0,0 +1,34 @@
+{ stdenv
+, 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..fd92351c4d83
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/backoff/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, fetchFromGitHub, pytestCheckHook, poetry, pytest-asyncio, }:
+
+buildPythonPackage rec {
+  pname = "backoff";
+  version = "1.10.0";
+
+  src = fetchFromGitHub {
+    owner = "litl";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1jj0l6pjx747d2yyvnzd3qbm4qr73sq6cc56dhvd8wqfbp5279x0";
+  };
+
+  format = "pyproject";
+
+  nativeBuildInputs = [ poetry ];
+
+  checkInputs = [ pytestCheckHook pytest-asyncio ];
+
+  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-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-shutil-which/default.nix b/nixpkgs/pkgs/development/python-modules/backports-shutil-which/default.nix
new file mode 100644
index 000000000000..5fe922b90462
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/backports-shutil-which/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv, 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_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..5216149ddc2c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/backports_csv/default.nix
@@ -0,0 +1,20 @@
+{ lib, stdenv, 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..79e11ecae4f7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/backports_functools_lru_cache/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools_scm
+, isPy3k
+, pytest
+, pytest-black
+, pytest-flake8
+, pytestcov
+}:
+
+buildPythonPackage rec {
+  pname = "backports.functools_lru_cache";
+  version = "1.6.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "8fde5f188da2d593bd5bc0be98d9abc46c95bb8a9dde93429570192ee6cc2d4a";
+  };
+
+  nativeBuildInputs = [ setuptools_scm ];
+
+  checkInputs = [ pytest pytest-flake8 pytest-black pytestcov ];
+  # ironically, they fail a linting test, and pytest.ini forces that test suite
+  checkPhase = ''
+    rm backports/functools_lru_cache.py
+    pytest -k 'not format'
+  '';
+
+  # Test fail on Python 2
+  doCheck = isPy3k;
+
+  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_lzma/default.nix b/nixpkgs/pkgs/development/python-modules/backports_lzma/default.nix
new file mode 100644
index 000000000000..1ebae86dec99
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/backports_lzma/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+, lzma
+, python
+, pythonOlder
+}:
+
+if !(pythonOlder "3.3") then null else buildPythonPackage rec {
+  pname = "backports.lzma";
+  version = "0.0.14";
+
+  disabled = isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "16d8b68e4d3cd4e6c9ddb059850452946da3914c8a8e197a7f2b0954559f2df4";
+  };
+
+  buildInputs = [ lzma ];
+
+  checkPhase = ''
+    ${python.interpreter} test/test_lzma.py
+  '';
+
+  # Relative import does not seem to function.
+  doCheck = false;
+
+  meta = {
+    description = "Backport of Python 3.3's 'lzma' module for XZ/LZMA compressed files";
+    homepage = "https://github.com/peterjc/backports.lzma";
+    license = lib.licenses.bsd3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/backports_os/default.nix b/nixpkgs/pkgs/development/python-modules/backports_os/default.nix
new file mode 100644
index 000000000000..b3e231bcd05d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/backports_os/default.nix
@@ -0,0 +1,35 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, setuptools_scm
+, future
+, isPy3k
+, python
+, hypothesis
+}:
+
+buildPythonPackage rec {
+  version = "0.1.1";
+  pname = "backports.os";
+  disabled = isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b472c4933094306ca08ec90b2a8cbb50c34f1fb2767775169a1c1650b7b74630";
+  };
+
+  buildInputs = [ setuptools_scm ];
+  checkInputs = [ hypothesis ];
+  propagatedBuildInputs = [ future ];
+
+  checkPhase = ''
+    ${python.interpreter} -m unittest discover tests
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/pjdelport/backports.os";
+    description = "Backport of new features in Python's os module";
+    license = licenses.mit;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..d6fecfbdfb91
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/backports_ssl_match_hostname/default.nix
@@ -0,0 +1,17 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "backports.ssl_match_hostname";
+  version = "3.7.0.1";
+
+  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..cc51e23260b8
--- /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..08f98de79f27
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/backports_unittest-mock/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv, 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..9770fb45981d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/backports_weakref/default.nix
@@ -0,0 +1,32 @@
+{ lib, stdenv
+, 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..59542e61c56b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bacpypes/default.nix
@@ -0,0 +1,31 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, fetchFromGitHub
+, wheel, pytestCheckHook, pytestrunner }:
+
+buildPythonPackage rec {
+  version = "0.18.1";
+  pname = "bacpypes";
+
+  src = fetchFromGitHub {
+    owner = "JoelBender";
+    repo = "bacpypes";
+    rev = version;
+    sha256 = "1fxrh57z3fjl95db8jh71grkv5id8qk65g6k5jqcs9v3dgkg8jkl";
+  };
+
+  propagatedBuildInputs = [ wheel ];
+
+  # Using pytes instead of setuptools check hook allows disabling specific tests
+  checkInputs = [ pytestCheckHook pytestrunner ];
+  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/bandit/default.nix b/nixpkgs/pkgs/development/python-modules/bandit/default.nix
new file mode 100644
index 000000000000..803928653934
--- /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.0";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "8a4c7415254d75df8ff3c3b15cfe9042ecee628a1e40b44c15a98890fbfc2608";
+  };
+
+  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..d2575afb77d2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bap/default.nix
@@ -0,0 +1,23 @@
+{lib, stdenv, 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..8a04befc6d16
--- /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.9";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0fib74nkqnl1i2zzlhbbfpw3whwc4951p9x61r2xrxhwp4r9yn5h";
+  };
+
+  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..a36727429ca7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/base58/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv, fetchPypi, buildPythonPackage, isPy27, pytest, pyhamcrest }:
+
+buildPythonPackage rec {
+  pname = "base58";
+  version = "2.0.1";
+  disabled = isPy27; # python 2 abandoned upstream
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "365c9561d9babac1b5f18ee797508cd54937a724b6e419a130abad69cec5ca79";
+  };
+
+  checkInputs = [ pytest pyhamcrest ];
+  checkPhase = ''
+    pytest
+  '';
+
+  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/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/default.nix b/nixpkgs/pkgs/development/python-modules/basemap/default.nix
new file mode 100644
index 000000000000..c97548bdee88
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/basemap/default.nix
@@ -0,0 +1,48 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, numpy
+, matplotlib
+, pillow
+, setuptools
+, pyproj
+, pyshp
+, six
+, pkgs
+}:
+
+buildPythonPackage rec {
+  pname = "basemap";
+  version = "1.2.1";
+
+  src = fetchFromGitHub {
+    owner = "matplotlib";
+    repo = "basemap";
+    rev = "v${version}rel";
+    sha256 = "13lw1iwa8hadpvqdgb06nh881l8c17awzvvwbfwblvb9q9s0lnzp";
+  };
+
+  propagatedBuildInputs = [ numpy matplotlib pillow pyproj pyshp six ];
+  buildInputs = [ setuptools pkgs.geos ];
+
+  # Standard configurePhase from `buildPythonPackage` seems to break the setup.py script
+  configurePhase = ''
+    export GEOS_DIR=${pkgs.geos}
+  '';
+
+  # The 'check' target is not supported by the `setup.py` script.
+  # TODO : do the post install checks (`cd examples && ${python.interpreter} run_all.py`)
+  doCheck = false;
+
+  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.
+    '';
+    license = with licenses; [ mit gpl2 ];
+  };
+
+}
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..8e29eed2acfd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bashlex/default.nix
@@ -0,0 +1,38 @@
+{ enum-compat
+, lib
+, buildPythonPackage
+, fetchFromGitHub
+, nose
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "bashlex";
+  version = "0.14";
+
+  src = fetchFromGitHub {
+    owner = "idank";
+    repo = pname;
+    rev = version;
+    sha256 = "070spmbf53y18miky5chgky4x5h8kp9czkp7dm173klv9pi2cn0k";
+  };
+
+  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
+  '';
+
+  meta = with lib; {
+    description = "Python parser for bash";
+    license = licenses.gpl3;
+    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..16b8f317a223
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/batchgenerators/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, isPy27
+, fetchFromGitHub
+, fetchpatch
+, pytestCheckHook
+, unittest2
+, future
+, numpy
+, pillow
+, scipy
+, scikitlearn
+, scikitimage
+, threadpoolctl
+}:
+
+buildPythonPackage rec {
+  pname = "batchgenerators";
+  version = "0.20.1";
+
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "MIC-DKFZ";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1f91yflv9rschyl5bnfn735hp1rxrzcxkx18aajmlzb067h0ip8m";
+
+  };
+
+  patches = [
+    # lift Pillow bound; should be merged in next release
+    (fetchpatch {
+      url = "https://github.com/MIC-DKFZ/batchgenerators/pull/59.patch";
+      sha256 = "171b3dm40yn0wi91m9s2nq3j565s1w39jpdf1mvc03rn75i8vdp0";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    future numpy pillow scipy scikitlearn scikitimage threadpoolctl
+  ];
+
+  checkInputs = [ pytestCheckHook unittest2 ];
+
+  meta = {
+    description = "2D and 3D image data augmentation for deep learning";
+    homepage = "https://github.com/MIC-DKFZ/batchgenerators";
+    license = lib.licenses.asl20;
+    maintainers = with lib.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..2acfa5ecd171
--- /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.0.1";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "jupyterhub";
+    repo = "batchspawner";
+    rev = "v${version}";
+    sha256 = "0vqf3qc2yp52441s6xwgixgl37976qqgpd9sshbgh924j314v1yv";
+  };
+
+  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..0ed3486272d3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/batinfo/default.nix
@@ -0,0 +1,22 @@
+{ lib, stdenv, 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..c41181ca7b04
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bayesian-optimization/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, python
+, scikitlearn
+, 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 = [
+    scikitlearn
+    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; {
+    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..b470d21b1bea
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bayespy/default.nix
@@ -0,0 +1,31 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, pythonOlder
+, pytest, nose, glibcLocales
+, numpy, scipy, matplotlib, h5py }:
+
+buildPythonPackage rec {
+  pname = "bayespy";
+  version = "0.5.20";
+
+  # 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 = "8c16cdc73bbcd9a1124a0495056065b7ce938dbe6c2c780dc330c83fb4d2640a";
+  };
+
+  checkInputs = [ pytest nose glibcLocales ];
+  propagatedBuildInputs = [ numpy scipy matplotlib h5py ];
+
+  checkPhase = ''
+    LC_ALL=en_US.utf-8 pytest -k 'not test_message_to_parents'
+  '';
+
+  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/bc-python-hcl2/default.nix b/nixpkgs/pkgs/development/python-modules/bc-python-hcl2/default.nix
new file mode 100644
index 000000000000..34eab21bf5d0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bc-python-hcl2/default.nix
@@ -0,0 +1,49 @@
+{ lib, buildPythonPackage, fetchPypi, nose }:
+
+let
+  lark-parser = buildPythonPackage rec {
+    pname = "lark-parser";
+    version = "0.7.8";
+
+    src = fetchPypi {
+      inherit pname version;
+      sha256 = "JiFeuxV+b7LudDGapERbnzt+RW4mviFc4Z/aqpAcIKQ=";
+    };
+
+    doCheck = true;
+  };
+in
+buildPythonPackage rec {
+  pname = "bc-python-hcl2";
+  version = "0.3.11";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "VZhI1oJ2EDZGyz3iI6/KYvJq4BGafzR+rcSgHqlUDrA=";
+  };
+
+  # Nose is required during build process, so can not use `checkInputs`.
+  buildInputs = [
+    nose
+  ];
+
+  propagatedBuildInputs = [
+    lark-parser
+  ];
+
+  pythonImportsCheck = [ "hcl2" ];
+
+  meta = with lib; {
+    description = "A parser for HCL2 written in Python using Lark";
+    longDescription = ''
+    A parser for HCL2 written in Python using Lark.
+    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 = [ 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..185fcb86b0b7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bcdoc/default.nix
@@ -0,0 +1,22 @@
+{ lib, stdenv, 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/3_1.nix b/nixpkgs/pkgs/development/python-modules/bcrypt/3_1.nix
new file mode 100644
index 000000000000..c70161cf28b0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bcrypt/3_1.nix
@@ -0,0 +1,23 @@
+{ stdenv, lib, buildPythonPackage, fetchPypi
+, isPyPy, cffi, pytest, six }:
+
+buildPythonPackage rec {
+  version = "3.1.7";
+  pname = "bcrypt";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0b0069c752ec14172c5f78208f1863d7ad6755a6fae6fe76ec2c80d13be41e42";
+  };
+
+  checkInputs = [ pytest ];
+
+  propagatedBuildInputs = [ six ] ++ lib.optional (!isPyPy) cffi;
+
+  meta = with lib; {
+    description = "Modern password hashing for your software and your servers";
+    homepage = "https://github.com/pyca/bcrypt/";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ domenkozar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bcrypt/default.nix b/nixpkgs/pkgs/development/python-modules/bcrypt/default.nix
new file mode 100644
index 000000000000..e74b0934b308
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bcrypt/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv, buildPythonPackage, isPyPy, fetchPypi, pythonOlder
+, cffi, pycparser, mock, pytest, py, six }:
+
+buildPythonPackage rec {
+  version = "3.2.0";
+  pname = "bcrypt";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "5b93c1726e50a93a033c36e5ca7fdcd29a5c7395af50a6892f5d9e7c6cfbfb29";
+  };
+
+  buildInputs = [ pycparser mock pytest py ];
+
+  propagatedBuildInputs = [ six ] ++ lib.optional (!isPyPy) cffi;
+
+  meta = with lib; {
+    maintainers = with maintainers; [ domenkozar ];
+    description = "Modern password hashing for your software and your servers";
+    license = licenses.asl20;
+    homepage = "https://github.com/pyca/bcrypt/";
+  };
+}
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..09e0b8b3f3e5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/beaker/default.nix
@@ -0,0 +1,76 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, nose
+, pylibmc
+, memcached
+, redis
+, pymongo
+, mock
+, webtest
+, sqlalchemy
+, pycrypto
+, cryptography
+, isPy27
+, isPy3k
+, funcsigs
+, pycryptopp
+}:
+
+buildPythonPackage rec {
+  pname = "Beaker";
+  version = "1.10.1";
+
+  # The pypy release do not contains the tests
+  src = fetchFromGitHub {
+    owner = "bbangert";
+    repo = "beaker";
+    rev = version;
+    sha256 = "0xrvg503xmi28w0hllr4s7fkap0p09fgw2wax3p1s2r6b3xjvbz7";
+  };
+
+  propagatedBuildInputs = [
+    sqlalchemy
+    pycrypto
+    cryptography
+  ] ++ lib.optionals (isPy27) [
+    funcsigs
+    pycryptopp
+  ];
+
+  checkInputs = [
+    nose
+    mock
+    webtest
+    pylibmc
+    memcached
+    redis
+    pymongo
+  ];
+
+
+  # Can not run memcached tests because it immediately tries to connect
+  postPatch = lib.optionalString isPy3k ''
+    substituteInPlace setup.py \
+      --replace "python-memcached" "python3-memcached"
+    '' + ''
+
+    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" \
+      -vv tests
+  '';
+
+  meta = {
+    description = "A Session and Caching library with WSGI Middleware";
+    maintainers = with lib.maintainers; [ domenkozar ];
+  };
+}
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..fa97c7c97a94
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/beancount/default.nix
@@ -0,0 +1,48 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, isPy3k
+, beautifulsoup4, bottle, chardet, dateutil
+, google_api_python_client, lxml, oauth2client
+, ply, python_magic, pytest, requests }:
+
+buildPythonPackage rec {
+  version = "2.3.3";
+  pname = "beancount";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0767ap2n9vk9dz40njndfhaprajr75fvzx7igbd1szc6x8wri8nr";
+  };
+
+  # Tests require files not included in the PyPI archive.
+  doCheck = false;
+
+  propagatedBuildInputs = [
+    beautifulsoup4
+    bottle
+    chardet
+    dateutil
+    google_api_python_client
+    lxml
+    oauth2client
+    ply
+    python_magic
+    requests
+    # pytest really is a runtime dependency
+    # https://bitbucket.org/blais/beancount/commits/554e13057551951e113835196770847c788dd592
+    pytest
+  ];
+
+  meta = with lib; {
+    homepage = "http://furius.ca/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.gpl2;
+    maintainers = with maintainers; [ ];
+  };
+}
+
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..0067716b6265
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/beancount_docverif/default.nix
@@ -0,0 +1,46 @@
+{ lib, buildPythonPackage, fetchPypi, isPy3k
+, beancount
+, pytest, sh
+}:
+
+buildPythonPackage rec {
+  version = "1.0.0";
+  pname = "beancount_docverif";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1kjc0axrxpvm828lqq5m2ikq0ls8xksbmm7312zw867gdx56x5aj";
+  };
+
+  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..a74f6c6f8f28
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/beanstalkc/default.nix
@@ -0,0 +1,22 @@
+{ lib, stdenv, 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/beautifulsoup4/default.nix b/nixpkgs/pkgs/development/python-modules/beautifulsoup4/default.nix
new file mode 100644
index 000000000000..555669da243e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/beautifulsoup4/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, soupsieve, pytest, python }:
+
+buildPythonPackage rec {
+  pname = "beautifulsoup4";
+  version = "4.9.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "84729e322ad1d5b4d25f805bfa05b902dd96450f43842c4e99067d5e1369eb25";
+  };
+
+  checkInputs = [ pytest ];
+  checkPhase = ''
+    py.test $out/${python.sitePackages}/bs4/tests
+  '';
+
+  propagatedBuildInputs = [ soupsieve ];
+
+  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/bedup/default.nix b/nixpkgs/pkgs/development/python-modules/bedup/default.nix
new file mode 100644
index 000000000000..f38d4263c248
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bedup/default.nix
@@ -0,0 +1,42 @@
+{ lib, stdenv
+, 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..43c74fc95716
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/behave/default.nix
@@ -0,0 +1,46 @@
+{ lib, stdenv, fetchFromGitHub
+, buildPythonApplication, python
+, pytestCheckHook, mock, pathpy, pyhamcrest, pytest-html
+, glibcLocales
+, colorama, cucumber-tag-expressions, parse, parse-type, six
+}:
+
+buildPythonApplication rec {
+  pname = "behave";
+  version = "1.2.7.dev1";
+
+  src = fetchFromGitHub {
+    owner = "behave";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1ssgixmqlg8sxsyalr83a1970njc2wg3zl8idsmxnsljwacv7qwv";
+  };
+
+  checkInputs = [ pytestCheckHook mock pathpy pyhamcrest pytest-html ];
+  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..6ee8b6499b58
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bellows/default.nix
@@ -0,0 +1,38 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub
+, click, click-log, pure-pcapy3
+, pyserial-asyncio, voluptuous, zigpy
+, asynctest, pytestCheckHook, pytest-asyncio }:
+
+buildPythonPackage rec {
+  pname = "bellows";
+  version = "0.21.0";
+
+  src = fetchFromGitHub {
+    owner = "zigpy";
+    repo = "bellows";
+    rev = version;
+    sha256 = "1gja7cb1cyzbi19k8awa2gyc3bjam0adapalpk5slxny0vxlc73a";
+  };
+
+  propagatedBuildInputs = [
+    click click-log pure-pcapy3 pyserial-asyncio voluptuous zigpy
+  ];
+
+  checkInputs = [
+    asynctest
+    pytestCheckHook
+    pytest-asyncio
+  ];
+
+  prePatch = ''
+    substituteInPlace setup.py \
+      --replace "click-log==0.2.0" "click-log>=0.2.0"
+  '';
+
+  meta = with lib; {
+    description = "A Python 3 project to implement EZSP for EmberZNet devices";
+    homepage = "https://github.com/zigpy/bellows";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ etu mvnetbiz ];
+  };
+}
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..555a0a487581
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bespon/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  version = "0.5.0";
+  pname = "BespON";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a75cd7e62746fb0fef9b98aa157a44f9ed2ef63e952f7ae4ec5b3c2892669187";
+  };
+
+  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.lgpl3;
+    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..424b8ef4ef36
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/betamax-matchers/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv, 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..3d3cad4d95b5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/betamax-serializers/default.nix
@@ -0,0 +1,20 @@
+{ lib, stdenv, 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..5e1469bfc52d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/betamax/default.nix
@@ -0,0 +1,22 @@
+{ lib, stdenv, 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..d69b2d6ce4ca
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bibtexparser/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage, fetchFromGitHub
+, future, pyparsing
+, glibcLocales, nose, unittest2
+}:
+
+buildPythonPackage rec {
+  pname = "bibtexparser";
+  version = "1.1.0";
+
+  # PyPI tarball does not ship tests
+  src = fetchFromGitHub {
+    owner = "sciunto-org";
+    repo = "python-${pname}";
+    rev = "v${version}";
+    sha256 = "1yj3hqnmkjh0sjjhmlm4097mmz98kna8rn0dd9g8zaw9g1a35h8c";
+  };
+
+  propagatedBuildInputs = [ future pyparsing ];
+
+  checkInputs = [ nose unittest2 glibcLocales ];
+
+  checkPhase = ''
+    LC_ALL="en_US.UTF-8" nosetests
+  '';
+
+  meta = {
+    description = "Bibtex parser for python 2.7 and 3.3 and newer";
+    homepage = "https://github.com/sciunto-org/python-bibtexparser";
+    license = with lib.licenses; [ gpl3 bsd3 ];
+    maintainers = with lib.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..dcb684a55e0d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bidict/default.nix
@@ -0,0 +1,41 @@
+{ lib, buildPythonPackage, fetchPypi
+, setuptools_scm
+, sphinx
+, hypothesis
+, py
+, pytestCheckHook
+, pytest-benchmark
+, sortedcollections
+, sortedcontainers
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "bidict";
+  version = "0.21.2";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "4fa46f7ff96dc244abfc437383d987404ae861df797e2fd5b190e233c302be09";
+  };
+
+  nativeBuildInputs = [ setuptools_scm ];
+  propagatedBuildInputs = [ sphinx ];
+
+  checkInputs = [
+    hypothesis
+    py
+    pytestCheckHook
+    pytest-benchmark
+    sortedcollections
+    sortedcontainers
+  ];
+
+  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..22807bb35351
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bids-validator/default.nix
@@ -0,0 +1,26 @@
+{ buildPythonPackage
+, lib
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  version = "1.5.8";
+  pname = "bids-validator";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "5b8c3b9047d2e00e25746d55f56f62071f0a82dd2de59371a1ee589fe28b2852";
+  };
+
+  # 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/billiard/default.nix b/nixpkgs/pkgs/development/python-modules/billiard/default.nix
new file mode 100644
index 000000000000..4f8aa3565da2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/billiard/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, isPyPy, pytestCheckHook, case, psutil, fetchpatch }:
+
+buildPythonPackage rec {
+  pname = "billiard";
+  version = "3.6.3.0";
+  disabled = isPyPy;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0spssl3byzqsplra166d59jx8iqfxyzvcbx7vybkmwr5ck72a5yr";
+  };
+  patches = [(fetchpatch {
+    # Add Python 3.9 support to spawnv_passfds()
+    # Should be included in next release after 3.6.3.0
+    url = "https://github.com/celery/billiard/pull/310/commits/a508ebafadcfe2e25554b029593f3e66d01ede6c.patch";
+    sha256 = "05zsr1bvjgi01qg7r274c0qvbn65iig3clyz14c08mpfyn38h84i";
+    excludes = [ "tox.ini" ];
+  })];
+
+  checkInputs = [ pytestCheckHook case psutil ];
+
+  meta = with lib; {
+    homepage = "https://github.com/celery/billiard";
+    description = "Python multiprocessing fork with improvements and bugfixes";
+    license = licenses.bsd3;
+  };
+}
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/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..c2f059dd93dc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/binwalk/default.nix
@@ -0,0 +1,57 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, zlib
+, xz
+, ncompress
+, gzip
+, bzip2
+, gnutar
+, p7zip
+, cabextract
+, cramfsprogs
+, cramfsswap
+, sasquatch
+, squashfsTools
+, lzma
+, matplotlib
+, nose
+, pycrypto
+, pyqtgraph ? null }:
+
+let
+  visualizationSupport = (pyqtgraph != null) && (matplotlib != null);
+  version = "2.2.0";
+in
+buildPythonPackage {
+  pname = "binwalk";
+  inherit version;
+
+  src = fetchFromGitHub {
+    owner = "devttys0";
+    repo = "binwalk";
+    rev = "be738a52e09b0da2a6e21470e0dbcd5beb42ed1b";
+    sha256 = "1bxgj569fzwv6jhcbl864nmlsi9x1k1r20aywjxc8b9b1zgqrlvc";
+  };
+
+  propagatedBuildInputs = [ zlib xz ncompress gzip bzip2 gnutar p7zip cabextract cramfsswap cramfsprogs sasquatch squashfsTools lzma pycrypto ]
+  ++ lib.optionals visualizationSupport [ matplotlib pyqtgraph ];
+
+  # 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 ];
+
+  meta = with lib; {
+    homepage = "https://github.com/ReFirmLabs/binwalk";
+    description = "A tool for searching a given binary image for embedded files";
+    maintainers = [ maintainers.koral ];
+  };
+}
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..43b48aa03a49
--- /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.78";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1ee0a0b6c2376680fea6642d5080baa419fd73df104a62d58a8baf7a8bbe4564";
+  };
+
+  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..17f996bfd709
--- /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 = "1.6.0";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "ebellocchia";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0zbjrgl4dd65r3liyp8syxr106z1wn7ngfcm5dlfcxqwj8zkf56m";
+  };
+
+  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..b3e9f7b83740
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/biplist/default.nix
@@ -0,0 +1,35 @@
+{ lib, buildPythonPackage, fetchPypi
+, pytest
+}:
+
+buildPythonPackage rec {
+  version = "1.0.3";
+  pname = "biplist";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1im45a9z7ryrfyp1v6i39qia5qagw6i1mhif0hl0praz9iv4j1ac";
+  };
+
+  checkInputs = [
+    pytest
+  ];
+
+  checkPhase = ''
+    pytest
+  '';
+
+  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..2f98f3917b84
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bitarray/default.nix
@@ -0,0 +1,19 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "bitarray";
+  version = "1.6.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ae27ce4bef4f35b4cc2c0b0d9cf02ed49eee567c23d70cb5066ad215f9b62b3c";
+  };
+
+  meta = with lib; {
+    description = "Efficient arrays of booleans";
+    homepage = "https://github.com/ilanschnell/bitarray";
+    changelog = "https://github.com/ilanschnell/bitarray/blob/master/CHANGE_LOG";
+    license = licenses.psfl;
+    maintainers = [ 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..ce62fd6dce04
--- /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 = "5.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "52b0b617660601939b30c8b588c28910946448b1b6d69ca231d5e3e47a322b71";
+  };
+
+  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/bitbucket-api/default.nix b/nixpkgs/pkgs/development/python-modules/bitbucket-api/default.nix
new file mode 100644
index 000000000000..559661bbb4f3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bitbucket-api/default.nix
@@ -0,0 +1,23 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, isPy3k
+, requests_oauthlib, nose, sh }:
+
+buildPythonPackage rec {
+  pname = "bitbucket-api";
+  version = "0.5.0";
+  disabled = isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b541d9d7f234074a74214505aff1846eb21e5dd6d3915139e817d4675d34f4e3";
+  };
+
+  propagatedBuildInputs = [ requests_oauthlib nose sh ];
+
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/Sheeprider/BitBucket-api";
+    description = "Python library to interact with BitBucket REST API";
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bitbucket-cli/default.nix b/nixpkgs/pkgs/development/python-modules/bitbucket-cli/default.nix
new file mode 100644
index 000000000000..50075fe70fce
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bitbucket-cli/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, isPy3k, requests }:
+
+buildPythonPackage rec {
+  pname = "bitbucket-cli";
+  version = "0.5.1";
+  disabled = isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1xmn73x6jirnwfwcdy380ncmkai9f9dhmld6zin01ypbqwgf50fq";
+  };
+
+  propagatedBuildInputs = [ requests ];
+
+  # No tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Bitbucket command line interface";
+    homepage = "https://bitbucket.org/zhemao/bitbucket-cli";
+    maintainers = with maintainers; [ refnil ];
+    license = licenses.bsd2;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bitcoin-price-api/default.nix b/nixpkgs/pkgs/development/python-modules/bitcoin-price-api/default.nix
new file mode 100644
index 000000000000..3e74c17f3be8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bitcoin-price-api/default.nix
@@ -0,0 +1,24 @@
+{ lib, buildPythonPackage, fetchPypi
+, dateutil, requests }:
+
+buildPythonPackage rec {
+  pname = "bitcoin-price-api";
+  version = "0.0.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "bc68076f9632aaa9a8009d916d67a709c1e045dd904cfc7a3e8be33960d32029";
+  };
+
+  propagatedBuildInputs = [ dateutil requests ];
+
+  # No tests in archive
+  doCheck = false;
+
+  meta = {
+    homepage = "https://github.com/dursk/bitcoin-price-api";
+    description = "Price APIs for bitcoin exchanges";
+    license = with lib.licenses; [ mit ];
+    maintainers = with lib.maintainers; [ bhipple ];
+  };
+}
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..71b032a34e49
--- /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'" \
+      "'${openssl.out}/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/bitmath/default.nix b/nixpkgs/pkgs/development/python-modules/bitmath/default.nix
new file mode 100644
index 000000000000..49992c561f73
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bitmath/default.nix
@@ -0,0 +1,20 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, isPy3k, progressbar231, 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..d6eaf31056ff
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bitstring/default.nix
@@ -0,0 +1,19 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "bitstring";
+  version = "3.1.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0jl6192dwrlm5ybkbh7ywmyaymrc3cmz9y07nm7qdli9n9rfpwzx";
+  };
+
+  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..43edd16f66aa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bitstruct/default.nix
@@ -0,0 +1,18 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "bitstruct";
+  version = "8.11.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "4e7b8769c0f09fee403d0a5f637f8b575b191a79a92e140811aa109ce7461f0c";
+  };
+
+  meta = with lib; {
+    homepage = "https://github.com/eerimoq/bitstruct";
+    description = "Python bit pack/unpack package";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jakewaksbaum ];
+  };
+}
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..2949ecbf6f92
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bjoern/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, libev, python }:
+
+buildPythonPackage rec {
+  pname = "bjoern";
+  version = "3.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "01f3b601cf0ab0a9c7cb9c8f944ab7c738baaa6043ca82db20e9bd7a9be5767b";
+  };
+
+  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..536ad1f14b66
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/black-macchiato/default.nix
@@ -0,0 +1,35 @@
+{ lib, stdenv,
+  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..3346afbb4ab9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/black/default.nix
@@ -0,0 +1,72 @@
+{ stdenv, lib
+, buildPythonPackage, fetchPypi, pythonOlder, setuptools_scm, pytestCheckHook
+, aiohttp
+, aiohttp-cors
+, appdirs
+, attrs
+, click
+, dataclasses
+, mypy-extensions
+, pathspec
+, regex
+, toml
+, typed-ast
+, typing-extensions }:
+
+buildPythonPackage rec {
+  pname = "black";
+  version = "20.8b1";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1spv6sldp3mcxr740dh3ywp25lly9s8qlvs946fin44rl1x5a0hw";
+  };
+
+  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 ];
+
+  preCheck = ''
+    export PATH="$PATH:$out/bin"
+  '';
+
+  disabledTests = [
+    # Don't know why these tests fails
+    "test_cache_multiple_files"
+    "test_failed_formatting_does_not_get_cached"
+    # requires network access
+    "test_gen_check_output"
+    "test_process_queue"
+  ] ++ lib.optionals stdenv.isDarwin [
+    # fails on darwin
+    "test_expression_diff"
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    aiohttp-cors
+    appdirs
+    attrs
+    click
+    mypy-extensions
+    pathspec
+    regex
+    toml
+    typed-ast
+    typing-extensions
+  ] ++ lib.optional (pythonOlder "3.7") dataclasses;
+
+  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 ];
+  };
+}
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..1bdedde1cb4e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bleach/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest
+, pytestrunner
+, six
+, html5lib
+, setuptools
+, packaging
+}:
+
+buildPythonPackage rec {
+  pname = "bleach";
+  version = "3.2.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "52b5919b81842b1854196eaae5ca29679a2f2e378905c346d3ca8227c2c66080";
+  };
+
+  checkInputs = [ pytest pytestrunner ];
+  propagatedBuildInputs = [ packaging six html5lib setuptools ];
+
+  # Disable network tests
+  checkPhase = ''
+    pytest -k "not protocols"
+  '';
+
+  meta = {
+    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 = lib.licenses.asl20;
+    maintainers = with lib.maintainers; [ prikhi ];
+  };
+}
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..06dc3217dc87
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bleak/default.nix
@@ -0,0 +1,34 @@
+{ lib, stdenv, buildPythonPackage, isPy3k, fetchPypi, bluez, txdbus, pytest, pytestcov }:
+
+buildPythonPackage rec {
+  pname = "bleak";
+  version = "0.10.0";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "5c3a873965f2910865895e572e7a4f10533d6e150e6ba17936397426bf8d1eee";
+  };
+
+  postPatch = ''
+    # bleak checks BlueZ's version with a call to `bluetoothctl -v` twice
+    substituteInPlace bleak/__init__.py \
+      --replace \"bluetoothctl\" \"${bluez}/bin/bluetoothctl\"
+    substituteInPlace bleak/backends/bluezdbus/client.py \
+      --replace \"bluetoothctl\" \"${bluez}/bin/bluetoothctl\"
+  '';
+
+  propagatedBuildInputs = [ txdbus ];
+  checkInputs = [ pytest pytestcov ];
+
+  checkPhase = "AGENT_OS=linux py.test";
+
+  meta = with lib; {
+    description = "Bluetooth Low Energy platform Agnostic Klient for Python";
+    homepage = "https://github.com/hbldh/bleak";
+    license = licenses.mit;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ oxzi ];
+  };
+}
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..7adacecc647a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/blessed/default.nix
@@ -0,0 +1,30 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, fetchpatch, six
+, wcwidth, pytest, mock, glibcLocales
+}:
+
+buildPythonPackage rec {
+  pname = "blessed";
+  version = "1.17.12";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "580429e7e0c6f6a42ea81b0ae5a4993b6205c6ccbb635d034b4277af8175753e";
+  };
+
+  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..5263a92ec3d9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/blessings/default.nix
@@ -0,0 +1,34 @@
+{ lib, stdenv
+, 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..e33ad1626318
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/blinker/default.nix
@@ -0,0 +1,18 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "blinker";
+  version = "1.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1dpq0vb01p36jjwbhhd08ylvrnyvcc82yxx3mwjx6awrycjyw6j7";
+  };
+
+  meta = with lib; {
+    homepage = "https://pythonhosted.org/blinker/";
+    description = "Fast, simple object-to-object and broadcast signaling";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
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..5e7cd42362dc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/blinkstick/default.nix
@@ -0,0 +1,31 @@
+{ lib, buildPythonPackage, fetchPypi, fetchpatch, pyusb }:
+
+buildPythonPackage rec {
+  pname = "BlinkStick";
+  version = "1.1.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "3edf4b83a3fa1a7bd953b452b76542d54285ff6f1145b6e19f9b5438120fa408";
+  };
+
+  patches = [
+    (fetchpatch {
+      url = "https://github.com/arvydas/blinkstick-python/commit/a9227d0.patch";
+      sha256 = "1mcmxlnkbfxwp84qz32l5rlc7r9anh9yhnqaj1y8rny5s13jb01f";
+    })
+    (fetchpatch {
+      url = "https://github.com/arvydas/blinkstick-python/pull/54.patch";
+      sha256 = "1gjq6xbai794bbdyrv82i96l1a7qkwvlhzd6sa937dy5ivv6s6hl";
+    })
+  ];
+
+  propagatedBuildInputs = [ pyusb ];
+
+  meta = with lib; {
+    description = "Python package to control BlinkStick USB devices";
+    homepage = "https://pypi.python.org/pypi/BlinkStick/";
+    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..eeb62e8fed32
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/blis/default.nix
@@ -0,0 +1,40 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, cython
+, hypothesis
+, numpy
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "blis";
+  version = "0.7.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "7daa615a97d4f28db0f332b710bfe1900b15d0c25841c6d727965e4fd91e09cf";
+  };
+
+  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;
+    maintainers = with maintainers; [ danieldk ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/blist/default.nix b/nixpkgs/pkgs/development/python-modules/blist/default.nix
new file mode 100644
index 000000000000..505f01af5fe4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/blist/default.nix
@@ -0,0 +1,33 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchpatch
+, fetchPypi
+, isPyPy
+}:
+
+buildPythonPackage rec {
+  pname = "blist";
+  version = "1.3.6";
+  disabled = isPyPy;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1hqz9pqbwx0czvq9bjdqjqh5bwfksva1is0anfazig81n18c84is";
+  };
+
+
+  patches = [
+    # Fix compatibility for Python 3.7 https://github.com/DanielStutzbach/blist/pull/78
+    (fetchpatch {
+      url = "https://github.com/DanielStutzbach/blist/commit/2dc1ec28ed68611fcec9ac1c68070c782d6b4b4e.patch";
+      sha256 = "0ma0z6ga80w3wzh3sidwd8ckfbgx4j1y7cc29q6j9ddrvxpf276y";
+    })
+  ];
+
+  meta = with lib; {
+    homepage = "http://stutzbachenterprises.com/blist/";
+    description = "A list-like type with better asymptotic performance and similar performance on small lists";
+    license = licenses.bsd0;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/blivet/default.nix b/nixpkgs/pkgs/development/python-modules/blivet/default.nix
new file mode 100644
index 000000000000..94abc39fd285
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/blivet/default.nix
@@ -0,0 +1,42 @@
+{ lib, stdenv, fetchFromGitHub, buildPythonPackage, pykickstart, pyparted, pyblock
+, pyudev, six, libselinux, multipath-tools, lsof, util-linux
+}:
+
+buildPythonPackage rec {
+  pname = "blivet";
+  version = "0.67";
+
+  src = fetchFromGitHub {
+    owner = "dwlehman";
+    repo = "blivet";
+    rev = "${pname}-${version}";
+    sha256 = "1gk94ghjrxfqnx53hph1j2s7qcv86fjz48is7l099q9c24rjv8ky";
+  };
+
+  postPatch = ''
+    sed -i \
+      -e 's|"multipath"|"${multipath-tools}/sbin/multipath"|' \
+      -e '/^def set_friendly_names/a \    return False' \
+      blivet/devicelibs/mpath.py
+    sed -i -e '/"wipefs"/ {
+      s|wipefs|${util-linux}/sbin/wipefs|
+      s/-f/--force/
+    }' blivet/formats/__init__.py
+    sed -i -e 's|"lsof"|"${lsof}/bin/lsof"|' blivet/formats/fs.py
+    sed -i -r -e 's|"(u?mount)"|"${util-linux}/bin/\1"|' blivet/util.py
+  '';
+
+  propagatedBuildInputs = [
+    pykickstart pyparted pyblock pyudev libselinux
+    six
+  ];
+
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://fedoraproject.org/wiki/Blivet";
+    description = "Module for management of a system's storage configuration";
+    license = with licenses; [ gpl2Plus lgpl21Plus ];
+    platforms = platforms.linux;
+  };
+}
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..3a9704d71bc5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/block-io/default.nix
@@ -0,0 +1,39 @@
+{ lib, stdenv, fetchPypi, buildPythonPackage, base58, ecdsa, pycryptodome, requests, six, setuptools }:
+
+buildPythonPackage rec {
+  pname = "block-io";
+  version = "1.1.15";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "97ea037a67af72037cb08cec7e0a9f7866ecdfaa1a8c8ebcc0f4b9359a1516d7";
+  };
+
+  propagatedBuildInputs = [
+    base58
+    ecdsa
+    pycryptodome
+    requests
+    six
+    setuptools
+  ];
+
+  preConfigure = ''
+    substituteInPlace setup.py \
+      --replace "ecdsa==0.15" "ecdsa>=0.15" \
+      --replace "base58==1.0.3" "base58>=1.0.3"
+  '';
+
+  # 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..5adc854d0263
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/blockdiag/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub
+, setuptools, funcparserlib, pillow, webcolors, reportlab, docutils
+}:
+
+buildPythonPackage rec {
+  pname = "blockdiag";
+  version = "2.0.1";
+
+  src = fetchFromGitHub {
+    owner = "blockdiag";
+    repo = "blockdiag";
+    rev = version;
+    sha256 = "1cvcl66kf4wdh2n4fdk37zk59lp58wd2fhf84n7pbn0lilyksk5x";
+  };
+
+  propagatedBuildInputs = [ setuptools funcparserlib pillow webcolors reportlab docutils ];
+
+  # require network and fail
+  doCheck = false;
+
+  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/bluepy/default.nix b/nixpkgs/pkgs/development/python-modules/bluepy/default.nix
new file mode 100644
index 000000000000..d833d20934d6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bluepy/default.nix
@@ -0,0 +1,35 @@
+{ lib, stdenv
+, 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/bme680/default.nix b/nixpkgs/pkgs/development/python-modules/bme680/default.nix
new file mode 100644
index 000000000000..cdae502e7e59
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bme680/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, smbus-cffi
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "bme680";
+  version = "1.0.5";
+
+  src = fetchFromGitHub {
+    owner = "pimoroni";
+    repo = "bme680-python";
+    rev = "v${version}";
+    sha256 = "sha256-oIXh1JnGTI/Cj4MQFpWq+sWR2X+ioCsK0Q+T7wPITCQ=";
+  };
+
+  propagatedBuildInputs = [ smbus-cffi ];
+
+  preBuild = ''
+    cd library
+  '';
+  checkInputs = [ pytestCheckHook ];
+
+  # next release will have tests, but not the current one
+  doCheck = false;
+
+  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..091b020efc25
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bokeh/default.nix
@@ -0,0 +1,100 @@
+{ buildPythonPackage
+, fetchPypi
+, futures
+, isPy27
+, isPyPy
+, jinja2
+, lib
+, mock
+, numpy
+, nodejs
+, packaging
+, pillow
+#, pytestCheckHook#
+, pytest
+, python
+, python-dateutil
+, pyyaml
+, selenium
+, six
+, substituteAll
+, tornado
+, typing-extensions
+, pytz
+, flaky
+, networkx
+, beautifulsoup4
+, requests
+, nbconvert
+, icalendar
+, pandas
+, pythonImportsCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "bokeh";
+  version = "2.2.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "c4a3f97afe5f525019dd58ee8c4e3d43f53fe1b1ac264ccaae9b02c07b2abc17";
+  };
+
+  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..13e264340da1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/boltons/default.nix
@@ -0,0 +1,39 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub, pytest }:
+
+buildPythonPackage rec {
+  pname = "boltons";
+  version = "20.2.0";
+
+  # No tests in PyPi Tarball
+  src = fetchFromGitHub {
+    owner = "mahmoud";
+    repo = "boltons";
+    rev = version;
+    sha256 = "08rd6av8dp5n1vz6nybmayl1mfsmj66cskiaybfshcgix29ca803";
+  };
+
+  checkInputs = [ pytest ];
+  checkPhase = "pytest tests";
+
+  meta = with lib; {
+    homepage = "https://github.com/mahmoud/boltons";
+    description = "220+ constructs, recipes, and snippets extending (and relying on nothing but) the Python standard library";
+    longDescription = ''
+      Boltons is a set of over 220 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..48bc53bbeeda
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/boltztrap2/default.nix
@@ -0,0 +1,45 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, spglib
+, numpy
+, scipy
+, matplotlib
+, ase
+, netcdf4
+, pytest
+, pythonOlder
+, cython
+, cmake
+}:
+
+buildPythonPackage rec {
+  version = "20.7.1";
+  pname = "BoltzTraP2";
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "41caa32e5778323471d87033f23537f6178a7aea64fba894c7f2b2579b51f7ed";
+  };
+
+  dontUseCmakeConfigure = true;
+
+  nativeBuildInputs = [ cmake cython ];
+  checkInputs = [ pytest ];
+  propagatedBuildInputs = [ spglib numpy scipy matplotlib ase netcdf4 ];
+
+  # pypi release does no include files for tests
+  doCheck = false;
+
+  checkPhase = ''
+    py.test
+  '';
+
+  meta = with lib; {
+    homepage = "http://www.boltztrap.org/";
+    description = "Band-structure interpolator and transport coefficient calculator";
+    license = licenses.gpl3;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..dc1b1be0d81b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/boolean-py/default.nix
@@ -0,0 +1,21 @@
+{ lib, buildPythonPackage, fetchFromGitHub
+}:
+
+buildPythonPackage rec {
+  pname = "boolean.py";
+  version = "3.8";
+
+  src = fetchFromGitHub {
+    owner = "bastikr";
+    repo = "boolean.py";
+    rev = "v${version}";
+    sha256 = "02jznrfrihhk69ai1vnh26s3rshl4kfc2id7li6xccavc2ws5y3b";
+  };
+
+  meta = with lib; {
+    homepage = "https://github.com/bastikr/boolean.py";
+    description = "Implements boolean algebra in one module";
+    license = licenses.bsd2;
+  };
+
+}
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..c747df90f5a5
--- /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/bootstrapped-pip/default.nix b/nixpkgs/pkgs/development/python-modules/bootstrapped-pip/default.nix
new file mode 100644
index 000000000000..5a6333d656af
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bootstrapped-pip/default.nix
@@ -0,0 +1,67 @@
+{ lib, stdenv, python, fetchPypi, makeWrapper, unzip, makeSetupHook
+, pipInstallHook
+, setuptoolsBuildHook
+, wheel, pip, setuptools
+, isPy27
+}:
+
+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 ];
+
+  buildPhase = ":";
+
+  installPhase = lib.strings.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
+    ${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/boto/default.nix b/nixpkgs/pkgs/development/python-modules/boto/default.nix
new file mode 100644
index 000000000000..042a9a296ff7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/boto/default.nix
@@ -0,0 +1,42 @@
+{ pkgs
+, buildPythonPackage
+, fetchPypi
+, pythonAtLeast
+, isPy38
+, python
+, nose
+, mock
+, requests
+, httpretty
+}:
+
+buildPythonPackage rec {
+  pname = "boto";
+  version = "2.49.0";
+  disabled = pythonAtLeast "3.9"; # no longer compatible with hmac std lib package
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ea0d3b40a2d852767be77ca343b58a9e3a4b00d9db440efb8da74b4e58025e5a";
+  };
+
+  checkPhase = ''
+    ${python.interpreter} tests/test.py default
+  '';
+
+  doCheck = (!isPy38); # hmac functionality has changed
+  checkInputs = [ nose mock ];
+  propagatedBuildInputs = [ requests httpretty ];
+
+  meta = with pkgs.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..92972470f1c0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/boto3/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, botocore
+, jmespath
+, s3transfer
+, futures
+, docutils
+, nose
+, mock
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname =  "boto3";
+  version = "1.16.57"; # N.B: if you change this, change botocore too
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-SkmcwvU91VeojG22pVJ0iiq9g//tpwzrcdyNs5oCcxQ=";
+  };
+
+  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;
+
+  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..a17e6c728cf7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/botocore/default.nix
@@ -0,0 +1,49 @@
+{ buildPythonPackage
+, fetchPypi
+, dateutil
+, jmespath
+, docutils
+, ordereddict
+, simplejson
+, mock
+, nose
+, urllib3
+}:
+
+buildPythonPackage rec {
+  pname = "botocore";
+  version = "1.19.57"; # N.B: if you change this, change boto3 and awscli to a matching version
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-x1bWX/qYnFwOkheBdeQav3sYrRmy/i6C4ZLwheJk4Do=";
+  };
+
+  propagatedBuildInputs = [
+    dateutil
+    jmespath
+    docutils
+    ordereddict
+    simplejson
+    urllib3
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py --replace "docutils>=0.10,<0.16" "docutils>=0.10"
+  '';
+
+  checkInputs = [ mock nose ];
+
+  checkPhase = ''
+    nosetests -v
+  '';
+
+  # Network access
+  doCheck = false;
+
+  meta = {
+    homepage = "https://github.com/boto/botocore";
+    license = "bsd";
+    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..213d69dd9890
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bottle/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, setuptools }:
+
+buildPythonPackage rec {
+  pname = "bottle";
+  version = "0.12.19";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a9d73ffcbc6a1345ca2d7949638db46349f5b2b77dac65d6494d45c23628da2c";
+  };
+
+  propagatedBuildInputs = [ setuptools ];
+
+  meta = with lib; {
+    homepage = "http://bottlepy.org";
+    description = "A fast and simple micro-framework for small web-applications";
+    license = licenses.mit;
+    platforms = platforms.all;
+    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..f7e7dc7c390c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bottleneck/default.nix
@@ -0,0 +1,34 @@
+{ lib, buildPythonPackage, fetchPypi
+, nose
+, numpy
+, pytest
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "Bottleneck";
+  version = "1.3.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "20179f0b66359792ea283b69aa16366419132f3b6cf3adadc0c48e2e8118e573";
+  };
+
+  propagatedBuildInputs = [ numpy ];
+
+  postPatch = ''
+    substituteInPlace setup.py --replace "__builtins__.__NUMPY_SETUP__ = False" ""
+  '';
+
+  checkInputs = [ pytest nose ];
+  checkPhase = ''
+    py.test -p no:warnings $out/${python.sitePackages}
+  '';
+
+  meta = with lib; {
+    description = "Fast NumPy array functions written in C";
+    homepage = "https://github.com/pydata/bottleneck";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/box2d/default.nix b/nixpkgs/pkgs/development/python-modules/box2d/default.nix
new file mode 100644
index 000000000000..92ac90ab6d4d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/box2d/default.nix
@@ -0,0 +1,36 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, swig2
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "Box2D";
+  version = "2.3.2";
+  disabled = isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d1557dffdf9c1d6c796ec5df53e3d93227bb026c14b8411d22c295edaa2fb225";
+  };
+
+  postPatch = ''
+    sed -i "s/'Box2D.tests' : 'tests'//" setup.py
+  '';
+
+  nativeBuildInputs = [ swig2 ];
+
+  # tests not included with pypi release
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/pybox2d/pybox2d";
+    description = ''
+      A 2D game physics library for Python under
+      the very liberal zlib license
+    '';
+    license = licenses.zlib;
+    maintainers = with maintainers; [ sepi ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bpython/clipboard-make-which-substitutable.patch b/nixpkgs/pkgs/development/python-modules/bpython/clipboard-make-which-substitutable.patch
new file mode 100644
index 000000000000..685d34228a1b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bpython/clipboard-make-which-substitutable.patch
@@ -0,0 +1,27 @@
+From 6f544a5bd43446859754cb80e012af933b843db9 Mon Sep 17 00:00:00 2001
+From: Florian Klink <flokli@flokli.de>
+Date: Wed, 3 Jun 2020 22:05:34 +0200
+Subject: [PATCH] clipboard: make which substitutable
+
+This is used to detect the presence of xclip and other clipboard
+handling tools.
+---
+ bpython/clipboard.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/bpython/clipboard.py b/bpython/clipboard.py
+index aee429b..f346429 100644
+--- a/bpython/clipboard.py
++++ b/bpython/clipboard.py
+@@ -58,7 +58,7 @@ class OSXClipboard(object):
+ 
+ def command_exists(command):
+     process = subprocess.Popen(
+-        ["which", command], stderr=subprocess.STDOUT, stdout=subprocess.PIPE
++        ["@which@", command], stderr=subprocess.STDOUT, stdout=subprocess.PIPE
+     )
+     process.communicate()
+ 
+-- 
+2.26.2
+
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..108d8ec0c66b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bpython/default.nix
@@ -0,0 +1,45 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, curtsies
+, greenlet
+, mock
+, pygments
+, requests
+, substituteAll
+, urwid
+, which }:
+
+buildPythonPackage rec {
+  pname = "bpython";
+  version = "0.20.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "6e7738806013b469be57b0117082b9c4557ed7c92c70ceb79f96d674d89c7503";
+  };
+
+  patches = [ (substituteAll {
+    src = ./clipboard-make-which-substitutable.patch;
+    which = "${which}/bin/which";
+  })];
+
+  propagatedBuildInputs = [ curtsies greenlet pygments requests urwid ];
+
+  postInstall = ''
+    substituteInPlace "$out/share/applications/org.bpython-interpreter.bpython.desktop" \
+      --replace "Exec=/usr/bin/bpython" "Exec=$out/bin/bpython"
+  '';
+
+  checkInputs = [ mock ];
+
+  # tests fail: https://github.com/bpython/bpython/issues/712
+  doCheck = false;
+
+  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 ];
+  };
+}
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..7eba4743f0ff
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/braintree/default.nix
@@ -0,0 +1,27 @@
+{ lib,
+  fetchPypi,
+  requests,
+  buildPythonPackage
+}:
+
+buildPythonPackage rec {
+  pname = "braintree";
+  version = "4.5.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "98b9775e3d5f793c0a47df6b3649cd175705ee2d9163f7853e8c73acec7b923f";
+  };
+
+  propagatedBuildInputs = [ requests ];
+
+  # pypi release does not include tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Python library for integration with Braintree";
+    homepage = "https://github.com/braintree/braintree_python";
+    license = licenses.mit;
+    maintainers = [ maintainers.ivegotasthma ];
+  };
+}
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..4251c88058cd
--- /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.4.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "c111453617b17ab2bda60a4cd71787d6f2b59c85cdf71ab160a737606ac66c31";
+  };
+
+  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..8c65cca07b2e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bravado-core/default.nix
@@ -0,0 +1,52 @@
+{ lib, buildPythonPackage, fetchFromGitHub, python-dateutil, jsonref, jsonschema,
+  pyyaml, simplejson, six, pytz, msgpack, swagger-spec-validator, rfc3987,
+  strict-rfc3339, webcolors, mypy-extensions, jsonpointer, idna, pytest, mock,
+  pytest-benchmark, isPy27, enum34 }:
+
+buildPythonPackage rec {
+  pname = "bravado-core";
+  version = "5.16.1";
+
+  src = fetchFromGitHub {
+    owner = "Yelp";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0r9gk5vkjbc407fjydms3ik3hnzajq54znyz58d8rm6pvqcvjjpl";
+  };
+
+  checkInputs = [
+    mypy-extensions
+    pytest
+    mock
+    pytest-benchmark
+  ];
+
+  checkPhase = "pytest --benchmark-skip";
+
+  propagatedBuildInputs = [
+    python-dateutil
+    jsonref
+    jsonschema
+    pyyaml
+    simplejson
+    six
+    pytz
+    msgpack
+    swagger-spec-validator
+
+    # the following 3 packages are included when jsonschema (3.2) is installed
+    # as jsonschema[format], which reflects what happens in setup.py
+    rfc3987
+    strict-rfc3339
+    webcolors
+    jsonpointer
+    idna
+  ] ++ lib.optionals isPy27 [ enum34 ];
+
+  meta = with lib; {
+    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..15f292953b67
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bravia-tv/default.nix
@@ -0,0 +1,28 @@
+{ lib, fetchFromGitHub, buildPythonPackage, isPy27, requests }:
+
+buildPythonPackage rec {
+  pname = "bravia-tv";
+  version = "1.0.8";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "dcnielsen90";
+    repo = "python-bravia-tv";
+    rev = "v${version}";
+    sha256 = "0djwy4z1y173q3mnbngp754yrwzmm6h3x0rshvrvd64b78x1bsmp";
+  };
+
+  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..29de26ac495e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/breathe/default.nix
@@ -0,0 +1,24 @@
+{ lib, fetchPypi, buildPythonPackage, docutils, six, sphinx, isPy3k, isPy27 }:
+
+buildPythonPackage rec {
+  version = "4.26.1";
+  pname = "breathe";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f59ecadebbb76e3b4710e8c9d2f8f98d51e54701930a38ddf732930653dcf6b5";
+  };
+
+  propagatedBuildInputs = [ docutils six sphinx ];
+
+  doCheck = !isPy3k;
+
+  meta = {
+    homepage = "https://github.com/michaeljones/breathe";
+    license = lib.licenses.bsd3;
+    description = "Sphinx Doxygen renderer";
+    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..21d0b6d9f308
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/breezy/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, configobj
+, patiencediff
+, six
+, fastimport
+, dulwich
+, launchpadlib
+, testtools
+}:
+
+buildPythonPackage rec {
+  pname = "breezy";
+  version = "3.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1eff207403f48898fa3b3ffa7a4275197c6c58fec105ef267caf1f5fd5a6c7be";
+  };
+
+  propagatedBuildInputs = [ configobj patiencediff six 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"
+  '';
+
+  pythonImportsCheck = [ "breezy" ];
+
+  meta = with lib; {
+    description = "Friendly distributed version control system";
+    homepage = "https://www.breezy-vcs.org/";
+    license = licenses.gpl2;
+    maintainers = [ maintainers.marsam ];
+  };
+}
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..dcb1368f4116
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/broadlink/default.nix
@@ -0,0 +1,28 @@
+{ lib, fetchPypi, buildPythonPackage
+, cryptography, pyaes, pycrc }:
+
+buildPythonPackage rec {
+  pname = "broadlink";
+  version = "0.16.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "637dabc6f47b283b72bc521322554462da7a247f04614e458d65df8574d03a41";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace pyaes==1.6.0 pyaes
+    '';
+
+  propagatedBuildInputs = [ cryptography pyaes pycrc ];
+
+  # no tests available
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Python API for controlling Broadlink IR controllers";
+    homepage =  "https://github.com/mjg59/python-broadlink";
+    license = licenses.mit;
+  };
+}
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..394021ff2b21
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/brother/default.nix
@@ -0,0 +1,36 @@
+{ lib, buildPythonPackage, fetchFromGitHub, pythonOlder
+, pysnmp
+, asynctest, pytestcov, pytestrunner, pytest-asyncio, pytest-trio, pytest-tornasync }:
+
+buildPythonPackage rec {
+  pname = "brother";
+  version = "0.1.18";
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "bieniu";
+    repo = pname;
+    rev = version;
+    sha256 = "14fiwhgcgymgqsl9kcfb0597rcjxvdknhwbakpdf0xp2ph6cj266";
+  };
+
+  propagatedBuildInputs = [
+    pysnmp
+  ];
+
+  checkInputs = [
+    asynctest
+    pytestcov
+    pytestrunner
+    pytest-asyncio
+    pytest-trio
+    pytest-tornasync
+  ];
+
+  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..0da53ab5ca22
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/brotli/default.nix
@@ -0,0 +1,28 @@
+{ lib, buildPythonPackage, fetchFromGitHub, pytest }:
+
+buildPythonPackage rec {
+  pname = "brotli";
+  version = "1.0.7";
+
+  # PyPI doesn't contain tests so let's use GitHub
+  src = fetchFromGitHub {
+    owner = "google";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1811b55wdfg4kbsjcgh1kc938g118jpvif97ilgrmbls25dfpvvw";
+  };
+
+  dontConfigure = true;
+
+  checkInputs = [ pytest ];
+
+  checkPhase = ''
+    pytest python/tests
+  '';
+
+  meta = {
+    homepage = "https://github.com/google/brotli";
+    description = "Generic-purpose lossless compression algorithm";
+    license = lib.licenses.mit;
+  };
+}
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..f914d2d6c97c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/brotlipy/default.nix
@@ -0,0 +1,36 @@
+{ 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 ];
+
+  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/browser-cookie3/default.nix b/nixpkgs/pkgs/development/python-modules/browser-cookie3/default.nix
new file mode 100644
index 000000000000..7b579a84ba18
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/browser-cookie3/default.nix
@@ -0,0 +1,25 @@
+{ lib, fetchPypi, buildPythonPackage, isPy3k, lz4, keyring, pbkdf2, pycryptodome, pyaes}:
+
+buildPythonPackage rec {
+  pname = "browser-cookie3";
+  version = "0.12.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "5f26422091ad0e97375d565f8fbacfaf314d0722db35c921635eab23686e4fc4";
+  };
+
+  disabled = !isPy3k;
+
+  propagatedBuildInputs = [ lz4 keyring pbkdf2 pyaes pycryptodome ];
+
+  # No tests implemented
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Loads cookies from your browser into a cookiejar object";
+    maintainers = with maintainers; [ borisbabic ];
+    homepage = "https://github.com/borisbabic/browser_cookie3";
+    license = licenses.gpl3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/browsermob-proxy/default.nix b/nixpkgs/pkgs/development/python-modules/browsermob-proxy/default.nix
new file mode 100644
index 000000000000..1c69d70a134a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/browsermob-proxy/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, requests
+, urllib3
+}:
+
+buildPythonPackage rec {
+  pname = "browsermob-proxy";
+  version = "0.8.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1bxvmghm834gsfz3pm69772wzhh15p8ci526b25dpk3z4315nd7v";
+  };
+
+  propagatedBuildInputs = [ (requests.override { urllib3 = urllib3.override {
+    pyopenssl = null;
+    cryptography = null;
+  };}) ];
+
+  meta = {
+    description = "A library for interacting with Browsermob Proxy";
+    homepage = "http://oss.theautomatedtester.co.uk/browsermob-proxy-py";
+    license = lib.licenses.asl20;
+    maintainers = with lib.maintainers; [ raskin ];
+  };
+}
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..f670bebc8ed3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bsblan/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, aresponses
+, coverage
+, mypy
+, pytest-asyncio
+, pytest-cov
+, pytest-mock
+, aiohttp
+, attrs
+, cattrs
+, yarl
+}:
+
+buildPythonPackage rec {
+  pname = "bsblan";
+  version = "0.4.1";
+
+  src = fetchFromGitHub {
+    owner = "liudger";
+    repo = "python-bsblan";
+    rev = "v.${version}";
+    sha256 = "0vyg9vsrs34jahlav83qp2djv81p3ks31qz4qh46zdij2nx7l1fv";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    attrs
+    cattrs
+    yarl
+  ];
+
+  checkInputs = [
+    aresponses
+    coverage
+    mypy
+    pytest-asyncio
+    pytest-cov
+    pytest-mock
+    pytestCheckHook
+  ];
+
+  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..9877a03a087e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bsddb3/default.nix
@@ -0,0 +1,38 @@
+{ lib, stdenv
+, 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..f70f71c1a699
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bsdiff4/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, aflplusplus
+}:
+
+buildPythonPackage rec {
+  pname = "bsdiff4";
+  version = "1.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "17fc0dd4204x5gqapvbrc4kv83jdajs00jxm739586pl0iapybrw";
+  };
+
+  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/bt-proximity/default.nix b/nixpkgs/pkgs/development/python-modules/bt-proximity/default.nix
new file mode 100644
index 000000000000..209565fa21b7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bt-proximity/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub
+, pybluez }:
+
+buildPythonPackage {
+  pname = "bt-proximity";
+  version = "0.0.20180217";
+
+  # pypi only has a pre-compiled wheel and no sources
+  src = fetchFromGitHub {
+    owner  = "FrederikBolding";
+    repo   = "bluetooth-proximity";
+    rev    = "463bade8a9080b47f09bf4a47830b31c69c5dffd";
+    sha256 = "0anfh90cj3c2g7zqrjvq0d6dzpb4hjl6gk8zw0r349j2zw9i4h7y";
+  };
+
+  propagatedBuildInputs = [ pybluez ];
+
+  # there are no tests
+  doCheck = false;
+
+  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..ebb14a77b564
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/btchip/default.nix
@@ -0,0 +1,22 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, hidapi, pyscard, ecdsa }:
+
+buildPythonPackage rec {
+  pname = "btchip-python";
+  version = "0.1.31";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "4167f3c6ea832dd189d447d0d7a8c2a968027671ae6f43c680192f2b72c39b2c";
+  };
+
+  propagatedBuildInputs = [ hidapi pyscard ecdsa ];
+
+  # tests requires hardware
+  doCheck = false;
+
+  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..471ba54215de
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/btrees/default.nix
@@ -0,0 +1,34 @@
+{ lib, stdenv
+, fetchPypi
+, buildPythonPackage
+, persistent
+, zope_interface
+, transaction
+, zope_testrunner
+}:
+
+buildPythonPackage rec {
+  pname = "BTrees";
+  version = "4.7.2";
+
+  buildInputs = [ transaction ];
+  propagatedBuildInputs = [ persistent zope_interface ];
+  checkInputs = [ zope_testrunner ];
+
+  # disable a failing test that looks broken
+  postPatch = ''
+    substituteInPlace BTrees/tests/common.py \
+      --replace "testShortRepr" "no_testShortRepr"
+  '';
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "7ce4a5eb5c135bcb5c06b5bd1ca6fd7fd39d8631306182307ed8bc30d3033846";
+  };
+
+  meta = with lib; {
+    description = "Scalable persistent components";
+    homepage = "http://packages.python.org/BTrees";
+    license = licenses.zpl21;
+  };
+}
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..8ea93fe005e7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/btrfs/default.nix
@@ -0,0 +1,22 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "btrfs";
+  version = "11";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1w92sj47wy53ygz725xr613k32pk5khi0g9lrpp6img871241hrx";
+  };
+
+  meta = with lib; {
+    description = "Inspect btrfs filesystems";
+    homepage = "https://github.com/knorrie/python-btrfs";
+    license = licenses.lgpl3Plus;
+    platforms = platforms.linux;
+    maintainers = [ maintainers.evils ];
+  };
+}
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..5e3b0b4e89f7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bugsnag/default.nix
@@ -0,0 +1,30 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, six
+, webob
+}:
+
+buildPythonPackage rec {
+  pname = "bugsnag";
+  version = "4.0.2";
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "7a49dacf055a8c6dda4ce714acd91fabe9546f1ad826276918a26603a8b5489a";
+  };
+
+  propagatedBuildInputs = [ six webob ];
+
+  # no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Automatic error monitoring for django, flask, etc.";
+    homepage = "https://www.bugsnag.com";
+    license = licenses.mit;
+    platforms = platforms.unix;
+  };
+}
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..3d27384efe18
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bugwarrior/default.nix
@@ -0,0 +1,31 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, pythonOlder, setuptools
+, twiggy, requests, offtrac, bugzilla, taskw, 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 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..5324a43e1b0c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bugz/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv
+, 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..fc122ecd233c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bugzilla/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv, 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 peti ];
+  };
+}
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..46c3bea0b8c5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/build/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, flit-core
+, toml
+, pep517
+, packaging
+, isPy3k
+, typing
+, pythonOlder
+, importlib-metadata
+}:
+
+buildPythonPackage rec {
+  pname = "build";
+  version = "0.1.0";
+
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1d6m21lijwm04g50nwgsgj7x3vhblzw7jv05ah8psqgzk20bbch8";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [
+    toml
+    pep517
+    packaging
+  ] ++ lib.optionals (!isPy3k) [
+    typing
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  # No tests in archive
+  doCheck = false;
+
+  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";
+    maintainers = with maintainers; [ fab ];
+    license = licenses.mit;
+  };
+}
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..84476a2ca361
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/buildbot/default.nix
@@ -0,0 +1,104 @@
+{ stdenv, lib, buildPythonPackage, fetchPypi, makeWrapper, isPy3k,
+  python, twisted, jinja2, zope_interface, future, sqlalchemy,
+  sqlalchemy_migrate, dateutil, txaio, autobahn, pyjwt, pyyaml, treq,
+  txrequests, pypugjs, boto3, moto, mock, python-lz4, setuptoolsTrial,
+  isort, pylint, flake8, buildbot-worker, buildbot-pkg, buildbot-plugins,
+  parameterized, git, openssh, glibcLocales, nixosTests }:
+
+let
+  withPlugins = plugins: buildPythonPackage {
+    name = "${package.name}-with-plugins";
+    phases = [ "installPhase" "fixupPhase" ];
+    buildInputs = [ 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 = "2.10.0";
+
+    src = fetchPypi {
+      inherit pname version;
+      sha256 = "06fgp5gpacyx1sqh1f6590r792d5lhzspwmjli592ajx69ckzzwf";
+    };
+
+    propagatedBuildInputs = [
+      # core
+      twisted
+      jinja2
+      zope_interface
+      sqlalchemy
+      sqlalchemy_migrate
+      dateutil
+      txaio
+      autobahn
+      pyjwt
+      pyyaml
+    ]
+      # tls
+      ++ twisted.extras.tls;
+
+    checkInputs = [
+      treq
+      txrequests
+      pypugjs
+      boto3
+      moto
+      mock
+      python-lz4
+      setuptoolsTrial
+      isort
+      pylint
+      flake8
+      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
+    ];
+
+    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"
+    '';
+
+    disabled = !isPy3k;
+
+    passthru = {
+      inherit withPlugins;
+      tests.buildbot = nixosTests.buildbot;
+    };
+
+    meta = with lib; {
+      homepage = "https://buildbot.net/";
+      description = "An open-source continuous integration framework for automating software build, test, and release processes";
+      maintainers = with maintainers; [ nand0p 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..90c2f0991970
--- /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 = "1wr8fxa80c6vq55zv7k9rf61r805flrhd2v28qfl05jz1inghysb";
+  };
+
+  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; [ nand0p 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..92e78f940d53
--- /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 = "0bzn00qqx0xd9r4rrz01y9zmiwjlhcanrs13r1yzp2mycn9q5865";
+    };
+
+    # 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; [ nand0p ryansydnor lopsided98 ];
+      license = licenses.gpl2;
+    };
+  };
+
+  console-view = buildPythonPackage rec {
+    pname = "buildbot-console-view";
+    inherit (buildbot-pkg) version;
+
+    src = fetchPypi {
+      inherit pname version;
+      sha256 = "0yh0dpg27gl3pk3nimj1yb6rw7kxvsv1bvzc6hbcfx3a9qdajicj";
+    };
+
+    buildInputs = [ buildbot-pkg ];
+
+    # No tests
+    doCheck = false;
+
+    meta = with lib; {
+      homepage = "https://buildbot.net/";
+      description = "Buildbot Console View Plugin";
+      maintainers = with maintainers; [ nand0p ryansydnor lopsided98 ];
+      license = licenses.gpl2;
+    };
+  };
+
+  waterfall-view = buildPythonPackage rec {
+    pname = "buildbot-waterfall-view";
+    inherit (buildbot-pkg) version;
+
+    src = fetchPypi {
+      inherit pname version;
+      sha256 = "0b9fffr53wfq328csrqgdinafbs1v5s7yn4ky8faw6sqyd8l197v";
+    };
+
+    buildInputs = [ buildbot-pkg ];
+
+    # No tests
+    doCheck = false;
+
+    meta = with lib; {
+      homepage = "https://buildbot.net/";
+      description = "Buildbot Waterfall View Plugin";
+      maintainers = with maintainers; [ nand0p ryansydnor lopsided98 ];
+      license = licenses.gpl2;
+    };
+  };
+
+  grid-view = buildPythonPackage rec {
+    pname = "buildbot-grid-view";
+    inherit (buildbot-pkg) version;
+
+    src = fetchPypi {
+      inherit pname version;
+      sha256 = "0pz1kmq731ap79l05l13f10r81lzgif5aydpsfz3k5fa9flvxjxs";
+    };
+
+    buildInputs = [ buildbot-pkg ];
+
+    # No tests
+    doCheck = false;
+
+    meta = with lib; {
+      homepage = "https://buildbot.net/";
+      description = "Buildbot Grid View Plugin";
+      maintainers = with maintainers; [ nand0p lopsided98 ];
+      license = licenses.gpl2;
+    };
+  };
+
+  wsgi-dashboards = buildPythonPackage rec {
+    pname = "buildbot-wsgi-dashboards";
+    inherit (buildbot-pkg) version;
+
+    src = fetchPypi {
+      inherit pname version;
+      sha256 = "1jf72dzmgwrkqbr2f8s2dvf0zpvl3vbdq0qsf0g8xal272l7cmca";
+    };
+
+    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/worker.nix b/nixpkgs/pkgs/development/python-modules/buildbot/worker.nix
new file mode 100644
index 000000000000..bf5e1e6ae989
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/buildbot/worker.nix
@@ -0,0 +1,28 @@
+{ lib, buildPythonPackage, fetchPypi, buildbot, setuptoolsTrial, mock, twisted,
+  future, coreutils }:
+
+buildPythonPackage (rec {
+  pname = "buildbot-worker";
+  inherit (buildbot) version;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1s51ycgnvjbxc2y358vw6rnw8xsx9grj6pxzfxjrph784igy22r0";
+  };
+
+  propagatedBuildInputs = [ twisted future ];
+
+  checkInputs = [ setuptoolsTrial mock ];
+
+  postPatch = ''
+    substituteInPlace buildbot_worker/scripts/logwatcher.py \
+      --replace /usr/bin/tail "${coreutils}/bin/tail"
+  '';
+
+  meta = with lib; {
+    homepage = "https://buildbot.net/";
+    description = "Buildbot Worker Daemon";
+    maintainers = with maintainers; [ nand0p ryansydnor lopsided98 ];
+    license = licenses.gpl2;
+  };
+})
diff --git a/nixpkgs/pkgs/development/python-modules/buildout-nix/default.nix b/nixpkgs/pkgs/development/python-modules/buildout-nix/default.nix
new file mode 100644
index 000000000000..7f7afd67e7e0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/buildout-nix/default.nix
@@ -0,0 +1,22 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "zc.buildout";
+  version = "2.13.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1dyc5g3yv7wm3hf3fcsh6y1wivzjj1bspafr5qqb653z9a31lsfn";
+  };
+
+  patches = [ ./nix.patch ];
+
+  postInstall = "mv $out/bin/buildout{,-nix}";
+
+  meta = with lib; {
+    homepage = "http://www.buildout.org";
+    description = "A software build and configuration system";
+    license = licenses.zpl21;
+    maintainers = [ maintainers.goibhniu ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/buildout-nix/nix.patch b/nixpkgs/pkgs/development/python-modules/buildout-nix/nix.patch
new file mode 100644
index 000000000000..49f3c6d90f0a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/buildout-nix/nix.patch
@@ -0,0 +1,28 @@
+--- a/src/zc/buildout/buildout.py       2017-08-18 10:06:24.946428977 +0300
++++ b/src/zc/buildout/buildout.py       2017-08-18 10:08:49.115613364 +0300
+@@ -382,6 +382,10 @@
+                  if k not in versions
+                  ))
+ 
++        # Override versions with available (nix) system packages
++        for dist in pkg_resources.working_set:
++             versions[dist.project_name] = SectionKey(dist.version, dist.location)
++
+         # Absolutize some particular directory, handling also the ~/foo form,
+         # and considering the location of the configuration file that generated
+         # the setting as the base path, falling back to the main configuration
+--- a/src/zc/buildout/easy_install.py   2017-08-18 10:06:24.948428980 +0300
++++ b/src/zc/buildout/easy_install.py   2017-08-18 10:07:37.462521740 +0300
+@@ -321,6 +321,12 @@
+ 
+     def _satisfied(self, req, source=None):
+         dists = [dist for dist in self._env[req.project_name] if dist in req]
++        try:
++            dists = ([dist for dist in dists
++                     if dist.precedence == pkg_resources.DEVELOP_DIST]
++                     + [pkg_resources.get_distribution(req.project_name)])
++        except pkg_resources.DistributionNotFound:
++            pass
+         if not dists:
+             logger.debug('We have no distributions for %s that satisfies %r.',
+                          req.project_name, str(req))
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..0751b284a786
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/buildout/default.nix
@@ -0,0 +1,18 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "zc.buildout";
+  version = "2.13.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1dyc5g3yv7wm3hf3fcsh6y1wivzjj1bspafr5qqb653z9a31lsfn";
+  };
+
+  meta = with lib; {
+    homepage = "http://www.buildout.org";
+    description = "A software build and configuration system";
+    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..05f082c747bd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bumps/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, six}:
+
+buildPythonPackage rec {
+  pname = "bumps";
+  version = "0.8.0";
+
+  propagatedBuildInputs = [six];
+
+  # Bumps does not provide its own tests.py, so the test
+  # always fails
+  doCheck = false;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "9f92c05effd8175763799d19ca55592e89b053318f611148a6725159aea41d67";
+  };
+
+  meta = with lib; {
+    homepage = "https://www.reflectometry.org/danse/software.html";
+    description = "Data fitting with bayesian uncertainty analysis";
+    maintainers = with maintainers; [ rprospero ];
+    license = licenses.publicDomain;
+  };
+}
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..ce77085e4f7f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bunch/default.nix
@@ -0,0 +1,17 @@
+{ lib, stdenv, 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..c736eb577d44
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bwapy/default.nix
@@ -0,0 +1,42 @@
+{ lib, stdenv
+, 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..57ace67d3f26
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bx-python/default.nix
@@ -0,0 +1,39 @@
+{ lib, fetchFromGitHub, buildPythonPackage, isPy27, numpy, cython, zlib, six
+, python-lzo, nose }:
+
+buildPythonPackage rec {
+  pname = "bx-python";
+  version = "0.8.9";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "bxlab";
+    repo = "bx-python";
+    rev = "v${version}";
+    sha256 = "0bsqnw8rv08586wksvx2a8dawvhyzvz5pzsh9y3217b6wxq98dnq";
+  };
+
+  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..24ff14f62552
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bytecode/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, aenum
+}:
+
+buildPythonPackage rec {
+  pname = "bytecode";
+  version = "0.11.0";
+
+  src = fetchFromGitHub {
+    owner = "vstinner";
+    repo = pname;
+    rev = version;
+    sha256 = "097k83zr0z71pha7bafzhs4ink174wk9ls2883bic274rihsnc5r";
+  };
+
+  disabled = pythonOlder "3.5";
+
+  propagatedBuildInputs = lib.optionals (pythonOlder "3.6") [ aenum ];
+
+  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..53b13ddb5685
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cachecontrol/default.nix
@@ -0,0 +1,34 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, requests
+, msgpack
+, pytest
+}:
+
+buildPythonPackage rec {
+  version = "0.12.6";
+  pname = "CacheControl";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "be9aa45477a134aee56c8fac518627e1154df063e85f67d4f83ce0ccc23688e8";
+  };
+
+  checkInputs = [ pytest ];
+  propagatedBuildInputs = [ requests msgpack ];
+
+  # tests not included with pypi release
+  doCheck = false;
+
+  checkPhase = ''
+    pytest tests
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/ionrock/cachecontrol";
+    description = "Httplib2 caching for requests";
+    license = licenses.asl20;
+    maintainers = [ 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..d25e2e963dc3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cached-property/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytest
+, freezegun
+}:
+
+buildPythonPackage rec {
+  pname = "cached-property";
+  version = "1.5.1";
+
+  # conftest.py is missing in PyPI tarball
+  src = fetchFromGitHub {
+    owner = "pydanny";
+    repo = pname;
+    rev = version;
+    sha256 = "0xh0pwmiikx0il9nnfyf034ydmlw6992s0d209agd9j5d3s2k5q6";
+  };
+
+  checkInputs = [ pytest freezegun ];
+
+  # https://github.com/pydanny/cached-property/issues/131
+  checkPhase = ''
+    py.test -k "not 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..503b546116ef
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cachelib/default.nix
@@ -0,0 +1,18 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "cachelib";
+  version = "0.1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "47e95a67d68c729cbad63285a790a06f0e0d27d71624c6e44c1ec3456bb4476f";
+  };
+
+  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..6fd3f637875d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cachetools/default.nix
@@ -0,0 +1,17 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, isPy27 }:
+
+buildPythonPackage rec {
+  pname = "cachetools";
+  version = "4.1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "bbaa39c3dede00175df2dc2b03d0cf18dd2d32a7de7beb68072d13043c9edb20";
+  };
+
+  meta = with lib; {
+    description = "Extensible memoizing collections and decorators";
+    homepage = "https://github.com/tkem/cachetools";
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cachy/default.nix b/nixpkgs/pkgs/development/python-modules/cachy/default.nix
new file mode 100644
index 000000000000..278dd5a8ae60
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cachy/default.nix
@@ -0,0 +1,33 @@
+{ lib, buildPythonPackage, fetchPypi
+, redis
+, memcached
+, msgpack
+}:
+
+buildPythonPackage rec {
+  pname = "cachy";
+  version = "0.3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "186581f4ceb42a0bbe040c407da73c14092379b1e4c0e327fdb72ae4a9b269b1";
+  };
+
+  propagatedBuildInputs = [
+    redis
+    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..72334390bc3e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cadquery/default.nix
@@ -0,0 +1,103 @@
+{ lib
+, buildPythonPackage
+, isPy3k
+, pythonOlder
+, pythonAtLeast
+, fetchFromGitHub
+, pyparsing
+, opencascade
+, stdenv
+, python
+, cmake
+, swig
+, smesh
+, freetype
+, libGL
+, libGLU
+, libX11
+, six
+, pytest
+, makeFontsConf
+, freefont_ttf
+, Cocoa
+}:
+
+let
+  pythonocc-core-cadquery = 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/0_9.nix b/nixpkgs/pkgs/development/python-modules/cairocffi/0_9.nix
new file mode 100644
index 000000000000..bd7bde42901e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cairocffi/0_9.nix
@@ -0,0 +1,26 @@
+# FIXME: make gdk-pixbuf dependency optional
+{ stdenv
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, lib
+, substituteAll
+, makeFontsConf
+, freefont_ttf
+, pytest
+, pytestrunner
+, glibcLocales
+, cairo
+, cffi
+, withXcffib ? false, xcffib
+, python
+, glib
+, gdk-pixbuf
+}@args:
+
+import ./generic.nix ({
+  version = "0.9.0";
+  sha256 = "15386c3a9e08823d6826c4491eaccc7b7254b1dc587a3b9ce60c350c3f990337";
+  dlopen_patch = ./dlopen-paths-0.9.patch;
+  inherit withXcffib;
+} // args)
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..574aeefa7fca
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cairocffi/default.nix
@@ -0,0 +1,27 @@
+# FIXME: make gdk-pixbuf dependency optional
+{ stdenv
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, lib
+, substituteAll
+, makeFontsConf
+, freefont_ttf
+, pytest
+, pytestrunner
+, glibcLocales
+, cairo
+, cffi
+, withXcffib ? false, xcffib
+, python
+, glib
+, gdk-pixbuf
+}@args:
+
+import ./generic.nix ({
+  version = "1.1.0";
+  sha256 = "1nq53f5jipgy9jgyfxp43j40qfbmrhgn1cj8bp5rrb3liy3wbh7i";
+  dlopen_patch = ./dlopen-paths.patch;
+  disabled = pythonOlder "3.5";
+  inherit withXcffib;
+} // args)
diff --git a/nixpkgs/pkgs/development/python-modules/cairocffi/dlopen-paths-0.9.patch b/nixpkgs/pkgs/development/python-modules/cairocffi/dlopen-paths-0.9.patch
new file mode 100644
index 000000000000..307cb428c078
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cairocffi/dlopen-paths-0.9.patch
@@ -0,0 +1,47 @@
+commit 705dc9a55bd160625d9996e63fc7dc532d0ad0ab
+Author: Alexander V. Nikolaev <avn@avnik.info>
+Date:   Sat Feb 6 08:09:06 2016 +0200
+
+    Patch dlopen() to allow direct paths to all required libs
+
+    This patch is NixOS specific
+
+diff --git a/cairocffi/__init__.py b/cairocffi/__init__.py
+index 718aa7f..1a1dcff 100644
+--- a/cairocffi/__init__.py
++++ b/cairocffi/__init__.py
+@@ -27,20 +27,22 @@ VERSION = '0.7.2'
+ version = '1.10.0'
+ version_info = (1, 10, 0)
+
++# 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, *names):
++def dlopen(ffi, name, *names):
+     """Try various names for the same library, for different platforms."""
+-    for name in names:
+-        for lib_name in [name, 'lib' + name]:
+-            try:
+-                path = ctypes.util.find_library(lib_name)
+-                if path:
+-                    lib = ffi.dlopen(path)
+-                    if lib:
+-                        return lib
+-            except OSError:
+-                pass
+-    raise OSError("dlopen() failed to load a library: %s" % ' / '.join(names))
++    path = _LIBS.get(name, None)
++    if path:
++        lib = ffi.dlopen(path)
++        if lib:
++            return lib
++    raise OSError("dlopen() failed to load a library: %s as %s" % (name, path))
+
+
+ cairo = dlopen(ffi, 'cairo', 'cairo-2')
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/cairocffi/generic.nix b/nixpkgs/pkgs/development/python-modules/cairocffi/generic.nix
new file mode 100644
index 000000000000..ee795d80dcef
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cairocffi/generic.nix
@@ -0,0 +1,51 @@
+{ version
+, sha256
+, dlopen_patch
+, disabled ? false
+, ...
+}@args:
+
+with args;
+
+buildPythonPackage rec {
+  pname = "cairocffi";
+  inherit version disabled;
+
+  src = fetchPypi {
+    inherit pname version sha256;
+  };
+
+  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 ];
+  };
+
+  checkInputs = [ pytest pytestrunner glibcLocales ];
+  propagatedBuildInputs = [ cairo cffi ] ++ lib.optional withXcffib xcffib;
+
+  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_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; [];
+    description = "cffi-based cairo bindings for Python";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cairosvg/1_x.nix b/nixpkgs/pkgs/development/python-modules/cairosvg/1_x.nix
new file mode 100644
index 000000000000..bb5629cf4e51
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cairosvg/1_x.nix
@@ -0,0 +1,37 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub, cairocffi, nose, fontconfig
+, cssselect2, defusedxml, pillow, tinycss2 }:
+
+# CairoSVG 2.x dropped support for Python 2 so offer CairoSVG 1.x as an
+# alternative
+buildPythonPackage rec {
+  pname = "CairoSVG";
+  version = "1.0.22";
+
+  # PyPI doesn't include tests so use GitHub
+  src = fetchFromGitHub {
+    owner = "Kozea";
+    repo = pname;
+    rev = version;
+    sha256 = "15z0cag5s79ghhrlgs5xc9ayvzzdr3v8151vf6k819f1drsfjfxl";
+  };
+
+  propagatedBuildInputs = [ cairocffi ];
+
+  checkInputs = [ nose fontconfig cssselect2 defusedxml pillow tinycss2 ];
+
+  # Almost all tests just fail. Not sure how to fix them.
+  doCheck = false;
+
+  # checkInputs = [ nose fontconfig cssselect2 defusedxml pillow tinycss2 ];
+
+  # checkPhase = ''
+  #   FONTCONFIG_FILE=${fontconfig.out}/etc/fonts/fonts.conf nosetests .
+  # '';
+
+  meta = with lib; {
+    homepage = "https://cairosvg.org";
+    license = licenses.lgpl3;
+    description = "SVG converter based on Cairo";
+    maintainers = with maintainers; [ jluttine ];
+  };
+}
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..9d1c54651c20
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cairosvg/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, isPy3k, fetchpatch
+, cairocffi, cssselect2, defusedxml, pillow, tinycss2
+, pytest, pytestrunner, pytestcov, pytest-flake8, pytest-isort }:
+
+buildPythonPackage rec {
+  pname = "CairoSVG";
+  version = "2.5.0";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "3fc50d10f0cbef53b3ee376a97a88d81bbd9e2f190f7e63de08431a1a08e9afa";
+  };
+
+  propagatedBuildInputs = [ cairocffi cssselect2 defusedxml pillow tinycss2 ];
+
+  checkInputs = [ pytest pytestrunner pytestcov pytest-flake8 pytest-isort ];
+
+  meta = with lib; {
+    homepage = "https://cairosvg.org";
+    license = licenses.lgpl3;
+    description = "SVG converter based on Cairo";
+  };
+}
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..3888bb7ec65a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/caldav/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, icalendar
+, lxml
+, mock
+, nose
+, pytz
+, requests
+, six
+, tzlocal
+, vobject
+}:
+
+buildPythonPackage rec {
+  pname = "caldav";
+  version = "0.7.1";
+
+  src = fetchFromGitHub {
+    owner = "python-caldav";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1shfj67kq6qzd0ngyfk09hpzfggybcfxv5s7hqs87nq9l51bssv8";
+  };
+
+  nativeBuildInputs = lib.optionals (pythonOlder "3.5") [ mock ];
+  propagatedBuildInputs = [ six requests vobject lxml ]
+    ++ lib.optionals (pythonOlder "3.6") [ pytz tzlocal ];
+
+  checkInputs = [
+    icalendar
+    nose
+    tzlocal
+  ];
+
+  # xandikos and radicale is only a optional test dependency, not available for python3
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace ", 'xandikos'" "" \
+      --replace ", 'radicale'" ""
+  '';
+
+  pythonImportsCheck = [ "caldav" ];
+
+  meta = with lib; {
+    description = "This project is a CalDAV (RFC4791) client library for Python.";
+    homepage = "https://pythonhosted.org/caldav/";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ marenz ];
+    #broken = true; # requires radicale which is not packaged yet
+  };
+}
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..ea49c9b4a777
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/can/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, isPy27
+, aenum
+, wrapt
+, typing
+, pyserial
+, nose
+, mock
+, hypothesis
+, future
+, pytest
+, pytest-timeout }:
+
+buildPythonPackage rec {
+  pname = "python-can";
+  version = "3.3.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "2d3c223b7adc4dd46ce258d4a33b7e0dbb6c339e002faa40ee4a69d5fdce9449";
+  };
+
+  propagatedBuildInputs = [ wrapt pyserial aenum ] ++ lib.optional (pythonOlder "3.5") typing;
+  checkInputs = [ nose mock pytest hypothesis future ];
+
+  # Add the scripts to PATH
+  checkPhase = ''
+    PATH=$out/bin:$PATH pytest -c /dev/null
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/hardbyte/python-can";
+    description = "CAN support for Python";
+    license = licenses.lgpl3;
+    maintainers = with maintainers; [ 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..6e487b58cff7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/canmatrix/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, attrs
+, bitstruct
+, click
+, future
+, pathlib2
+, typing
+, lxml
+, xlwt
+, xlrd
+, XlsxWriter
+, pyyaml
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "canmatrix";
+  version = "0.9.1";
+
+  # uses fetchFromGitHub as PyPi release misses test/ dir
+  src = fetchFromGitHub {
+    owner = "ebroecker";
+    repo = pname;
+    rev = version;
+    sha256 = "129lcchq45h8wqjvvn0rwpbmih4m0igass2cx7a21z94li97hcia";
+  };
+
+  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 = [
+    pytest
+  ];
+
+  # long_envvar_name_imports requires stable key value pair ordering
+  checkPhase = ''
+    pytest -s src/canmatrix -k 'not long_envvar_name_imports'
+  '';
+
+  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..96af6f4bf78f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/canonicaljson/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi
+, frozendict, simplejson, six, isPy27
+}:
+
+buildPythonPackage rec {
+  pname = "canonicaljson";
+  version = "1.4.0";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "899b7604f5a6a8a92109115d9250142cdf0b1dfdcb62cdb21d8fb5bf37780631";
+  };
+
+  propagatedBuildInputs = [
+    frozendict simplejson six
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/matrix-org/python-canonicaljson";
+    description = "Encodes objects and arrays as RFC 7159 JSON.";
+    license = licenses.asl20;
+  };
+}
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..e6f09645379c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/canopen/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, nose
+, can
+, canmatrix }:
+
+buildPythonPackage rec {
+  pname = "canopen";
+  version = "1.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "15d49f1f71e9989dde6e3b75fb8445c76bd223064dfc0ac629fe9ecb0e21fba9";
+  };
+
+  propagatedBuildInputs =
+    [ can
+      canmatrix
+    ];
+
+  checkInputs = [ nose ];
+
+  meta = with lib; {
+    homepage = "https://github.com/christiansandberg/canopen/";
+    description = "CANopen stack implementation";
+    license = licenses.lgpl3;
+    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..d7df0bee5ca9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/capstone/default.nix
@@ -0,0 +1,35 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, setuptools
+, capstone
+}:
+
+buildPythonPackage rec {
+  pname = "capstone";
+  version = lib.getVersion capstone;
+
+  src = capstone.src;
+  sourceRoot = "${capstone.name}/bindings/python";
+
+  postPatch = ''
+    ln -s ${capstone}/lib/libcapstone${stdenv.targetPlatform.extensions.sharedLibrary} prebuilt/
+    ln -s ${capstone}/lib/libcapstone.a prebuilt/
+  '';
+
+  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..821561c05554
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/capturer/default.nix
@@ -0,0 +1,27 @@
+{ lib, buildPythonPackage, fetchFromGitHub, humanfriendly, pytest, pytestcov }:
+
+buildPythonPackage rec {
+  pname = "capturer";
+  version = "3.0";
+
+  src = fetchFromGitHub {
+    owner = "xolox";
+    repo = "python-capturer";
+    rev = version;
+    sha256 = "0fwrxa049gzin5dck7fvwhdp1856jrn0d7mcjcjsd7ndqvhgvjj1";
+  };
+
+  propagatedBuildInputs = [ humanfriendly ];
+
+  checkPhase = ''
+    PATH=$PATH:$out/bin pytest .
+  '';
+  checkInputs = [ pytest ];
+
+  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..e0a31829b05f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/carbon/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, isPy3k
+, twisted, whisper, txamqp, cachetools, urllib3
+}:
+
+buildPythonPackage rec {
+  pname = "carbon";
+  version = "1.1.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "08ndphpcbdx2ab4f5jsn2y4l5p55h9wscbg7clhbyyh03r5hianr";
+  };
+
+  # 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/carrot/default.nix b/nixpkgs/pkgs/development/python-modules/carrot/default.nix
new file mode 100644
index 000000000000..c2262decd314
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/carrot/default.nix
@@ -0,0 +1,22 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi
+, nose, amqplib, anyjson }:
+
+buildPythonPackage rec {
+  pname = "carrot";
+  version = "0.10.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0s14rs2fgp1s2qa0avn8gj33lwc3k1hd4y9a2h6mhg487i7kfinb";
+  };
+
+  buildInputs = [ nose ];
+  propagatedBuildInputs = [ amqplib anyjson ];
+
+  doCheck = false; # depends on the network
+
+  meta = with lib; {
+    homepage = "https://pypi.python.org/pypi/carrot";
+    description = "AMQP Messaging Framework for Python";
+  };
+}
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..f41aa6985da9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cartopy/default.nix
@@ -0,0 +1,59 @@
+{ buildPythonPackage, lib, fetchPypi
+, pytest_4, filelock, mock, pep8
+, cython, isPy27
+, six, pyshp, shapely, geos, numpy
+, gdal, pillow, matplotlib, pyepsg, pykdtree, scipy, owslib, fiona
+, xvfb_run
+, proj_5 # see https://github.com/SciTools/cartopy/pull/1252 for status on proj 6 support
+}:
+
+buildPythonPackage rec {
+  pname = "cartopy";
+  version = "0.18.0";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "Cartopy";
+    sha256 = "0d24fk0cbp29gmkysrwq05vry13swmwi3vx3cpcy04c0ixz33ykz";
+  };
+
+  checkInputs = [ filelock mock pytest_4 pep8 ];
+
+  # several tests require network connectivity: we disable them.
+  # also py2.7's tk is over-eager in trying to open an x display,
+  # so give it xvfb
+  checkPhase = let
+    maybeXvfbRun = lib.optionalString isPy27 "${xvfb_run}/bin/xvfb-run";
+  in ''
+    export HOME=$(mktemp -d)
+    ${maybeXvfbRun} pytest --pyargs cartopy \
+      -m "not network and not natural_earth" \
+      -k "not test_nightshade_image and not background_img"
+  '';
+
+  nativeBuildInputs = [
+    cython
+    geos # for geos-config
+    proj_5
+  ];
+
+  buildInputs = [
+    geos proj_5
+  ];
+
+  propagatedBuildInputs = [
+    # required
+    six pyshp shapely numpy
+
+    # optional
+    gdal pillow matplotlib pyepsg pykdtree scipy fiona owslib
+  ];
+
+  meta = with lib; {
+    description = "Process geospatial data to create maps and perform analyses";
+    license = licenses.lgpl3;
+    homepage = "https://scitools.org.uk/cartopy/docs/latest/";
+    maintainers = with maintainers; [ mredaelli ];
+  };
+
+}
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..d1b795a9ef43
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/casbin/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, simpleeval
+, isPy27
+, coveralls
+}:
+
+buildPythonPackage rec {
+  pname = "casbin";
+  version = "0.16.0";
+
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = "pycasbin";
+    rev = "v${version}";
+    sha256 = "1983p8pkbdj6yaclkdng7fn0pmlbz1yc75a4a847ppw47075ryph";
+  };
+
+  propagatedBuildInputs = [
+    simpleeval
+  ];
+
+  checkInputs = [
+    coveralls
+  ];
+
+  checkPhase = ''
+    coverage run -m unittest discover -s tests -t tests
+  '';
+
+  meta = with lib; {
+    description = "An authorization library that supports access control models like ACL, RBAC, ABAC in Python";
+    homepage = "https://github.com/casbin/pycasbin";
+    license = licenses.asl20;
+    maintainers = [ 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..5d1a7696516a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/case/default.nix
@@ -0,0 +1,20 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi
+, six, nose, unittest2, mock }:
+
+buildPythonPackage rec {
+  pname = "case";
+  version = "1.5.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "48432b01d91913451c3512c5b90e31b0f348f1074b166a3431085eb70d784fb1";
+  };
+
+  propagatedBuildInputs = [ six nose unittest2 mock ];
+
+  meta = with lib; {
+    homepage = "https://github.com/celery/case";
+    description = "unittests utilities";
+    license = licenses.bsd3;
+  };
+}
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..32cf844cf00c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cassandra-driver/default.nix
@@ -0,0 +1,47 @@
+{ stdenv, lib, buildPythonPackage, fetchPypi, python, pythonOlder
+, cython
+, eventlet
+, futures
+, libev
+, mock
+, nose
+, pytest
+, pytz
+, pyyaml
+, scales
+, six
+, sure
+}:
+
+buildPythonPackage rec {
+  pname = "cassandra-driver";
+  version = "3.24.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "83ec8d9a5827ee44bb1c0601a63696a8a9086beaf0151c8255556299246081bd";
+  };
+
+  nativeBuildInputs = [ cython ];
+  buildInputs = [ libev ];
+  propagatedBuildInputs = [ six ]
+    ++ lib.optionals (pythonOlder "3.4") [ futures ];
+
+  checkInputs = [ eventlet mock nose pytest pytz pyyaml sure ];
+
+  # ignore test files which try to do socket.getprotocolname('tcp')
+  # as it fails in sandbox mode due to lack of a /etc/protocols file
+  checkPhase = ''
+    pytest tests/unit \
+      --ignore=tests/unit/io/test_libevreactor.py \
+      --ignore=tests/unit/io/test_eventletreactor.py \
+      --ignore=tests/unit/io/test_asyncorereactor.py
+  '';
+
+  meta = with lib; {
+    description = "A Python client driver for Apache Cassandra";
+    homepage = "http://datastax.github.io/python-driver";
+    license = licenses.asl20;
+    broken = true; # geomet doesn't exist
+  };
+}
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..85b1147c13a5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/casttube/default.nix
@@ -0,0 +1,23 @@
+{ lib, stdenv, 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..c4cd89cab68a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/catalogue/default.nix
@@ -0,0 +1,31 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, importlib-metadata
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "catalogue";
+  version = "2.0.1";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0d01077dbfca7aa53f3ef4adecccce636bce4f82e5b52237703ab2f56478e56e";
+  };
+
+  propagatedBuildInputs = [ importlib-metadata ];
+
+  checkInputs = [ pytestCheckHook ];
+
+  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; [ danieldk ];
+  };
+}
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..8c5184240f62
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/catboost/default.nix
@@ -0,0 +1,56 @@
+{ 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 ];
+  };
+}
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..a48e29b827b7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cattrs/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, attrs
+, buildPythonPackage
+, fetchFromGitHub
+, hypothesis
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "cattrs";
+  version = "1.1.2";
+
+  src = fetchFromGitHub {
+    owner = "Tinche";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "083d5mi6x7qcl26wlvwwn7gsp5chxlxkh4rp3a41w8cfwwr3h6l8";
+  };
+
+  propagatedBuildInputs = [ attrs ];
+
+  checkInputs = [
+    hypothesis
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "cattr" ];
+
+  meta = with lib; {
+    description = "Python custom class converters for attrs";
+    homepage = "https://github.com/Tinche/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..f081511265fd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cbor/default.nix
@@ -0,0 +1,22 @@
+{ lib, stdenv, 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..f793ecfae372
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cbor2/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pytest-cov
+, setuptools_scm
+}:
+
+buildPythonPackage rec {
+  pname = "cbor2";
+  version = "5.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a33aa2e5534fd74401ac95686886e655e3b2ce6383b3f958199b6e70a87c94bf";
+  };
+
+  nativeBuildInputs = [ setuptools_scm ];
+
+  checkInputs = [
+    pytest-cov
+    pytestCheckHook
+  ];
+
+  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..96e75405ee3c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cccolutils/default.nix
@@ -0,0 +1,23 @@
+{ lib, stdenv, 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..b93ea9c3bd78
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cchardet/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python
+, nose
+}:
+
+buildPythonPackage rec {
+  pname = "cchardet";
+  version = "2.1.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "c428b6336545053c2589f6caf24ea32276c6664cb86db817e03a94c60afa0eaf";
+  };
+
+  checkInputs = [ nose ];
+  checkPhase = ''
+    ${python.interpreter} setup.py nosetests
+  '';
+
+  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/cddb/default.nix b/nixpkgs/pkgs/development/python-modules/cddb/default.nix
new file mode 100644
index 000000000000..55d659376c61
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cddb/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv
+, buildPythonPackage
+, pkgs
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "CDDB";
+  version = "1.4";
+  disabled = isPy3k;
+
+  buildInputs = lib.optionals stdenv.isDarwin [ pkgs.darwin.apple_sdk.frameworks.IOKit ];
+
+  src = pkgs.fetchurl {
+    url = "http://cddb-py.sourceforge.net/${pname}-${version}.tar.gz";
+    sha256 = "098xhd575ibvdx7i3dny3lwi851yxhjg2hn5jbbgrwj833rg5l5w";
+  };
+
+  meta = with lib; {
+    homepage = "http://cddb-py.sourceforge.net/";
+    description = "CDDB and FreeDB audio CD track info access";
+    license = licenses.gpl2Plus;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cdecimal/default.nix b/nixpkgs/pkgs/development/python-modules/cdecimal/default.nix
new file mode 100644
index 000000000000..cf8890505904
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cdecimal/default.nix
@@ -0,0 +1,23 @@
+{ lib, buildPythonPackage, fetchurl, isPy3k }:
+
+buildPythonPackage rec {
+  pname = "cdecimal";
+  version = "2.3";
+
+  disabled = isPy3k;
+
+  src = fetchurl {
+    url="http://www.bytereef.org/software/mpdecimal/releases/${pname}-${version}.tar.gz";
+    sha256 = "d737cbe43ed1f6ad9874fb86c3db1e9bbe20c0c750868fde5be3f379ade83d8b";
+  };
+
+  # Upstream tests are not included s. a. http://www.bytereef.org/mpdecimal/testing.html
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Fast drop-in replacement for decimal.py";
+    homepage    = "http://www.bytereef.org/mpdecimal/";
+    license     = licenses.bsd2;
+    maintainers = [ maintainers.udono ];
+  };
+}
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..3ba06c92a5ce
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/celery/default.nix
@@ -0,0 +1,42 @@
+{ lib, buildPythonPackage, fetchPypi
+, billiard, click, click-didyoumean, click-repl, kombu, pytz, vine
+, boto3, case, moto, pytest, pytest-celery, pytest-subtests, pytest-timeout
+}:
+
+buildPythonPackage rec {
+  pname = "celery";
+  version = "5.0.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "012c814967fe89e3f5d2cf49df2dba3de5f29253a7f4f2270e8fce6b901b4ebf";
+  };
+
+  postPatch = ''
+    substituteInPlace requirements/test.txt \
+      --replace "moto==1.3.7" moto
+  '';
+
+  propagatedBuildInputs = [ billiard click click-didyoumean click-repl kombu pytz vine ];
+
+  checkInputs = [ boto3 case moto pytest pytest-celery pytest-subtests pytest-timeout ];
+
+  # ignore test that's incompatible with pytest5
+  # test_eventlet touches network
+  # test_mongodb requires pymongo
+  # test_multi tries to create directories under /var
+  checkPhase = ''
+    pytest -k 'not restore_current_app_fallback and not msgpack and not on_apply and not pytest' \
+      --ignore=t/unit/contrib/test_pytest.py \
+      --ignore=t/unit/concurrency/test_eventlet.py \
+      --ignore=t/unit/bin/test_multi.py \
+      --ignore=t/unit/apps/test_multi.py \
+      --ignore=t/unit/backends/test_mongodb.py
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/celery/celery/";
+    description = "Distributed task queue";
+    license = licenses.bsd3;
+  };
+}
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..9133389f0ce9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cement/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, isPy3k }:
+
+buildPythonPackage rec {
+  pname = "cement";
+  version = "3.0.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "10a8459dc9fc31d6c038ede24a9081c5c3bd5fcd75b071e01baf281f81c9eace";
+  };
+
+  # Disable test tests since they depend on a memcached server running on
+  # 127.0.0.1:11211.
+  doCheck = false;
+
+  disabled = !isPy3k;
+
+  meta = with lib; {
+    homepage = "https://builtoncement.com/";
+    description = "A CLI Application Framework for Python.";
+    maintainers = with maintainers; [ eqyiel ];
+    license = licenses.bsd3;
+  };
+}
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..561d9651fed8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/censys/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, backoff
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, requests
+, pytestcov
+, requests-mock
+, parameterized
+}:
+
+buildPythonPackage rec {
+  pname = "censys";
+  version = "1.1.0";
+
+  src = fetchFromGitHub {
+    owner = "censys";
+    repo = "censys-python";
+    rev = "v${version}";
+    sha256 = "0vvd13g48i4alnqil98zc09zi5kv6l2s3kdfyg5syjxvq4lfd476";
+  };
+
+  propagatedBuildInputs = [
+    backoff
+    requests
+  ];
+
+  checkInputs = [
+    pytestcov
+    pytestCheckHook
+    requests-mock
+    parameterized
+  ];
+
+  # The tests want to write a configuration file
+  preCheck = ''
+    export HOME=$(mktemp -d)
+    mkdir -p $HOME
+    '';
+  # All other tests require an API key
+  pytestFlagsArray = [ "tests/test_config.py" ];
+  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 = [ maintainers.fab ];
+  };
+}
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..08b7527c54c1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cerberus/default.nix
@@ -0,0 +1,23 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, pytestrunner, pytest }:
+
+buildPythonPackage rec {
+  pname = "Cerberus";
+  version = "1.3.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "12cm547hpypqd7bwcl4wr4w6varibc1dagzicg5qbp86yaa6cbih";
+  };
+
+  checkInputs = [ pytestrunner pytest ];
+
+  checkPhase = ''
+    pytest -k 'not nested_oneofs'
+  '';
+
+  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..eea43d5c7393
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cert-chain-resolver/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, pytestCheckHook
+, pytest-mock
+, cryptography
+}:
+
+buildPythonPackage rec {
+  pname = "cert-chain-resolver";
+  version = "1.0.1";
+
+  src = fetchFromGitHub {
+    owner = "rkoopmans";
+    repo = "python-certificate-chain-resolver";
+    rev = version;
+    sha256 = "1kmig4ksbx1wvgcjn4r9jjg2pn1ag5rq871bjwxkp9kslb3x3d1l";
+  };
+
+  propagatedBuildInputs = [ cryptography ];
+
+  checkInputs = [ pytestCheckHook pytest-mock ];
+
+  # online tests
+  disabledTests = [
+    "test_cert_returns_completed_chain"
+    "test_display_flag_is_properly_formatted"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/rkoopmans/python-certificate-chain-resolver";
+    description = "Resolve / obtain the certificate intermediates of a x509 certificate";
+    license = licenses.mit;
+    maintainers = with maintainers; [ veehaitch ];
+  };
+}
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..6c14f6c472f7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/certbot-dns-cloudflare/default.nix
@@ -0,0 +1,35 @@
+{ buildPythonPackage
+, acme
+, certbot
+, cloudflare
+, isPy3k
+, pytest
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  inherit (certbot) src version;
+
+  pname = "certbot-dns-cloudflare";
+
+  propagatedBuildInputs = [
+    acme
+    certbot
+    cloudflare
+  ];
+
+  checkInputs = [
+    pytest
+    pytestCheckHook
+  ];
+
+  disabled = !isPy3k;
+
+  pytestFlagsArray = [ "-o cache_dir=$(mktemp -d)" ];
+
+  sourceRoot = "source/${pname}";
+
+  meta = certbot.meta // {
+    description = "Cloudflare 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..19e53aa20cc9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/certbot-dns-rfc2136/default.nix
@@ -0,0 +1,35 @@
+{ buildPythonPackage
+, acme
+, certbot
+, dnspython
+, isPy3k
+, pytest
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  inherit (certbot) src version;
+
+  pname = "certbot-dns-rfc2136";
+
+  propagatedBuildInputs = [
+    acme
+    certbot
+    dnspython
+  ];
+
+  checkInputs = [
+    pytest
+    pytestCheckHook
+  ];
+
+  disabled = !isPy3k;
+
+  pytestFlagsArray = [ "-o cache_dir=$(mktemp -d)" ];
+
+  sourceRoot = "source/${pname}";
+
+  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..6fba51ce92a1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/certbot-dns-route53/default.nix
@@ -0,0 +1,35 @@
+{ buildPythonPackage
+, acme
+, boto3
+, certbot
+, isPy3k
+, pytest
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  inherit (certbot) src version;
+
+  pname = "certbot-dns-route53";
+
+  propagatedBuildInputs = [
+    acme
+    boto3
+    certbot
+  ];
+
+  checkInputs = [
+    pytest
+    pytestCheckHook
+  ];
+
+  disabled = !isPy3k;
+
+  pytestFlagsArray = [ "-o cache_dir=$(mktemp -d)" ];
+
+  sourceRoot = "source/${pname}";
+
+  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..cb842f1455f1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/certbot/default.nix
@@ -0,0 +1,75 @@
+{ lib
+, buildPythonPackage
+, python, runCommand
+, fetchFromGitHub
+, ConfigArgParse, acme, configobj, cryptography, distro, josepy, parsedatetime, pyRFC3339, pyopenssl, pytz, requests, six, zope_component, zope_interface
+, dialog, mock, gnureadline
+, pytest_xdist, pytest, pytestCheckHook, dateutil
+}:
+
+buildPythonPackage rec {
+  pname = "certbot";
+  version = "1.11.0";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-IGXiIOLP/Uq6HdXAschp1jFYq52ohRK4VLtkjF4Tb44=";
+  };
+
+  sourceRoot = "source/${pname}";
+
+  propagatedBuildInputs = [
+    ConfigArgParse
+    acme
+    configobj
+    cryptography
+    distro
+    josepy
+    parsedatetime
+    pyRFC3339
+    pyopenssl
+    pytz
+    requests
+    six
+    zope_component
+    zope_interface
+  ];
+
+  buildInputs = [ dialog mock gnureadline ];
+
+  checkInputs = [
+    dateutil
+    pytest
+    pytestCheckHook
+    pytest_xdist
+  ];
+
+  pytestFlagsArray = [ "-o cache_dir=$(mktemp -d)" ];
+
+  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..eac32816caca
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/certifi/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+}:
+
+buildPythonPackage rec {
+  pname = "certifi";
+  version = "2020.12.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "177mdbw0livdjvp17sz6wsfrc32838m9y59v871gpgv2888raj8s";
+  };
+
+  pythonImportsCheck = [ "certifi" ];
+
+  dontUseSetuptoolsCheck = true;
+
+  meta = {
+    homepage = "https://certifi.io/";
+    description = "Python package for providing Mozilla's CA Bundle";
+    license = lib.licenses.isc;
+    maintainers = with lib.maintainers; [ koral ];
+  };
+}
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..049e3ffdb5d9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/certipy/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv
+, 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/cffi/default.nix b/nixpkgs/pkgs/development/python-modules/cffi/default.nix
new file mode 100644
index 000000000000..3dcd6a996cb9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cffi/default.nix
@@ -0,0 +1,46 @@
+{ lib, stdenv, buildPythonPackage, isPyPy, fetchPypi, libffi, pycparser, pytest }:
+
+if isPyPy then null else buildPythonPackage rec {
+  pname = "cffi";
+  version = "1.14.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1a465cbe98a7fd391d47dce4b8f7e5b921e6cd805ef421d04f5f66ba8f06086c";
+  };
+
+  outputs = [ "out" "dev" ];
+
+  propagatedBuildInputs = [ libffi pycparser ];
+  checkInputs = [ pytest ];
+
+  # On Darwin, the cffi tests want to hit libm a lot, and look for it in a global
+  # impure search path. It's obnoxious how much repetition there is, and how difficult
+  # it is to get it to search somewhere else (since we do actually have a libm symlink in libSystem)
+  prePatch = lib.optionalString stdenv.isDarwin ''
+    substituteInPlace testing/cffi0/test_parsing.py \
+      --replace 'lib_m = "m"' 'lib_m = "System"' \
+      --replace '"libm" in name' '"libSystem" in name'
+    substituteInPlace testing/cffi0/test_unicode_literals.py --replace 'lib_m = "m"' 'lib_m = "System"'
+    substituteInPlace testing/cffi0/test_zdistutils.py --replace 'self.lib_m = "m"' 'self.lib_m = "System"'
+    substituteInPlace testing/cffi1/test_recompiler.py --replace 'lib_m = "m"' 'lib_m = "System"'
+    substituteInPlace testing/cffi0/test_function.py --replace "lib_m = 'm'" "lib_m = 'System'"
+    substituteInPlace testing/cffi0/test_verify.py --replace "lib_m = ['m']" "lib_m = ['System']"
+  '';
+
+  # 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";
+
+  doCheck = !stdenv.hostPlatform.isMusl && !stdenv.isDarwin; # TODO: Investigate
+  checkPhase = ''
+    py.test -k "not test_char_pointer_conversion"
+  '';
+
+  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/cfgv/default.nix b/nixpkgs/pkgs/development/python-modules/cfgv/default.nix
new file mode 100644
index 000000000000..ab9a97729a1d
--- /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.2.0";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "cf22deb93d4bcf92f345a5c3cd39d3d41d6340adc60c78bbbd6588c384fda6a1";
+  };
+
+  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..da04ecf68897
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cfn-flip/default.nix
@@ -0,0 +1,55 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, lib
+
+# pythonPackages
+, click
+, pytest
+, pytestcov
+, pytestrunner
+, pyyaml
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "cfn-flip";
+  version = "1.2.2";
+
+  src = fetchFromGitHub {
+    owner = "awslabs";
+    repo = "aws-cfn-template-flip";
+    rev = version;
+    sha256 = "05fk725a1i3zl3idik2hxl3w6k1ln0j33j3jdq1gvy1sfyc79ifm";
+  };
+
+  propagatedBuildInputs = [
+    click
+    pyyaml
+    six
+  ];
+
+  checkInputs = [
+    pytest
+    pytestcov
+    pytestrunner
+  ];
+
+  checkPhase = ''
+    py.test \
+      --cov=cfn_clean \
+      --cov=cfn_flip \
+      --cov=cfn_tools \
+      --cov-report term-missing \
+      --cov-report html
+  '';
+
+  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..f55042c58d23
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cfn-lint/default.nix
@@ -0,0 +1,94 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, aws-sam-translator
+, importlib-metadata
+, importlib-resources
+, jsonpatch
+, jsonschema
+, junit-xml
+, networkx
+, pathlib2
+, pyyaml
+, requests
+, setuptools
+, six
+, mock
+, pydot
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "cfn-lint";
+  version = "0.42.0";
+
+  src = fetchFromGitHub {
+    owner = "aws-cloudformation";
+    repo = "cfn-python-lint";
+    rev = "v${version}";
+    sha256 = "0cqpq7pxpslpd7am6mp6nmwhsb2p2a5lq3hjjxi8imv3wv7zql98";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace 'importlib_resources~=1.4;python_version<"3.7" and python_version!="3.4"' 'importlib_resources;python_version<"3.7"'
+  '';
+
+  propagatedBuildInputs = [
+    aws-sam-translator
+    jsonpatch
+    jsonschema
+    junit-xml
+    networkx
+    pathlib2
+    pyyaml
+    requests
+    setuptools
+    six
+  ] ++ lib.optionals (pythonOlder "3.8") [ importlib-metadata importlib-resources ];
+
+  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"
+  ];
+
+  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/cftime/default.nix b/nixpkgs/pkgs/development/python-modules/cftime/default.nix
new file mode 100644
index 000000000000..78dcecfb6a93
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cftime/default.nix
@@ -0,0 +1,42 @@
+{ buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, coveralls
+, pytestcov
+, cython
+, numpy
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "cftime";
+  version = "1.3.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "77fd86e69b234d41fa8634d627e9e9ee0501c2a8a95268c2b524d38e0a33f090";
+  };
+
+  checkInputs = [
+    pytestCheckHook
+    coveralls
+    pytestcov
+  ];
+
+  nativeBuildInputs = [
+    cython
+    numpy
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+  ];
+
+  # ERROR test/test_cftime.py - ModuleNotFoundError: No module named 'cftime._cft...
+  doCheck = false;
+
+  meta = {
+    description = "Time-handling functionality from netcdf4-python";
+  };
+
+}
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..2000a4e0a3bc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cgroup-utils/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv, 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/chai/default.nix b/nixpkgs/pkgs/development/python-modules/chai/default.nix
new file mode 100644
index 000000000000..3400b33635a8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/chai/default.nix
@@ -0,0 +1,15 @@
+{ lib, stdenv, 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..0c3b7a946fcd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/chainer/default.nix
@@ -0,0 +1,47 @@
+{ lib, buildPythonPackage, fetchFromGitHub, isPy3k
+, filelock, protobuf, numpy, pytest, mock, typing-extensions
+, cupy, cudaSupport ? false
+}:
+
+buildPythonPackage rec {
+  pname = "chainer";
+  version = "6.5.0";
+  disabled = !isPy3k; # python2.7 abandoned upstream
+
+  # no tests in Pypi tarball
+  src = fetchFromGitHub {
+    owner = "chainer";
+    repo = "chainer";
+    rev = "v${version}";
+    sha256 = "0ha9fbl6sa3fbnsz3y1pg335iiskdbxw838m5j06zgzy156zna1x";
+  };
+
+  # remove on 7.0 or 6.6 release
+  postPatch = ''
+    sed -i '/typing/d' setup.py
+  '';
+
+  checkInputs = [
+    pytest
+    mock
+  ];
+
+  propagatedBuildInputs = [
+    filelock
+    protobuf
+    numpy
+    typing-extensions
+  ] ++ lib.optionals cudaSupport [ cupy ];
+
+  # avoid gpu tests
+  checkPhase = ''
+    pytest tests/chainer_tests/utils_tests -k 'not gpu and not cupy'
+  '';
+
+  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..3858fc44f234
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/chainmap/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv, 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..5445157b8530
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/chalice/default.nix
@@ -0,0 +1,69 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, attrs
+, botocore
+, click
+, enum-compat
+, hypothesis
+, jmespath
+, mock
+, mypy-extensions
+, pip
+, pytest
+, pyyaml
+, setuptools
+, six
+, typing
+, watchdog
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "chalice";
+  version = "1.21.9";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "312f88838c8ea4b4ac79dce0e5b4ba3125130ca66ea99a4694f535501dca95e3";
+  };
+
+  checkInputs = [ watchdog pytest hypothesis mock ];
+  propagatedBuildInputs = [
+    attrs
+    botocore
+    click
+    enum-compat
+    jmespath
+    mypy-extensions
+    pip
+    pyyaml
+    setuptools
+    six
+    wheel
+  ] ++ lib.optionals (pythonOlder "3.5") [
+    typing
+  ];
+
+  # conftest.py not included with pypi release
+  doCheck = false;
+
+  postPatch = ''
+    sed -i setup.py -e "/pip>=/c\'pip',"
+    substituteInPlace setup.py \
+      --replace 'typing==3.6.4' 'typing' \
+      --replace 'attrs>=19.3.0,<20.3.0' 'attrs'
+  '';
+
+  checkPhase = ''
+    pytest tests
+  '';
+
+  meta = with lib; {
+    description = "Python Serverless Microframework for AWS";
+    homepage = "https://github.com/aws/chalice";
+    license = licenses.asl20;
+    maintainers = [ 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..a2ffcb9a0236
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/chameleon/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv
+, 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..3f341f5527ae
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/channels-redis/default.nix
@@ -0,0 +1,46 @@
+{ lib, stdenv
+, aioredis
+, asgiref
+, buildPythonPackage
+, channels
+, fetchPypi
+, hiredis
+, msgpack
+, pythonOlder
+, redis
+}:
+
+buildPythonPackage rec {
+  pname = "channels-redis";
+  version = "3.2.0";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "channels_redis";
+    sha256 = "1rjs9irnq59yr6zwc9k6nnw6xrmr48dakrm25m0gcwskn1iimcrg";
+  };
+
+  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..c2836ef4faa0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/channels/default.nix
@@ -0,0 +1,23 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi,
+  asgiref, django, daphne
+}:
+buildPythonPackage rec {
+  pname = "channels";
+  version = "3.0.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "056b72e51080a517a0f33a0a30003e03833b551d75394d6636c885d4edb8188f";
+  };
+
+  # Files are missing in the distribution
+  doCheck = false;
+
+  propagatedBuildInputs = [ asgiref django daphne ];
+
+  meta = with lib; {
+    description = "Brings event-driven capabilities to Django with a channel system";
+    license = licenses.bsd3;
+    homepage = "https://github.com/django/channels";
+  };
+}
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..bbc41df0cd82
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/chardet/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, fetchpatch
+, pytest, pytestrunner, hypothesis }:
+
+buildPythonPackage rec {
+  pname = "chardet";
+  version = "3.0.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1bpalpia6r5x1kknbk11p1fzph56fmmnp405ds8icksd3knr5aw4";
+  };
+
+  patches = [
+    # Add pytest 4 support. See: https://github.com/chardet/chardet/pull/174
+    (fetchpatch {
+      url = "https://github.com/chardet/chardet/commit/0561ddcedcd12ea1f98b7ddedb93686ed8a5ffa4.patch";
+      sha256 = "1y1xhjf32rdhq9sfz58pghwv794f3w2f2qcn8p6hp4pc8jsdrn2q";
+    })
+  ];
+
+  checkInputs = [ pytest pytestrunner hypothesis ];
+
+  meta = with lib; {
+    homepage = "https://github.com/chardet/chardet";
+    description = "Universal encoding detector";
+    license = licenses.lgpl2;
+    maintainers = with maintainers; [ domenkozar ];
+  };
+}
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..6679f13b1196
--- /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 = "1.1.0";
+
+  # chart-studio was split from plotly
+  src = fetchFromGitHub {
+    owner = "plotly";
+    repo = "plotly.py";
+    rev = "${pname}-v${version}";
+    sha256 = "1q3j3ih5k0jhr8ilwffkfxp1nifpnjnx7862bzhxfg4d386hfg4i";
+  };
+
+  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..8a2c74882066
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/check-manifest/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, pep517, toml, mock, breezy, git, build }:
+
+buildPythonPackage rec {
+  pname = "check-manifest";
+  version = "0.46";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "5895e42a012989bdc51854a02c82c8d6898112a4ab11f2d7878200520b49d428";
+  };
+
+  # Test requires filesystem access
+  postPatch = ''
+    substituteInPlace tests.py --replace "test_build_sdist" "no_test_build_sdist"
+  '';
+
+  propagatedBuildInputs = [ build pep517 toml ];
+
+  checkInputs = [ mock breezy git ];
+
+  meta = with lib; {
+    homepage = "https://github.com/mgedmin/check-manifest";
+    description = "Check MANIFEST.in in a Python source package for completeness";
+    license = licenses.mit;
+    maintainers = with maintainers; [ lewo ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cheetah/default.nix b/nixpkgs/pkgs/development/python-modules/cheetah/default.nix
new file mode 100644
index 000000000000..1cee46fa7252
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cheetah/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, markdown
+, isPy3k
+, TurboCheetah
+}:
+
+buildPythonPackage rec {
+  pname = "cheetah";
+  version = "2.4.4";
+
+  disabled = isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "be308229f0c1e5e5af4f27d7ee06d90bb19e6af3059794e5fd536a6f29a9b550";
+  };
+
+  propagatedBuildInputs = [ markdown ];
+
+  doCheck = false; # Circular dependency
+
+  checkInputs = [
+    TurboCheetah
+  ];
+
+  meta = {
+    homepage = "http://www.cheetahtemplate.org/";
+    description = "A template engine and code generation tool";
+    license = lib.licenses.mit;
+  };
+}
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..a705bffa810a
--- /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";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f1c2b693cdcac2ded2823d363f8459ae785261e61c128d68464c8781dba0466b";
+  };
+
+  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..c9d3094d5951
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cheroot/default.nix
@@ -0,0 +1,83 @@
+{ lib, stdenv, fetchPypi, buildPythonPackage, isPy3k
+, jaraco_functools
+, jaraco_text
+, more-itertools
+, portend
+, pyopenssl
+, pytestCheckHook
+, pytestcov
+, pytest-mock
+, requests
+, requests-toolbelt
+, requests-unixsocket
+, setuptools_scm
+, setuptools-scm-git-archive
+, six
+, trustme
+}:
+
+buildPythonPackage rec {
+  pname = "cheroot";
+  version = "8.4.8";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0r98qqdp9ww5r5ma6wf1n66r9813rrmfvc54z7yij39jkj5c528h";
+  };
+
+  nativeBuildInputs = [ setuptools_scm setuptools-scm-git-archive ];
+
+  propagatedBuildInputs = [
+    # install_requires
+    jaraco_functools
+
+    more-itertools six
+  ];
+
+  checkInputs = [
+    jaraco_text
+    portend
+    pyopenssl
+    pytestCheckHook
+    pytestcov
+    pytest-mock
+    requests
+    requests-toolbelt
+    requests-unixsocket
+    trustme
+  ];
+
+  # avoid attempting to use 3 packages not available on nixpkgs
+  # (jaraco.apt, jaraco.context, yg.lockfile)
+  pytestFlagsArray = [ "--ignore=cheroot/test/test_wsgi.py" ];
+
+  # 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"
+  ];
+
+  # 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;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cherrypy/17.nix b/nixpkgs/pkgs/development/python-modules/cherrypy/17.nix
new file mode 100644
index 000000000000..2ee8eb3bd0ca
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cherrypy/17.nix
@@ -0,0 +1,36 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi
+, setuptools_scm
+, cheroot, contextlib2, portend, routes, six, zc_lockfile
+, backports_unittest-mock, objgraph, pathpy, pytest, pytestcov, backports_functools_lru_cache, requests_toolbelt
+}:
+
+buildPythonPackage rec {
+  pname = "cherrypy";
+  version = "17.4.2";
+
+  src = fetchPypi {
+    pname = "CherryPy";
+    inherit version;
+    sha256 = "ef1619ad161f526745d4f0e4e517753d9d985814f1280e330661333d2ba05cdf";
+  };
+
+  propagatedBuildInputs = [
+    cheroot contextlib2 portend routes six zc_lockfile
+  ];
+
+  nativeBuildInputs = [ setuptools_scm ];
+
+  checkInputs = [
+    backports_unittest-mock objgraph pathpy pytest pytestcov backports_functools_lru_cache requests_toolbelt
+  ];
+
+  checkPhase = ''
+    pytest ${lib.optionalString stdenv.isDarwin "--ignore=cherrypy/test/test_wsgi_unix_socket.py"}
+  '';
+
+  meta = with lib; {
+    homepage = "https://www.cherrypy.org";
+    description = "A pythonic, object-oriented HTTP framework";
+    license = licenses.bsd3;
+  };
+}
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..8a915d520e5c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cherrypy/default.nix
@@ -0,0 +1,55 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, isPy3k
+, setuptools_scm
+, cheroot, portend, more-itertools, zc_lockfile, routes
+, jaraco_collections
+, objgraph, pytest, pytestcov, pathpy, requests_toolbelt, pytest-services
+, fetchpatch
+}:
+
+buildPythonPackage rec {
+  pname = "cherrypy";
+  version = "18.6.0";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    pname = "CherryPy";
+    inherit version;
+    sha256 = "16f410izp2c4qhn4n3l5l3qirmkf43h2amjqms8hkl0shgfqwq2n";
+  };
+
+  propagatedBuildInputs = [
+    # required
+    cheroot portend more-itertools zc_lockfile
+    jaraco_collections
+    # optional
+    routes
+  ];
+
+  nativeBuildInputs = [ setuptools_scm ];
+
+  checkInputs = [
+    objgraph pytest pytestcov pathpy requests_toolbelt pytest-services
+  ];
+
+  # Keyboard interrupt ends test suite run
+  # daemonize and autoreload tests have issue with sockets within sandbox
+  # Disable doctest plugin because times out
+  checkPhase = ''
+    substituteInPlace pytest.ini --replace "--doctest-modules" ""
+    pytest \
+      -k 'not KeyboardInterrupt and not daemonize and not Autoreload' \
+      --deselect=cherrypy/test/test_static.py::StaticTest::test_null_bytes \
+      --deselect=cherrypy/test/test_tools.py::ToolTests::testCombinedTools \
+      ${lib.optionalString stdenv.isDarwin
+        "--deselect=cherrypy/test/test_bus.py::BusMethodTests::test_block"}
+  '';
+
+  __darwinAllowLocalNetworking = true;
+
+  meta = with lib; {
+    homepage = "https://www.cherrypy.org";
+    description = "A pythonic, object-oriented HTTP framework";
+    license = licenses.bsd3;
+  };
+}
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/ci-info/default.nix b/nixpkgs/pkgs/development/python-modules/ci-info/default.nix
new file mode 100644
index 000000000000..d27f7cf0a82a
--- /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.2.0";
+  pname = "ci-info";
+
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "05j6pamk8sd51qmvpkl3f7sxajmncrqm0cz6n6bqgsvzjwn66w6x";
+  };
+
+  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..30220b48b72d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ci-py/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, fetchPypi, isPy27
+, pytest, pytestrunner, pytestCheckHook }:
+
+buildPythonPackage rec {
+  version = "1.0.0";
+  pname = "ci-py";
+
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "12ax07n81vxbyayhwzi1q6x7gfmwmvrvwm1n4ii6qa6fqlp9pzj7";
+  };
+
+  nativeBuildInputs = [ pytestrunner ];  # 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/cirq/default.nix b/nixpkgs/pkgs/development/python-modules/cirq/default.nix
new file mode 100644
index 000000000000..ebc0eb51df43
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cirq/default.nix
@@ -0,0 +1,122 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, fetchpatch
+, freezegun
+, google-api-core
+, matplotlib
+, networkx
+, numpy
+, pandas
+, protobuf
+, requests
+, scipy
+, sortedcontainers
+, sympy
+, typing-extensions
+  # test inputs
+, pytestCheckHook
+, pytest-asyncio
+, pytest-benchmark
+, ply
+, pydot
+, pyyaml
+, pygraphviz
+}:
+
+buildPythonPackage rec {
+  pname = "cirq";
+  version = "0.9.1";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "quantumlib";
+    repo = "cirq";
+    rev = "v${version}";
+    sha256 = "0mygvpq7kzga8l1w2jvwv9a2n3akpss45hrx250gdrnqjp6xrw64";
+  };
+
+  postPatch = ''
+    substituteInPlace requirements.txt \
+      --replace "freezegun~=0.3.15" "freezegun" \
+      --replace "matplotlib~=3.0" "matplotlib" \
+      --replace "networkx~=2.4" "networkx" \
+      --replace "numpy~=1.16" "numpy" \
+      --replace "protobuf~=3.12.0" "protobuf"
+
+    # Fix serialize_sympy_constants test by allowing small errors in pi
+    substituteInPlace cirq/google/arg_func_langs_test.py \
+      --replace "'float_value': float(str(np.float32(sympy.pi)))" "'float_value': pytest.approx(float(str(np.float32(sympy.pi))))"
+  '';
+
+  propagatedBuildInputs = [
+    freezegun
+    google-api-core
+    numpy
+    matplotlib
+    networkx
+    pandas
+    protobuf
+    requests
+    scipy
+    sortedcontainers
+    sympy
+    typing-extensions
+  ];
+
+  doCheck = true;
+  # pythonImportsCheck = [ "cirq" "cirq.Circuit" ];  # cirq's importlib hook doesn't work here
+  dontUseSetuptoolsCheck = true;
+  checkInputs = [
+    pytestCheckHook
+    pytest-asyncio
+    pytest-benchmark
+    ply
+    pydot
+    pyyaml
+    pygraphviz
+  ];
+
+  pytestFlagsArray = [
+    "--ignore=dev_tools"  # Only needed when developing new code, which is out-of-scope
+    "--ignore=cirq/contrib/"  # requires external (unpackaged) python packages, so untested.
+    "--benchmark-disable" # Don't need to run benchmarks when packaging.
+  ];
+  disabledTests = [
+    "test_convert_to_ion_gates" # fails on some systems due to rounding error, 0.75 != 0.750...2
+  ] ++ lib.optionals stdenv.isAarch64 [
+    # Seem to fail due to math issues on aarch64?
+    "expectation_from_wavefunction"
+    "test_single_qubit_op_to_framed_phase_form_output_on_example_case"
+  ] ++ [
+    # slow tests, for quicker building
+    "test_anneal_search_method_calls"
+    "test_density_matrix_from_state_tomography_is_correct"
+    "test_example_runs_qubit_characterizations"
+    "test_example_runs_hello_line_perf"
+    "test_example_runs_bc_mean_field_perf"
+    "test_main_loop"
+    "test_clifford_circuit_2"
+    "test_decompose_specific_matrices"
+    "test_two_qubit_randomized_benchmarking"
+    "test_kak_decomposition_perf"
+    "test_example_runs_simon"
+    "test_decompose_random_unitary"
+    "test_decompose_size_special_unitary"
+    "test_api_retry_5xx_errors"
+    "test_xeb_fidelity"
+    "test_example_runs_phase_estimator_perf"
+    "test_cross_entropy_benchmarking"
+  ];
+
+  meta = with lib; {
+    description = "A 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 ];
+  };
+}
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..86a2bd8aa88e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ciscomobilityexpress/default.nix
@@ -0,0 +1,20 @@
+{ buildPythonPackage, fetchPypi, lib, requests }:
+
+buildPythonPackage rec {
+  pname = "ciscomobilityexpress";
+  version = "1.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "fd3fe893d8a44f5ac1d46580af88e07f1066e73744763aca4ef2226f87d575ff";
+  };
+
+  propagatedBuildInputs = [ requests ];
+
+  meta = {
+    description = "Module to interact with Cisco Mobility Express APIs to fetch connected devices";
+    homepage = "https://pypi.python.org/pypi/${pname}/";
+    license = lib.licenses.mit;
+    maintainers = with lib.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..d0de4b320e8d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ciso8601/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytz
+, unittest2
+, isPy27
+}:
+
+buildPythonPackage rec {
+  pname = "ciso8601";
+  version = "2.1.3";
+
+  src = fetchFromGitHub {
+    owner = "closeio";
+    repo = "ciso8601";
+    rev = "v${version}";
+    sha256 = "0g1aiyc1ayh0rnibyy416m5mmck38ksgdm3jsy0z3rxgmgb24951";
+  };
+
+  checkInputs = [
+    pytz
+  ] ++ lib.optional (isPy27) unittest2;
+
+  meta = with lib; {
+    description = "Fast ISO8601 date time parser for Python written in C";
+    homepage = "https://github.com/closeio/ciso8601";
+    license = licenses.mit;
+    maintainers = [ 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..bd1ae0c563a4
--- /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.5.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "00aaff50jy4j0nakdzq9258z1gzrac9baarli2ymgspj88jg5968";
+  };
+
+  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/cjson/default.nix b/nixpkgs/pkgs/development/python-modules/cjson/default.nix
new file mode 100644
index 000000000000..ce70a2f459da
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cjson/default.nix
@@ -0,0 +1,18 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, isPy3k, isPyPy }:
+
+buildPythonPackage rec {
+  pname = "python-cjson";
+  version = "1.2.2";
+  disabled = isPy3k || isPyPy;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "3006c2c218297be3448dc793218e0b15d20fe9839775521bfc294fc6aa24972b";
+  };
+
+  meta = with lib; {
+    description = "A very fast JSON encoder/decoder for Python";
+    homepage = "https://ag-projects.com/";
+    license = licenses.lgpl2;
+  };
+}
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..dd72f5705e70
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ckcc-protocol/default.nix
@@ -0,0 +1,35 @@
+{ stdenv
+, buildPythonPackage
+, click
+, ecdsa
+, hidapi
+, lib
+, fetchPypi
+, pytest
+, pyaes
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "ckcc-protocol";
+  version = "1.0.2";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0zpn3miyapskw6s71v614pmga5zfain9j085axm9v50b8r71xh1i";
+  };
+
+  checkInputs = [
+    pytest
+  ];
+
+  propagatedBuildInputs = [ click ecdsa hidapi pyaes ];
+
+  meta = with lib; {
+    description = "Communicate with your Coldcard using Python";
+    homepage = "https://github.com/Coldcard/ckcc-protocol";
+    license = licenses.gpl3;
+    maintainers = [ maintainers.hkjn ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/class-registry/default.nix b/nixpkgs/pkgs/development/python-modules/class-registry/default.nix
new file mode 100644
index 000000000000..93c41cadea6e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/class-registry/default.nix
@@ -0,0 +1,32 @@
+{
+  buildPythonPackage,
+  fetchPypi,
+  lib,
+  nose,
+  six,
+  typing,
+  isPy27,
+}:
+
+buildPythonPackage rec {
+  pname = "class-registry";
+  version = "2.1.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0zjf9nczl1ifzj07bgs6mwxsfd5xck9l0lchv2j0fv2n481xp2v7";
+  };
+
+  propagatedBuildInputs = [ six ] ++ lib.optional isPy27 typing;
+  checkInputs = [ nose ];
+
+  # Tests currently failing.
+  doCheck = false;
+
+  meta = {
+    description = "Factory+Registry pattern for Python classes.";
+    homepage = "https://class-registry.readthedocs.io/en/latest/";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ kevincox ];
+  };
+}
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/cleo/default.nix b/nixpkgs/pkgs/development/python-modules/cleo/default.nix
new file mode 100644
index 000000000000..3e46b900dc7c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cleo/default.nix
@@ -0,0 +1,28 @@
+{ lib, buildPythonPackage, fetchPypi
+, pylev, pastel, 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/clf/default.nix b/nixpkgs/pkgs/development/python-modules/clf/default.nix
new file mode 100644
index 000000000000..f4168d689d44
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/clf/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv, 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..1dc04d707882
--- /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.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "dd6f164310f7d86fa3da1f82043a9c784e44a02ad49be932a80624261e56979b";
+  };
+
+  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/cliapp/default.nix b/nixpkgs/pkgs/development/python-modules/cliapp/default.nix
new file mode 100644
index 000000000000..4b7611c092e2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cliapp/default.nix
@@ -0,0 +1,31 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchgit
+, sphinx
+, isPy3k
+}:
+
+buildPythonPackage {
+  pname = "cliapp";
+  version = "1.20150305";
+  disabled = isPy3k;
+
+  src = fetchgit {
+      url = "http://git.liw.fi/cgi-bin/cgit/cgit.cgi/cliapp";
+      rev = "569df8a5959cd8ef46f78c9497461240a5aa1123";
+      sha256 = "882c5daf933e4cf089842995efc721e54361d98f64e0a075e7373b734cd899f3";
+  };
+
+  buildInputs = [ sphinx ];
+
+  # error: invalid command 'test'
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://liw.fi/cliapp/";
+    description = "Python framework for Unix command line programs";
+    license = licenses.gpl2;
+    maintainers = [];
+  };
+
+}
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..61a154286325
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/click-completion/default.nix
@@ -0,0 +1,23 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, isPy3k,
+  click, jinja2, shellingham, six
+}:
+
+buildPythonPackage rec {
+  pname = "click-completion";
+  version = "0.5.2";
+  disabled = (!isPy3k);
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "5bf816b81367e638a190b6e91b50779007d14301b3f9f3145d68e3cade7bce86";
+  };
+
+  propagatedBuildInputs = [ click jinja2 shellingham six ];
+
+  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-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..58da038faae3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/click-default-group/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, fetchFromGitHub, click, pytest }:
+
+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";
+  };
+
+  propagatedBuildInputs = [ click ];
+
+  checkInputs = [ pytest ];
+
+  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..8d3c3ba3e240
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/click-didyoumean/default.nix
@@ -0,0 +1,22 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi,
+  click
+}:
+
+buildPythonPackage rec {
+  pname = "click-didyoumean";
+  version = "0.0.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1svaza5lpvdbmyrx5xi0riqzq4hb9wnlpqrg6r8zy14pbi42j8hi";
+  };
+
+  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..dbe4e33ca84c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/click-help-colors/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv, fetchPypi, buildPythonPackage
+, click, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "click-help-colors";
+  version = "0.9";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "eb037a2dd95a9e20b3897c2b3ca57e7f6797f76a8d93f7eeedda7fcdcbc9b635";
+  };
+
+  propagatedBuildInputs = [ click ];
+
+  # tries to use /homeless-shelter to mimic container usage, etc
+  #doCheck = false;
+  checkInputs = [ pytest ];
+
+  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..4aa63dd45378
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/click-log/default.nix
@@ -0,0 +1,20 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, click }:
+
+buildPythonPackage rec {
+  pname = "click-log";
+  version = "0.3.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "16fd1ca3fc6b16c98cea63acf1ab474ea8e676849dc669d86afafb0ed7003124";
+  };
+
+  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-plugins/default.nix b/nixpkgs/pkgs/development/python-modules/click-plugins/default.nix
new file mode 100644
index 000000000000..c2b25341e17c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/click-plugins/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv, 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..23adb12da658
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/click-repl/default.nix
@@ -0,0 +1,20 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, click, prompt_toolkit }:
+
+buildPythonPackage rec {
+  pname = "click-repl";
+  version = "0.1.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1mcmz95595nrp4r58spy1ac993db26hk4q97isghbmn4md99vwmr";
+  };
+
+  propagatedBuildInputs = [ click prompt_toolkit ];
+
+  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-threading/default.nix b/nixpkgs/pkgs/development/python-modules/click-threading/default.nix
new file mode 100644
index 000000000000..6943a3dcfd15
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/click-threading/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest
+, click
+, isPy3k
+, futures
+}:
+
+buildPythonPackage rec {
+  pname = "click-threading";
+  version = "0.4.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b2b0fada5bf184b56afaccc99d0d2548d8ab07feb2e95e29e490f6b99c605de7";
+  };
+
+  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..fcbd4d0981af
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/click/default.nix
@@ -0,0 +1,28 @@
+{ lib, buildPythonPackage, fetchPypi, locale, pytestCheckHook }:
+
+buildPythonPackage rec {
+  pname = "click";
+  version = "7.1.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a";
+  };
+
+  postPatch = ''
+    substituteInPlace src/click/_unicodefun.py \
+      --replace "'locale'" "'${locale}/bin/locale'"
+  '';
+
+  checkInputs = [ pytestCheckHook ];
+
+  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;
+  };
+}
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..e211b955ac84
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/clickclick/default.nix
@@ -0,0 +1,30 @@
+{ stdenv, lib, buildPythonPackage, fetchFromGitHub, isPy36, flake8, click, pyyaml, six, pytestCheckHook, pytestcov }:
+
+buildPythonPackage rec {
+  pname = "clickclick";
+  version = "1.2.2";
+
+  src = fetchFromGitHub {
+    owner = "hjacobs";
+    repo = "python-clickclick";
+    rev = version;
+    sha256 = "1rij9ws9nhsmagiy1vclzliiqfkxi006rf65qvrw1k3sm2s8p5g0";
+  };
+
+  checkInputs = [ pytestCheckHook pytestcov ];
+  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/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-driver/default.nix b/nixpkgs/pkgs/development/python-modules/clickhouse-driver/default.nix
new file mode 100644
index 000000000000..a1addcfc97ab
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/clickhouse-driver/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools
+, pytz
+, tzlocal
+, clickhouse-cityhash
+, zstd
+, lz4
+, freezegun
+, mock
+, nose
+}:
+
+buildPythonPackage rec {
+  pname = "clickhouse-driver";
+  version = "0.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "62d37f93872d5a13eb6b0d52bab2b593ed0e14cf9200949aa2d02f9801064c0f";
+  };
+
+  propagatedBuildInputs = [
+    setuptools
+    pytz
+    tzlocal
+    clickhouse-cityhash
+    zstd
+    lz4
+  ];
+
+  checkInputs = [
+    freezegun
+    mock
+    nose
+  ];
+
+  doCheck = true;
+  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..33a129d287ef
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cliff/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pbr
+, prettytable
+, pyparsing
+, six
+, stevedore
+, pyyaml
+, cmd2
+, pytestCheckHook
+, testtools
+, fixtures
+, which
+}:
+
+buildPythonPackage rec {
+  pname = "cliff";
+  version = "3.6.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a3f4fa67eeafbcfa7cf9fe4b1755d410876528e1d0d115740db00b50a1250272";
+  };
+
+  propagatedBuildInputs = [
+    pbr
+    prettytable
+    pyparsing
+    six
+    stevedore
+    pyyaml
+    cmd2
+  ];
+
+  postPatch = ''
+    sed -i -e '/cmd2/c\cmd2' -e '/PrettyTable/c\PrettyTable' requirements.txt
+  '';
+
+  checkInputs = [ fixtures pytestCheckHook testtools which ];
+  # add some tests
+  pytestFlagsArray = [
+    "cliff/tests/test_utils.py"
+    "cliff/tests/test_app.py"
+    "cliff/tests/test_command.py"
+    "cliff/tests/test_help.py"
+    "cliff/tests/test_lister.py"
+  ];
+
+  meta = with lib; {
+    description = "Command Line Interface Formulation Framework";
+    homepage = "https://docs.openstack.org/cliff/latest/";
+    license = licenses.asl20;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..85ed160413e7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/clifford/default.nix
@@ -0,0 +1,72 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, isPy27
+, future
+, h5py
+, ipython
+, numba
+, numpy
+, pytestCheckHook
+, scipy
+, sparse
+}:
+
+buildPythonPackage rec {
+  pname = "clifford";
+  version = "1.3.1";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ade11b20d0631dfc9c2f18ce0149f1e61e4baf114108b27cfd68e5c1619ecc0c";
+  };
+
+  patches = [
+    (fetchpatch {
+      # Compatibility with h5py 3.
+      # Will be included in the next releasse after 1.3.1
+      url = "https://github.com/pygae/clifford/pull/388/commits/955d141662c68d3d61aa50a162b39e656684c208.patch";
+      sha256 = "0pkpwnk0kfdxsbzsxqlqh8kgif17l5has0mg31g3kyp8lncj89b1";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    future
+    h5py
+    numba
+    numpy
+    scipy
+    sparse
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    ipython
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "'numba==0.43'" "'numba'"
+  '';
+
+  # avoid collecting local files
+  preCheck = ''
+    cd clifford/test
+  '';
+
+  disabledTests = [
+    "veryslow"
+    "test_algebra_initialisation"
+    "test_cga"
+    "test_estimate_rotor_sequential[random_sphere]"
+  ];
+
+  meta = with lib; {
+    description = "Numerical Geometric Algebra Module";
+    homepage = "https://clifford.readthedocs.io";
+    license = licenses.bsd3;
+    maintainers = [ 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..f9d953d8536e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cligj/default.nix
@@ -0,0 +1,32 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub
+, click, pytest, glibcLocales
+}:
+
+buildPythonPackage rec {
+  pname = "cligj";
+  version = "0.5.0";
+
+  src = fetchFromGitHub {
+    owner = "mapbox";
+    repo = "cligj";
+    rev = version;
+    sha256 = "13vlibbn86dhh6iy8k831vsa249746jnk419wcr9vvr3pqxml6g2";
+  };
+
+  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..7b07b0945919
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/clikit/default.nix
@@ -0,0 +1,31 @@
+{ lib, buildPythonPackage, fetchPypi
+, isPy27, pythonAtLeast
+, pylev, pastel, typing, enum34, 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..133fc0de55c6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/clint/default.nix
@@ -0,0 +1,39 @@
+{ lib, stdenv
+, 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";
+
+  checkPhase = ''
+    ${python.interpreter} test_clint.py
+  '';
+
+  buildInputs = [ mock nose nose_progressive pkgs.glibcLocales ];
+  propagatedBuildInputs = [ pillow blessings args ];
+
+  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..04e97f4c6693
--- /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..c9c3f5c905ce
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/clize/default.nix
@@ -0,0 +1,53 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, dateutil
+, sigtools
+, six
+, attrs
+, od
+, docutils
+, repeated_test
+, pygments
+, unittest2
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "clize";
+  version = "4.1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f54dedcf6fea90a3e75c30cb65e0ab1e832760121f393b8d68edd711dbaf7187";
+  };
+
+  # Remove overly restrictive version constraints
+  postPatch = ''
+    substituteInPlace setup.py --replace "attrs>=19.1.0,<20" "attrs"
+  '';
+
+  checkInputs = [
+    pytestCheckHook
+    dateutil
+    pygments
+    repeated_test
+    unittest2
+  ];
+
+  propagatedBuildInputs = [
+    attrs
+    docutils
+    od
+    sigtools
+    six
+  ];
+
+  pythonImportsCheck = [ "clize" ];
+
+  meta = with lib; {
+    description = "Command-line argument parsing for Python";
+    homepage = "https://github.com/epsy/clize";
+    license = licenses.mit;
+  };
+}
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..b9ffd35bf96d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/clldutils/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, isPy27
+, attrs
+, colorlog
+, csvw
+, dateutil
+, tabulate
+, mock
+, postgresql
+, pytestCheckHook
+, pytest-mock
+}:
+
+buildPythonPackage rec {
+  pname = "clldutils";
+  version = "3.6.0";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "clld";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "10jcd2x99z5ym2aki92c54caw97b3xgrkjj83qpln26hbdwpaz99";
+  };
+
+  patchPhase = ''
+    substituteInPlace setup.cfg --replace "--cov" ""
+  '';
+
+  propagatedBuildInputs = [
+    dateutil
+    tabulate
+    colorlog
+    attrs
+    csvw
+  ];
+
+  checkInputs = [
+    mock
+    postgresql
+    pytestCheckHook
+    pytest-mock
+  ];
+
+  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/closure-linter/default.nix b/nixpkgs/pkgs/development/python-modules/closure-linter/default.nix
new file mode 100644
index 000000000000..75f5ba0b449e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/closure-linter/default.nix
@@ -0,0 +1,33 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchgit
+, isPy3k
+, gflags
+}:
+
+/* There is a project called "closure-linter" on PyPI that is the
+   same as this, but it does not appear to be owned by Google.
+   So we're pulling from Google's GitHub repo instead. */
+buildPythonPackage {
+  pname = "closure-linter";
+  version = "2.3.19";
+
+  /* This project has no Python 3 support, as noted by
+     https://github.com/google/closure-linter/issues/81 */
+  disabled = isPy3k;
+
+  src = fetchgit {
+    url = "https://github.com/google/closure-linter";
+    rev = "5c27529075bb88bdc45e73008f496dec8438d658";
+    sha256 = "076c7q7pr7akfvq5y8lxr1ab81wwps07gw00igdkcxnc5k9dzxwc";
+  };
+
+  propagatedBuildInputs = [ gflags ];
+
+  meta = with lib; {
+    description = "Checks JavaScript files against Google's style guide.";
+    homepage = "https://developers.google.com/closure/utilities/";
+    license = with licenses; [ asl20 ];
+  };
+
+}
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..a21faa492dfe
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cloudflare/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, beautifulsoup4
+, requests
+, future
+, pyyaml
+, jsonlines
+}:
+
+buildPythonPackage rec {
+  pname = "cloudflare";
+  version = "2.8.15";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1f47bd324f80e91487dea2c79be934b1dc612bcfa63e784dcf74c6a2f52a41cc";
+  };
+
+  propagatedBuildInputs = [
+    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 = [ 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..e5b4a63a564e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cloudpickle/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, isPy27, pytest, mock }:
+
+buildPythonPackage rec {
+  pname = "cloudpickle";
+  version = "1.6.0";
+  disabled = isPy27; # abandoned upstream
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "9bc994f9e9447593bd0a45371f0e7ac7333710fcf64a4eb9834bf149f4ef2f32";
+  };
+
+  buildInputs = [ pytest mock ];
+
+  # See README for tests invocation
+  checkPhase = ''
+    PYTHONPATH=$PYTHONPATH:'.:tests' py.test
+  '';
+
+  # TypeError: cannot serialize '_io.FileIO' object
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Extended pickling support for Python objects";
+    homepage = "https://github.com/cloudpipe/cloudpickle";
+    license = with licenses; [ bsd3 ];
+  };
+}
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..faa1affcd060
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cloudscraper/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, isPy3k
+, fetchPypi
+, requests
+, requests-toolbelt
+, pyparsing
+}:
+
+buildPythonPackage rec {
+  pname = "cloudscraper";
+  version = "1.2.52";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "07j2nhzimzhcskj2wpxpvpb3dhpci19daw02r2ckkjiq3zifhm6v";
+  };
+
+  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 = "A 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/clustershell/default.nix b/nixpkgs/pkgs/development/python-modules/clustershell/default.nix
new file mode 100644
index 000000000000..a0e744f9919d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/clustershell/default.nix
@@ -0,0 +1,89 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, pyyaml, openssh
+, nose, bc, hostname, coreutils, bash, gnused
+}:
+
+buildPythonPackage rec {
+  pname = "ClusterShell";
+  version = "1.8.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0ebc1925c1aed94f99d74cbc0230215127ade80a25240133204094faa74bc41b";
+  };
+
+  propagatedBuildInputs = [ pyyaml ];
+
+  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"'
+  '';
+
+  checkInputs = [ nose bc hostname coreutils gnused ];
+
+  # Many tests want to open network connections
+  # https://github.com/cea-hpc/clustershell#test-suite
+  #
+  # Several tests fail on Darwin
+  checkPhase = ''
+    for f in tests/*; do
+      substituteInPlace $f \
+        --replace '/bin/hostname'   '${hostname}/bin/hostname' \
+        --replace '/bin/sleep'      '${coreutils}/bin/sleep' \
+        --replace '"sleep'          '"${coreutils}/bin/sleep' \
+        --replace '/bin/echo'       '${coreutils}/bin/echo' \
+        --replace '/bin/uname'      '${coreutils}/bin/uname' \
+        --replace '/bin/false'      '${coreutils}/bin/false' \
+        --replace '/bin/true'       '${coreutils}/bin/true' \
+        --replace '/usr/bin/printf' '${coreutils}/bin/printf' \
+        --replace '"sed'            '"${gnused}/bin/sed' \
+        --replace ' sed '           ' ${gnused}/bin/sed '
+    done
+
+    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; {
+    description = "Scalable Python framework for cluster administration";
+    homepage = "https://cea-hpc.github.io/clustershell";
+    license = licenses.lgpl21;
+    maintainers = [ maintainers.alexvorobiev ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cma/default.nix b/nixpkgs/pkgs/development/python-modules/cma/default.nix
new file mode 100644
index 000000000000..8937f78a7a66
--- /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.0.3";
+
+  src = fetchFromGitHub {
+    owner = "CMA-ES";
+    repo = "pycma";
+    rev = "r${version}";
+    sha256 = "00vv7imdkv0bqcs4b8dg9nggxcl2fkcnhdd46n22bcmnwy8rjxv6";
+  };
+
+  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..3c6342f6596f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cmarkgfm/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, fetchPypi, cffi, pytest }:
+
+buildPythonPackage rec {
+  pname = "cmarkgfm";
+  version = "0.5.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "7a5131a78836e55dcdb1f2c5f17bbaa40e5f83c86a205de1b71a298928e1391f";
+  };
+
+  propagatedBuildInputs = [ cffi ];
+
+  checkInputs = [ pytest ];
+
+  checkPhase = ''
+    py.test
+  '';
+
+  meta = with lib; {
+    description = "Minimal bindings to GitHub's fork of cmark";
+    homepage = "https://github.com/jonparrott/cmarkgfm";
+    license = licenses.mit;
+  };
+}
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..bafdb9cb95da
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cmd2/default.nix
@@ -0,0 +1,60 @@
+{ lib, stdenv, fetchPypi, buildPythonPackage, pythonOlder, isPy3k
+, pyperclip, six, pyparsing, vim, wcwidth, colorama, attrs
+, contextlib2 ? null, typing ? null, setuptools_scm
+, pytest, mock ? null, pytest-mock
+, which, glibcLocales
+}:
+buildPythonPackage rec {
+  pname = "cmd2";
+  version = "1.4.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "e59fa932418603af4e046a96c8985812b05af8a73bfd9d7a386cd1b02c6ab687";
+  };
+
+  LC_ALL="en_US.UTF-8";
+
+  postPatch = lib.optional 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
+  '';
+
+  disabled = !isPy3k;
+
+  buildInputs = [
+    setuptools_scm
+  ];
+
+  propagatedBuildInputs = [
+    colorama
+    pyperclip
+    six
+    pyparsing
+    wcwidth
+    attrs
+  ]
+  ++ lib.optionals (pythonOlder "3.5") [contextlib2 typing]
+  ;
+
+
+  doCheck = !stdenv.isDarwin;
+  # pytest-cov
+  # argcomplete  will generate errors
+  checkInputs= [ pytest mock which vim glibcLocales pytest-mock ]
+        ++ lib.optional (pythonOlder "3.6") [ mock ];
+  checkPhase = ''
+    # test_path_completion_user_expansion might be fixed in the next release
+    py.test -k 'not test_path_completion_user_expansion'
+  '';
+
+  meta = with lib; {
+    description = "Enhancements for standard library's cmd module";
+    homepage = "https://github.com/python-cmd2/cmd2";
+    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..4249ed7164b9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cmdline/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv, 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/cmdtest/default.nix b/nixpkgs/pkgs/development/python-modules/cmdtest/default.nix
new file mode 100644
index 000000000000..5bb4ef79a20c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cmdtest/default.nix
@@ -0,0 +1,32 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchurl
+, cliapp
+, ttystatus
+, markdown
+, isPy3k
+, isPyPy
+}:
+
+buildPythonPackage rec {
+  pname = "cmdtest";
+  version = "0.32";
+  disabled = isPy3k || isPyPy;
+
+  src = fetchurl {
+    url = "http://code.liw.fi/debian/pool/main/c/cmdtest/cmdtest_${version}.orig.tar.xz";
+    sha256 = "0scc47h1nkmbm5zlvk9bsnsg64kb9r4xadchdinf4f1mph9qpgn6";
+  };
+
+  propagatedBuildInputs = [ cliapp ttystatus markdown ];
+
+  # TODO: cmdtest tests must be run before the buildPhase
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://liw.fi/cmdtest/";
+    description = "Black box tests Unix command line tools";
+    license = licenses.gpl3;
+  };
+
+}
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..92af67fa183a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cnvkit/default.nix
@@ -0,0 +1,80 @@
+{ lib
+, fetchFromGitHub
+, fetchpatch
+, rPackages
+, rWrapper
+, buildPythonPackage
+, biopython
+, numpy
+, scipy
+, scikitlearn
+, pandas
+, matplotlib
+, reportlab
+, pysam
+, future
+, pillow
+, pomegranate
+, pyfaidx
+, python
+, R
+}:
+
+buildPythonPackage rec {
+  pname = "CNVkit";
+  version = "0.9.7";
+
+  src = fetchFromGitHub {
+    owner = "etal";
+    repo = "cnvkit";
+    rev = "v${version}";
+    sha256 = "022zplgqil5l76vri647cyjx427vnbg5r2gw6lw712d2janvdjm7";
+  };
+
+  patches = [
+    # Fix: AttributeError: module 'pandas.io.common' has no attribute 'EmptyDataError'
+    (fetchpatch {
+      url = "https://github.com/etal/cnvkit/commit/392adfffedfa0415e635b72c5027835b0a8d7ab5.patch";
+      sha256 = "0s0gwyy0hybmhc3jij2v9l44b6lkcmclii8bkwsazzj2kc24m2rh";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    biopython
+    numpy
+    scipy
+    scikitlearn
+    pandas
+    matplotlib
+    reportlab
+    pyfaidx
+    pysam
+    future
+    pillow
+    pomegranate
+    rPackages.DNAcopy
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "pandas >= 0.20.1, < 0.25.0" "pandas"
+  '';
+
+  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
+  '';
+
+  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/coapthon3/default.nix b/nixpkgs/pkgs/development/python-modules/coapthon3/default.nix
new file mode 100644
index 000000000000..6f22e8e9f296
--- /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.1";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "Tanganelli";
+    repo = pname;
+    rev = version;
+    sha256 = "1im35i5i72y1p9qj8ixkwq7q6ksbrmi42giqiyfgjp1ym38snl69";
+  };
+
+  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/coconut/default.nix b/nixpkgs/pkgs/development/python-modules/coconut/default.nix
new file mode 100644
index 000000000000..b75a82b6c2b2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/coconut/default.nix
@@ -0,0 +1,52 @@
+{
+  lib,
+  buildPythonApplication,
+  fetchFromGitHub,
+  fetchpatch,
+
+  cpyparsing,
+  ipykernel,
+  mypy,
+  pygments,
+  pytest,
+  prompt_toolkit,
+  tkinter,
+  watchdog
+}:
+
+buildPythonApplication rec {
+  pname = "coconut";
+  version = "1.4.3";
+
+  src = fetchFromGitHub {
+    owner = "evhub";
+    repo = "coconut";
+    rev = "v${version}";
+    sha256 = "1pz13vza3yy95dbylnq89fzc3mwgcqr7ds096wy25k6vxd9dp9c3";
+  };
+
+  propagatedBuildInputs = [ cpyparsing pygments prompt_toolkit ipykernel mypy watchdog ];
+
+  patches = [
+    (fetchpatch {
+      name = "fix-setuptools-version-check.patch";
+      url = "https://github.com/LibreCybernetics/coconut/commit/2916a087da1e063cc4438b68d4077347fd1ea4a2.patch";
+      sha256 = "136jbd2rvnifw30y73vv667002nf7sbkm5qyihshj4db7ngysr6q";
+    })
+  ];
+
+  checkInputs = [ pytest tkinter ];
+  # Currently most tests do not work on Hydra due to external fetches.
+  checkPhase = ''
+    pytest tests/constants_test.py
+    pytest tests/main_test.py::TestShell::test_compile_to_file
+    pytest tests/main_test.py::TestShell::test_convenience
+  '';
+
+  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/default.nix b/nixpkgs/pkgs/development/python-modules/cocotb/default.nix
new file mode 100644
index 000000000000..e95900d17b52
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cocotb/default.nix
@@ -0,0 +1,52 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub, setuptools, swig, verilog }:
+
+buildPythonPackage rec {
+  pname = "cocotb";
+  version = "1.4.0";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0fv0mg8zh40ffq0q39s195y6hvjrzihpx0i3f7ba5881syw3x7p4";
+  };
+
+  propagatedBuildInputs = [
+    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
+
+    # This can perhaps be removed in the next update after 1.3.2?
+    substituteInPlace cocotb/share/makefiles/Makefile.inc --replace "-Werror" ""
+  '';
+
+  checkInputs = [ swig verilog ];
+
+  checkPhase = ''
+    # test expected failures actually pass because of a fix in our icarus version
+    # https://github.com/cocotb/cocotb/issues/1952
+    substituteInPlace tests/test_cases/test_discovery/test_discovery.py \
+      --replace 'def access_single_bit' $'def foo(x): pass\ndef foo' \
+      --replace 'def access_single_bit_assignment' $'def foo(x): pass\ndef foo'
+
+    export PATH=$out/bin:$PATH
+    make test
+  '';
+
+  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..924422bf7d4f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/codecov/default.nix
@@ -0,0 +1,28 @@
+{ lib, buildPythonPackage, fetchPypi, requests, coverage, unittest2 }:
+
+buildPythonPackage rec {
+  pname = "codecov";
+  version = "2.1.10";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d30ad6084501224b1ba699cbf018a340bb9553eb2701301c14133995fdd84f33";
+  };
+
+  checkInputs = [ unittest2 ]; # Tests only
+
+  propagatedBuildInputs = [ requests coverage ];
+
+  postPatch = ''
+    sed -i 's/, "argparse"//' setup.py
+  '';
+
+  # No tests in archive
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Python report uploader for Codecov";
+    homepage = "https://codecov.io/";
+    license = licenses.asl20;
+  };
+}
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..7efb08c2c67b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/codespell/default.nix
@@ -0,0 +1,31 @@
+{ lib, buildPythonApplication, fetchPypi, pytest, chardet }:
+
+buildPythonApplication rec {
+  pname = "codespell";
+  version = "2.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "dd9983e096b9f7ba89dd2d2466d1fc37231d060f19066331b9571341363c77b8";
+  };
+
+  # no tests in pypi tarball
+  doCheck = false;
+  checkInputs = [ pytest chardet ];
+  checkPhase = ''
+    # We don't want to be affected by the presence of these
+    rm -r codespell_lib setup.cfg
+    # test_command assumes too much about the execution environment
+    pytest --pyargs codespell_lib.tests -k "not test_command"
+  '';
+
+  pythonImportsCheck = [ "codespell_lib" ];
+
+  meta = {
+    description = "Fix common misspellings in source code";
+    homepage = "https://github.com/codespell-project/codespell";
+    license = with lib.licenses; [ gpl2 cc-by-sa-30 ];
+    maintainers = with lib.maintainers; [ johnazoidberg ];
+    platforms = lib.platforms.all;
+  };
+}
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..019faeaebc30
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cogapp/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "cogapp";
+  version = "3.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "5e5da2bcfc4e4750c66cecb80ea4eaed1ef4fddd3787c989d4f5bfffb1152d6a";
+  };
+
+  # there are no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A code generator for executing Python snippets in source files";
+    homepage = "http://nedbatchelder.com/code/cog";
+    license = licenses.mit;
+    maintainers = with maintainers; [ lovek323 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/coilmq/default.nix b/nixpkgs/pkgs/development/python-modules/coilmq/default.nix
new file mode 100644
index 000000000000..bc0b6af146af
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/coilmq/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi
+, stompclient, python-daemon, redis, pid, pytest, six, click, coverage
+, sqlalchemy }:
+
+buildPythonPackage rec {
+  pname = "CoilMQ";
+  version = "1.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "4cbfeb5ed2459df14902c1380157be6267702b1271682924cd316ccad8a29d1d";
+  };
+
+  propagatedBuildInputs = [ stompclient python-daemon redis pid ];
+  buildInputs = [ pytest six click coverage sqlalchemy ];
+
+  # The teste data is not included in the distribution
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Simple, lightweight, and easily extensible STOMP message broker";
+    homepage = "https://github.com/hozn/coilmq/";
+    license = licenses.asl20;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/coinmarketcap/default.nix b/nixpkgs/pkgs/development/python-modules/coinmarketcap/default.nix
new file mode 100644
index 000000000000..168f75b7f49b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/coinmarketcap/default.nix
@@ -0,0 +1,19 @@
+{ lib, buildPythonPackage, fetchPypi, requests-cache }:
+
+buildPythonPackage rec {
+  pname = "coinmarketcap";
+  version = "5.0.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1cfee31bf330a17cedf188e4e99588e6a4c6c969c93da71f55a9f4ec6a6c216f";
+  };
+
+  propagatedBuildInputs = [ requests-cache ];
+
+  meta = with lib; {
+    description = "A python wrapper around the https://coinmarketcap.com API.";
+    homepage = "https://github.com/barnumbirr/coinmarketcap";
+    license = licenses.asl20;
+  };
+}
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..a5b29af1c31a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/colanderalchemy/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, unittest2
+, 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/colorama/default.nix b/nixpkgs/pkgs/development/python-modules/colorama/default.nix
new file mode 100644
index 000000000000..6778c6acadb8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/colorama/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv, fetchPypi, buildPythonPackage }:
+
+buildPythonPackage rec {
+  pname = "colorama";
+  version = "0.4.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b";
+  };
+
+  # No tests in archive
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/tartley/colorama";
+    license = licenses.bsd3;
+    description = "Cross-platform colored terminal text";
+  };
+}
+
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..303d244fff33
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/colorcet/default.nix
@@ -0,0 +1,49 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, param
+, pyct
+, nbsmoke
+, flake8
+, pytest
+, pytest-mpl
+}:
+
+buildPythonPackage rec {
+  pname = "colorcet";
+  version = "2.0.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "efa44b6f4078261e62d0039c76aba17ac8d3ebaf0bc2291a111aee3905313433";
+  };
+
+  propagatedBuildInputs = [
+    param
+    pyct
+  ];
+
+  checkInputs = [
+    nbsmoke
+    pytest
+    flake8
+    pytest-mpl
+  ];
+
+  checkPhase = ''
+    export HOME=$(mktemp -d)
+    mkdir -p $HOME/.config/matplotlib
+    echo "backend: ps" > $HOME/.config/matplotlib/matplotlibrc
+    ln -s $HOME/.config/matplotlib $HOME/.matplotlib
+
+    # requires other backends to be available
+    pytest colorcet -k 'not matplotlib_default_colormap_plot'
+  '';
+
+  meta = with lib; {
+    description = "Collection of perceptually uniform colormaps";
+    homepage = "https://colorcet.pyviz.org";
+    license = licenses.cc-by-40;
+    maintainers = [ 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..08da356e222e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/colorclass/default.nix
@@ -0,0 +1,20 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "colorclass";
+  version = "2.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b05c2a348dfc1aff2d502527d78a5b7b7e2f85da94a96c5081210d8e9ee8e18b";
+  };
+
+  # 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/default.nix b/nixpkgs/pkgs/development/python-modules/colored/default.nix
new file mode 100644
index 000000000000..5caa0cad2f6f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/colored/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "colored";
+  version = "1.4.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "056fac09d9e39b34296e7618897ed1b8c274f98423770c2980d829fd670955ed";
+  };
+
+  # 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..48d13ab49dd2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/coloredlogs/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, humanfriendly
+, verboselogs
+, capturer
+, pytest
+, mock
+, util-linux
+, isPy38
+}:
+
+buildPythonPackage rec {
+  pname = "coloredlogs";
+  version = "14.0";
+
+  src = fetchFromGitHub {
+    owner = "xolox";
+    repo = "python-coloredlogs";
+    rev = version;
+    sha256 = "0rnmxwrim4razlv4vi3krxk5lc5ksck6h5374j8avqwplika7q2x";
+  };
+
+  # 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 = !(isPy38 && stdenv.isDarwin);
+  checkPhase = ''
+    PATH=$PATH:$out/bin pytest . -k "not test_plain_text_output_format \
+                                     and not test_auto_install"
+  '';
+  checkInputs = [ pytest mock util-linux verboselogs capturer ];
+
+  pythonImportsCheck = [ "coloredlogs" ];
+
+  propagatedBuildInputs = [ humanfriendly ];
+
+  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..0740ee33b5f1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/colorlog/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "colorlog";
+  version = "4.7.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0lc2r105hxbyh29dsgczdi379lh57gnbj56jsxi5g9rqcihmpl0q";
+  };
+
+  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..80f58250be4d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/colormath/default.nix
@@ -0,0 +1,32 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, networkx
+, nose
+, numpy
+, lib
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "colormath";
+  version = "3.0.0";
+
+  src = fetchFromGitHub {
+    owner = "gtaylor";
+    rev = "3.0.0";
+    repo = "python-colormath";
+    sha256 = "1nqf5wy8ikx2g684khzvjc4iagkslmbsxxwilbv4jpaznr9lahdl";
+  };
+
+  propagatedBuildInputs = [ networkx numpy ];
+
+  checkInputs = [ nose ];
+  checkPhase = "nosetests";
+
+  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..3ce0bddf1def
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/colorspacious/default.nix
@@ -0,0 +1,24 @@
+{ lib, pkgs, buildPythonPackage, fetchPypi, isPy3k
+, 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/colour/default.nix b/nixpkgs/pkgs/development/python-modules/colour/default.nix
new file mode 100644
index 000000000000..6a6ad9d4946a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/colour/default.nix
@@ -0,0 +1,19 @@
+{ lib, stdenv, 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/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/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/conda/default.nix b/nixpkgs/pkgs/development/python-modules/conda/default.nix
new file mode 100644
index 000000000000..b097805292e9
--- /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..d1dcce9699b3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/configargparse/default.nix
@@ -0,0 +1,21 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "ConfigArgParse";
+  version = "1.2.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1p1pzpf5qpf80bfxsx1mbw9blyhhypjvhl3i60pbmhfmhvlpplgd";
+  };
+
+  # no tests in tarball
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A drop-in replacement for argparse";
+    homepage = "https://github.com/zorro3/ConfigArgParse";
+    license = licenses.mit;
+    maintainers = [ maintainers.willibutz ];
+  };
+}
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..d0988689275e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/configobj/default.nix
@@ -0,0 +1,34 @@
+{ lib, stdenv, buildPythonPackage
+, fetchFromGitHub
+, six
+, mock, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "configobj";
+  version = "5.0.6";
+
+  # Pypi archives don't contain the tests
+  src = fetchFromGitHub {
+    owner = "DiffSK";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0x97794nk3dfn0i3si9fv7y19jnpnarb34bkdwlz7ii7ag6xihhw";
+  };
+
+
+  propagatedBuildInputs = [ six ];
+
+  checkPhase = ''
+    pytest --deselect=tests/test_configobj.py::test_options_deprecation
+  '';
+
+  checkInputs = [ mock pytest ];
+
+  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/4.nix b/nixpkgs/pkgs/development/python-modules/configparser/4.nix
new file mode 100644
index 000000000000..cbef6fd2ce7f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/configparser/4.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, setuptools_scm }:
+
+buildPythonPackage rec {
+  pname = "configparser";
+  version = "4.0.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "c7d282687a5308319bf3d2e7706e575c635b0a470342641c93bea0ea3b5331df";
+  };
+
+  # 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/configparser/default.nix b/nixpkgs/pkgs/development/python-modules/configparser/default.nix
new file mode 100644
index 000000000000..e8610f053da6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/configparser/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, setuptools_scm
+, toml
+}:
+
+buildPythonPackage rec {
+  pname = "configparser";
+  version = "5.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "005c3b102c96f4be9b8f40dafbd4997db003d07d1caa19f37808be8031475f2a";
+  };
+
+  # No tests available
+  doCheck = false;
+
+  nativeBuildInputs = [ setuptools_scm toml ];
+
+  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..ba3700962bf6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/configshell/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv, fetchFromGitHub, buildPythonPackage, pyparsing, six, urwid }:
+
+buildPythonPackage rec {
+  pname = "configshell";
+  version = "1.1.28";
+
+  src = fetchFromGitHub {
+    owner = "open-iscsi";
+    repo = "${pname}-fb";
+    rev = "v${version}";
+    sha256 = "1ym2hkvmmacgy21wnjwzyrcxyl3sx4bcx4hc51vf4lzcnj589l68";
+  };
+
+  propagatedBuildInputs = [ pyparsing six urwid ];
+
+  meta = with lib; {
+    description = "A Python library for building configuration shells";
+    homepage = "https://github.com/open-iscsi/configshell-fb";
+    license = licenses.asl20;
+  };
+}
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..f3e8b1c943b1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/confluent-kafka/default.nix
@@ -0,0 +1,23 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, isPy3k, rdkafka, requests, avro3k, avro, futures, enum34 }:
+
+buildPythonPackage rec {
+  version = "1.5.0";
+  pname = "confluent-kafka";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "9ac812006000887f76c95b8a33a9f0b65845bf072fbc54a42a1acffd34e41120";
+  };
+
+  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..8f1c1754056a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/confuse/default.nix
@@ -0,0 +1,27 @@
+{ buildPythonPackage
+, enum34
+, fetchPypi
+, isPy27
+, lib
+, pathlib
+, pyyaml
+}:
+
+buildPythonPackage rec {
+  pname = "confuse";
+  version = "1.4.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-kvwEUcbiwnMqw2PQ9Z1+pgir3b7QYt2o6Y6ajJhs5GQ=";
+  };
+
+  propagatedBuildInputs = [ pyyaml ] ++ lib.optionals isPy27 [ enum34 pathlib ] ;
+
+  meta = with lib; {
+    description = "Confuse is a 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..6c92ac025d8d
--- /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.2.8";
+
+  src = fetchPypi {
+    pname = "connect_box";
+    inherit version;
+    sha256 = "1lvz7g2f0a9ifnjczmbavn105miirdgyayr4sixhzgdgadcdhz3l";
+  };
+
+  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/connexion/default.nix b/nixpkgs/pkgs/development/python-modules/connexion/default.nix
new file mode 100644
index 000000000000..6b212be3bb7b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/connexion/default.nix
@@ -0,0 +1,94 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, isPy3k
+, glibcLocales
+, lib
+, pythonOlder
+
+, aiohttp
+, aiohttp-swagger
+, aiohttp-jinja2
+, clickclick
+, decorator
+, flake8
+, flask
+, gevent
+, inflection
+, jsonschema
+, mock
+, openapi-spec-validator
+, pathlib
+, pytest
+, pytest-aiohttp
+, pytestcov
+, pyyaml
+, requests
+, six
+, swagger-ui-bundle
+, testfixtures
+, typing
+, ujson
+}:
+
+buildPythonPackage rec {
+  pname = "connexion";
+  version = "2.4.0";
+
+  # we're fetching from GitHub because tests weren't distributed on PyPi
+  src = fetchFromGitHub {
+    owner = "zalando";
+    repo = pname;
+    rev = version;
+    sha256 = "1b9q027wrks0afl7l3a1wxymz3aick26b9fq2m07pc5wb9np0vvg";
+  };
+
+  checkInputs = [
+    decorator
+    mock
+    pytest
+    pytestcov
+    testfixtures
+    flask
+    swagger-ui-bundle
+  ]
+  ++ lib.optionals isPy3k [ aiohttp aiohttp-jinja2 aiohttp-swagger ujson pytest-aiohttp ]
+  ++ lib.optional (pythonOlder "3.7") glibcLocales
+  ;
+  propagatedBuildInputs = [
+    clickclick
+    jsonschema
+    pyyaml
+    requests
+    six
+    inflection
+    openapi-spec-validator
+    swagger-ui-bundle
+    flask
+  ]
+  ++ lib.optional (pythonOlder "3.4") pathlib
+  ++ lib.optional (pythonOlder "3.6") typing
+  ++ lib.optionals isPy3k [ aiohttp aiohttp-jinja2 aiohttp-swagger ujson ]
+  ;
+
+  preConfigure = lib.optional (pythonOlder "3.7") ''
+    export LANG=en_US.UTF-8
+  '';
+
+  postPatch = ''
+    substituteInPlace setup.py --replace "'aiohttp>=2.3.10,<3.5.2'" "'aiohttp>=2.3.10'"
+  '';
+
+  checkPhase = if isPy3k then ''
+    pytest -k "not test_app_get_root_path and \
+               not test_verify_oauth_scopes_remote and \
+               not test_verify_oauth_scopes_local and \
+               not test_run_with_aiohttp_not_installed"''
+  else "pytest --ignore=tests/aiohttp";
+
+  meta = with lib; {
+    description = "Swagger/OpenAPI First framework on top of Flask";
+    homepage = "https://github.com/zalando/connexion/";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ elohmeier ];
+  };
+}
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..3940686f18c7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/consonance/default.nix
@@ -0,0 +1,29 @@
+{ buildPythonPackage, lib, fetchFromGitHub, pytest, dissononce, python-axolotl-curve25519
+, transitions, protobuf, nose
+}:
+
+buildPythonPackage rec {
+  pname = "consonance";
+  version = "0.1.3";
+
+  src = fetchFromGitHub {
+    owner = "tgalal";
+    repo = "consonance";
+    rev = version;
+    sha256 = "1ifs0fq6i41rdna1kszv5sf87qbqx1mn98ffyx4xhw4i9r2grrjv";
+  };
+
+  checkInputs = [ nose ];
+  checkPhase = ''
+    # skipping online test as it requires network with uplink
+    nosetests tests/test_handshakes_offline.py
+  '';
+
+  propagatedBuildInputs = [ dissononce python-axolotl-curve25519 transitions protobuf ];
+
+  meta = with lib; {
+    homepage = "https://pypi.org/project/consonance/";
+    license = licenses.gpl3;
+    description = "WhatsApp's handshake implementation using Noise Protocol";
+  };
+}
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..189573699b91
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/constantly/default.nix
@@ -0,0 +1,18 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi
+}:
+buildPythonPackage rec {
+  pname = "constantly";
+  version = "15.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0dgwdla5kfpqz83hfril716inm41hgn9skxskvi77605jbmp4qsq";
+  };
+
+  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..8d0c83ca9e8e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/construct/default.nix
@@ -0,0 +1,31 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub, pythonOlder
+, six, pytestCheckHook, pytest-benchmark, numpy, arrow, ruamel_yaml
+}:
+
+buildPythonPackage rec {
+  pname   = "construct";
+  version = "2.10.56";
+
+  disabled = pythonOlder "3.6";
+
+  # no tests in PyPI tarball
+  src = fetchFromGitHub {
+    owner  = pname;
+    repo   = pname;
+    rev    = "v${version}";
+    sha256 = "1j4mqwyxkbdcsnnk5bbdcljv855w4fglaqc94q1xdzm8kgjxk4mr";
+  };
+
+  checkInputs = [ pytestCheckHook pytest-benchmark numpy arrow ruamel_yaml ];
+
+  disabledTests = lib.optionals stdenv.isDarwin [ "test_multiprocessing" ];
+
+  pytestFlagsArray = [ "--benchmark-disable" ];
+
+  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..3978b14484ac
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/consul/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv, 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/contexter/default.nix b/nixpkgs/pkgs/development/python-modules/contexter/default.nix
new file mode 100644
index 000000000000..d8b74d4fedba
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/contexter/default.nix
@@ -0,0 +1,14 @@
+{ lib, stdenv, 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..38d9fb696e28
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/contextlib2/default.nix
@@ -0,0 +1,23 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, unittest2
+}:
+
+buildPythonPackage rec {
+  pname = "contextlib2";
+  version = "0.6.0.post1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "01f490098c18b19d2bd5bb5dc445b2054d2fa97f09a4280ba2c5f3c394c8162e";
+  };
+
+  checkInputs = [ unittest2 ];
+
+  meta = {
+    description = "Backports and enhancements for the contextlib module";
+    homepage = "https://contextlib2.readthedocs.org/";
+    license = lib.licenses.psfl;
+  };
+}
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..f28923002f70
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/convertdate/default.nix
@@ -0,0 +1,23 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub, pymeeus, pytz }:
+
+buildPythonPackage rec {
+  pname = "convertdate";
+  version = "2.2.1";
+
+  # Tests are not available in the PyPI tarball so use GitHub instead.
+  src = fetchFromGitHub {
+    owner = "fitnr";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1xgi7x9b9kxm0q51bqnmwdm5lp8vwhx5yk4d1b23r37spz9dbhw5";
+  };
+
+  propagatedBuildInputs = [ pymeeus pytz ];
+
+  meta = with lib; {
+    homepage = "https://github.com/fitnr/convertdate";
+    description = "Utils for converting between date formats and calculating holidays";
+    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..f9a4fe982082
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cookiecutter/default.nix
@@ -0,0 +1,35 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, isPyPy
+, pytest, pytestcov, pytest-mock, freezegun
+, jinja2, future, binaryornot, click, whichcraft, poyo, jinja2_time, requests
+, python-slugify }:
+
+buildPythonPackage rec {
+  pname = "cookiecutter";
+  version = "1.7.2";
+
+  # not sure why this is broken
+  disabled = isPyPy;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "efb6b2d4780feda8908a873e38f0e61778c23f6a2ea58215723bcceb5b515dac";
+  };
+
+  checkInputs = [ pytest pytestcov pytest-mock freezegun ];
+  propagatedBuildInputs = [
+    jinja2 future binaryornot click whichcraft poyo jinja2_time requests python-slugify
+  ];
+
+  # 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..59d2214f758e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cookies/default.nix
@@ -0,0 +1,19 @@
+{ lib, stdenv, 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/coreapi/default.nix b/nixpkgs/pkgs/development/python-modules/coreapi/default.nix
new file mode 100644
index 000000000000..8ac69a457396
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/coreapi/default.nix
@@ -0,0 +1,44 @@
+{
+  lib, stdenv,
+  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; [ ivegotasthma ];
+  };
+}
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..73167dea8a7d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/coreschema/default.nix
@@ -0,0 +1,34 @@
+{
+  lib, stdenv,
+  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; [ ivegotasthma ];
+  };
+}
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..10c559201931
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cornice/default.nix
@@ -0,0 +1,31 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, pyramid
+, simplejson
+, six
+, venusian
+}:
+
+buildPythonPackage rec {
+  pname = "cornice";
+  version = "5.0.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f971831e90343374b21c0c97d523e23eb09cec41a2a8fc2e85bb5c2585348576";
+  };
+
+  propagatedBuildInputs = [ pyramid simplejson six venusian ];
+
+  # tests not packaged with pypi release
+  doCheck = false;
+
+  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/cot/default.nix b/nixpkgs/pkgs/development/python-modules/cot/default.nix
new file mode 100644
index 000000000000..a6de8321dc0c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cot/default.nix
@@ -0,0 +1,57 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, pythonOlder, isPy3k
+, argcomplete, colorlog, pyvmomi, requests, verboselogs
+, psutil, pyopenssl, setuptools
+, mock, pytest, pytest-mock, pytestCheckHook, qemu
+}:
+
+buildPythonPackage rec {
+  pname = "cot";
+  version = "2.2.1";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f4b3553415f90daac656f89d3e82e79b3d751793239bb173a683b4cc0ceb2635";
+  };
+
+  propagatedBuildInputs = [ colorlog pyvmomi requests verboselogs pyopenssl setuptools ]
+  ++ lib.optional (pythonOlder "3.3") psutil;
+
+  checkInputs = [ mock pytestCheckHook pytest-mock qemu ];
+
+  # 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
+  disabledTests = [
+    "HelperGenericTest"
+    "TestCOTAddDisk"
+    "TestCOTAddFile"
+    "TestCOTEditHardware"
+    "TestCOTEditProduct"
+    "TestCOTEditProperties"
+    "TestCOTInjectConfig"
+    "TestISO"
+    "TestOVFAPI"
+    "TestQCOW2"
+    "TestRAW"
+    "TestVMDKConversion"
+  ] ++ lib.optionals stdenv.isDarwin [
+    "test_serial_fixup_invalid_host"
+  ];
+
+  # argparse is part of the standardlib
+  prePatch = ''
+    substituteInPlace setup.py --replace "'argparse'," ""
+  '';
+
+  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..44461a8ca9fb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cov-core/default.nix
@@ -0,0 +1,17 @@
+{ lib, stdenv, 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..8823435e2f8b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/coverage/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, mock
+}:
+
+buildPythonPackage rec {
+  pname = "coverage";
+  version = "5.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "280baa8ec489c4f542f8940f9c4c2181f0306a8ee1a54eceba071a449fb870a0";
+  };
+
+  # No tests in archive
+  doCheck = false;
+  checkInputs = [ mock ];
+
+  meta = {
+    description = "Code coverage measurement for python";
+    homepage = "http://nedbatchelder.com/code/coverage/";
+    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..55032864c3f5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/coveralls/default.nix
@@ -0,0 +1,63 @@
+{ buildPythonPackage
+, lib
+, fetchPypi
+, isPy27
+, mock
+, pytest
+, pytestrunner
+, sh
+, coverage
+, docopt
+, requests
+, urllib3
+, git
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "coveralls";
+  version = "2.2.0";
+  disabled = isPy27;
+
+  # wanted by tests
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b990ba1f7bc4288e63340be0433698c1efe8217f78c689d254c2540af3d38617";
+  };
+
+  checkInputs = [
+    mock
+    sh
+    pytest
+    git
+  ];
+
+  buildInputs = [
+    pytestrunner
+  ];
+
+  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/cozy/default.nix b/nixpkgs/pkgs/development/python-modules/cozy/default.nix
new file mode 100644
index 000000000000..39f2d1227e7c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cozy/default.nix
@@ -0,0 +1,41 @@
+{ buildPythonPackage, isPy3k, fetchFromGitHub, lib,
+  z3, ply, python-igraph, oset, ordered-set, dictionaries }:
+
+buildPythonPackage {
+  pname = "cozy";
+  version = "2.0a1";
+  disabled = !isPy3k;
+
+  propagatedBuildInputs = [
+    z3 ply python-igraph oset ordered-set dictionaries
+  ];
+
+  src = fetchFromGitHub {
+    owner = "CozySynthesizer";
+    repo = "cozy";
+    rev = "f553e9b";
+    sha256 = "1jhr5gzihj8dkg0yc5dmi081v2isxharl0ph7v2grqj0bwqzl40j";
+  };
+
+  # Yoink the Z3 dependency name, because our Z3 package doesn't provide it.
+  postPatch = ''
+    sed -i -e '/z3-solver/d' -e 's/^dictionaries.*$/dictionaries/' requirements.txt
+  '';
+
+  # Tests are not correctly set up in the source tree.
+  doCheck = false;
+  pythonImportsCheck = [ "cozy" ];
+
+  # There is some first-time-run codegen that we will force to happen.
+  postInstall = ''
+    $out/bin/cozy --help
+  '';
+
+
+  meta = {
+    description = "The collection synthesizer";
+    homepage = "https://cozy.uwplse.org/";
+    license = lib.licenses.asl20;
+    maintainers = [ lib.maintainers.MostAwesomeDude ];
+  };
+}
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..b51499de449c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cppheaderparser/default.nix
@@ -0,0 +1,26 @@
+{ buildPythonPackage
+, fetchPypi
+, ply
+, lib, stdenv
+}:
+
+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..fffa91744248
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cppy/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "cppy";
+  version = "1.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "4eda6f1952054a270f32dc11df7c5e24b259a09fddf7bfaa5f33df9fb4a29642";
+  };
+
+  # Headers-only library, no tests
+  doCheck = false;
+
+  # Not supported
+  disabled = !isPy3k;
+
+  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..66f173106e49
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cpyparsing/default.nix
@@ -0,0 +1,24 @@
+{ lib, buildPythonPackage, fetchFromGitHub, cython, python }:
+
+buildPythonPackage rec {
+  pname = "cpyparsing";
+  version = "2.4.5.0.1.1";
+
+  src = fetchFromGitHub {
+    owner = "evhub";
+    repo = pname;
+    rev = "aa8ee45daec5c55328446bad7202ab8f799ab0ce"; # No tags on repo
+    sha256 = "1mxa5q41cb0k4lkibs0d4lzh1w6kmhhdrsm0w0r1m3s80m05ffmw";
+  };
+
+  nativeBuildInputs = [ cython ];
+
+  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/crashtest/default.nix b/nixpkgs/pkgs/development/python-modules/crashtest/default.nix
new file mode 100644
index 000000000000..9981b56f2c09
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/crashtest/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, fetchFromGitHub, fetchPypi, pythonAtLeast, pytest }:
+
+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..37e49210009a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/crate/default.nix
@@ -0,0 +1,37 @@
+{ lib, stdenv
+, fetchPypi
+, buildPythonPackage
+, urllib3
+, geojson
+, isPy3k
+, sqlalchemy
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "crate";
+  version = "0.26.0";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "6f650c2efe250b89bf35f8fe3211eb37ebc8d76f7a9c09bd73db3076708fa2fc";
+  };
+
+  propagatedBuildInputs = [
+    urllib3
+    sqlalchemy
+    geojson
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  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..c93bf71687fb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/crayons/default.nix
@@ -0,0 +1,19 @@
+{ lib, stdenv, 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..1e3c9cbbf4ff
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/crc16/default.nix
@@ -0,0 +1,18 @@
+{ lib, stdenv, 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..dd2c9059ed5f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/crc32c/default.nix
@@ -0,0 +1,20 @@
+{ lib, buildPythonPackage, fetchFromGitHub }:
+
+buildPythonPackage rec {
+  version = "2.0.1";
+  pname = "crc32c";
+
+  src = fetchFromGitHub {
+    owner = "ICRAR";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0vyac7pchh083h5qdjwhhacfq77frkrq1bjzsn51qv1vwcdrpnrf";
+  };
+
+  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..8dc038012852
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/crccheck/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, isPy3k
+, nose }:
+
+let
+  pname = "crccheck";
+  version = "1.0";
+in buildPythonPackage {
+  inherit pname version;
+
+  checkInputs = [ nose ];
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1ay9lgy80j7lklm07iw2wq7giwnv9fbv50mncblqlc39y322vi0p";
+  };
+
+  disabled = !isPy3k;
+
+  meta = with lib; {
+    description = "Python library for CRCs and checksums";
+    homepage = "https://sourceforge.net/projects/crccheck/";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ etu ];
+    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..488b723d89fd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/crcmod/default.nix
@@ -0,0 +1,17 @@
+{ lib, stdenv, 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..ca5e1fe334a0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/credstash/default.nix
@@ -0,0 +1,38 @@
+{ lib, stdenv, 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/croniter/default.nix b/nixpkgs/pkgs/development/python-modules/croniter/default.nix
new file mode 100644
index 000000000000..308070355790
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/croniter/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python-dateutil
+, pytest
+, pytz
+, natsort
+, tzlocal
+}:
+
+buildPythonPackage rec {
+  pname = "croniter";
+  version = "0.3.37";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "12ced475dfc107bf7c6c1440af031f34be14cd97bbbfaf0f62221a9c11e86404";
+  };
+
+  propagatedBuildInputs = [
+    python-dateutil
+    natsort
+  ];
+
+  checkInputs = [
+    pytest
+    pytz
+    tzlocal
+  ];
+
+  checkPhase = ''
+    pytest src/croniter
+  '';
+
+  meta = with lib; {
+    description = "croniter provides iteration for datetime object with cron like format";
+    homepage = "https://github.com/kiorky/croniter";
+    license = licenses.mit;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..dc97e96e4f5d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cryptacular/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, isPy27, pythonAtLeast
+, coverage, nose, pbkdf2 }:
+
+buildPythonPackage rec {
+  pname = "cryptacular";
+  version = "1.5.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "fb4d48716e88e4d050255ff0f065f6d437caa358ceef16ba5840c95cece224f9";
+  };
+
+  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/3.3.nix b/nixpkgs/pkgs/development/python-modules/cryptography/3.3.nix
new file mode 100644
index 000000000000..b6972e6d56bb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cryptography/3.3.nix
@@ -0,0 +1,83 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, isPy27
+, ipaddress
+, openssl
+, cryptography_vectors
+, darwin
+, packaging
+, six
+, pythonOlder
+, isPyPy
+, cffi
+, pytest
+, pretend
+, iso8601
+, pytz
+, hypothesis
+, enum34
+}:
+
+buildPythonPackage rec {
+  pname = "cryptography";
+  version = "3.3.1"; # Also update the hash in vectors-3.3.nix
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1ribd1vxq9wwz564mg60dzcy699gng54admihjjkgs9dx95pw5vy";
+  };
+
+  patches = [ ./cryptography-py27-warning.patch ];
+
+  outputs = [ "out" "dev" ];
+
+  nativeBuildInputs = lib.optionals (!isPyPy) [
+    cffi
+  ];
+
+  buildInputs = [ openssl ]
+             ++ lib.optional stdenv.isDarwin darwin.apple_sdk.frameworks.Security;
+  propagatedBuildInputs = [
+    packaging
+    six
+  ] ++ lib.optionals (!isPyPy) [
+    cffi
+  ] ++ lib.optionals isPy27 [
+    ipaddress enum34
+  ];
+
+  checkInputs = [
+    cryptography_vectors
+    hypothesis
+    iso8601
+    pretend
+    pytest
+    pytz
+  ];
+
+  checkPhase = ''
+    py.test --disable-pytest-warnings tests
+  '';
+
+  # IOKit's dependencies are inconsistent between OSX versions, so this is the best we
+  # can do until nix 1.11's release
+  __impureHostDeps = [ "/usr/lib" ];
+
+  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; [ primeos ];
+  };
+}
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..ad402efd7593
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cryptography/default.nix
@@ -0,0 +1,81 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, isPy27
+, ipaddress
+, openssl
+, cryptography_vectors
+, darwin
+, packaging
+, six
+, pythonOlder
+, isPyPy
+, cffi
+, pytest
+, pretend
+, iso8601
+, pytz
+, hypothesis
+, enum34
+}:
+
+buildPythonPackage rec {
+  pname = "cryptography";
+  version = "3.3.1"; # Also update the hash in vectors.nix
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1ribd1vxq9wwz564mg60dzcy699gng54admihjjkgs9dx95pw5vy";
+  };
+
+  outputs = [ "out" "dev" ];
+
+  nativeBuildInputs = lib.optionals (!isPyPy) [
+    cffi
+  ];
+
+  buildInputs = [ openssl ]
+             ++ lib.optional stdenv.isDarwin darwin.apple_sdk.frameworks.Security;
+  propagatedBuildInputs = [
+    packaging
+    six
+  ] ++ lib.optionals (!isPyPy) [
+    cffi
+  ] ++ lib.optionals isPy27 [
+    ipaddress enum34
+  ];
+
+  checkInputs = [
+    cryptography_vectors
+    hypothesis
+    iso8601
+    pretend
+    pytest
+    pytz
+  ];
+
+  checkPhase = ''
+    py.test --disable-pytest-warnings tests
+  '';
+
+  # IOKit's dependencies are inconsistent between OSX versions, so this is the best we
+  # can do until nix 1.11's release
+  __impureHostDeps = [ "/usr/lib" ];
+
+  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; [ primeos ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cryptography/vectors-3.3.nix b/nixpkgs/pkgs/development/python-modules/cryptography/vectors-3.3.nix
new file mode 100644
index 000000000000..94526c8268ef
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cryptography/vectors-3.3.nix
@@ -0,0 +1,23 @@
+{ buildPythonPackage, fetchPypi, lib, cryptography }:
+
+buildPythonPackage rec {
+  pname = "cryptography_vectors";
+  # The test vectors must have the same version as the cryptography package:
+  version = cryptography.version;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "192wix3sr678x21brav5hgc6j93l7ab1kh69p2scr3fsblq9qy03";
+  };
+
+  # No tests included
+  doCheck = false;
+
+  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; [ primeos ];
+  };
+}
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..94526c8268ef
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cryptography/vectors.nix
@@ -0,0 +1,23 @@
+{ buildPythonPackage, fetchPypi, lib, cryptography }:
+
+buildPythonPackage rec {
+  pname = "cryptography_vectors";
+  # The test vectors must have the same version as the cryptography package:
+  version = cryptography.version;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "192wix3sr678x21brav5hgc6j93l7ab1kh69p2scr3fsblq9qy03";
+  };
+
+  # No tests included
+  doCheck = false;
+
+  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; [ primeos ];
+  };
+}
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..936db1081b6a
--- /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.1.12";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "crytic";
+    repo = "crytic-compile";
+    rev = version;
+    sha256 = "1q75n84yxv2cb6x7gqyk3vcwkxpq7pni30wgz3d1bk6pmi2pqgw6";
+  };
+
+  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.agpl3;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..7791c2b9a237
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/css-parser/default.nix
@@ -0,0 +1,22 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "css-parser";
+  version = "1.0.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "4ed448a8a5622edb1d30d616bbc4bd3d30f11be922343d7a92d7e418e324af2e";
+  };
+
+  # Test suite not included in tarball yet
+  # See https://github.com/ebook-utils/css-parser/pull/2
+  doCheck = false;
+
+  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..a6f6f3c956ae
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cssmin/default.nix
@@ -0,0 +1,20 @@
+{ lib, stdenv, 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..fe13fa9582ea
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cssselect/default.nix
@@ -0,0 +1,17 @@
+{ lib, stdenv, 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..eadc3eb32b1f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cssselect2/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, tinycss2
+, pytest
+, pytestrunner
+, pytestcov
+, pytest-flake8
+, pytest-isort
+}:
+
+buildPythonPackage rec {
+  pname = "cssselect2";
+  version = "0.4.1";
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "93fbb9af860e95dd40bf18c3b2b6ed99189a07c0f29ba76f9c5be71344664ec8";
+  };
+
+  propagatedBuildInputs = [ tinycss2 ];
+
+  checkInputs = [ pytest pytestrunner pytestcov pytest-flake8 pytest-isort ];
+
+  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..ea3ac6236e90
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cssutils/default.nix
@@ -0,0 +1,22 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, mock }:
+
+buildPythonPackage rec {
+  pname = "cssutils";
+  version = "1.0.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a2fcf06467553038e98fea9cfe36af2bf14063eb147a70958cfcaa8f5786acaf";
+  };
+
+  buildInputs = [ mock ];
+
+  # couple of failing tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A Python package to parse and build CSS";
+    homepage = "http://cthedot.de/cssutils/";
+    license = licenses.lgpl3Plus;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/csvs-to-sqlite/default.nix b/nixpkgs/pkgs/development/python-modules/csvs-to-sqlite/default.nix
new file mode 100644
index 000000000000..4105d981386d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/csvs-to-sqlite/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, isPy3k
+, pytestrunner
+, click
+, dateparser
+, pandas
+, py-lru-cache
+, six
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "csvs-to-sqlite";
+  version = "1.2";
+  disabled = !isPy3k;
+
+  src = fetchFromGitHub {
+    owner = "simonw";
+    repo = pname;
+    rev = version;
+    sha256 = "0p99cg76d3s7jxvigh5ad04dzhmr6g62qzzh4i6h7x9aiyvdhvk4";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace pandas~=0.25.0 pandas
+  '';
+
+  propagatedBuildInputs = [
+    click
+    dateparser
+    pandas
+    py-lru-cache
+    six
+  ];
+
+  checkInputs = [
+    pytest
+  ];
+
+  checkPhase = ''
+    pytest
+  '';
+
+  meta = with lib; {
+    description = "Convert CSV files into a SQLite database";
+    homepage = "https://github.com/simonw/csvs-to-sqlite";
+    license = licenses.asl20;
+    maintainers = [ maintainers.costrouc ];
+  };
+
+}
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..410248b0193b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/csvw/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, isPy27
+, attrs
+, isodate
+, dateutil
+, rfc3986
+, uritemplate
+, mock
+, pytestCheckHook
+, pytest-mock
+}:
+
+buildPythonPackage rec {
+  pname = "csvw";
+  version = "1.10.0";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "cldf";
+    repo = "csvw";
+    rev = "v${version}";
+    sha256 = "0cvfzfi1a2m1xqpm34mwp9r3bhgsnfz4pmslvgn81i42n5grbnis";
+  };
+
+  patchPhase = ''
+    substituteInPlace setup.cfg --replace "--cov" ""
+  '';
+
+  propagatedBuildInputs = [
+    attrs
+    isodate
+    dateutil
+    rfc3986
+    uritemplate
+  ];
+
+  checkInputs = [
+    mock
+    pytestCheckHook
+    pytest-mock
+  ];
+
+  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..789a58bb6a78
--- /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 = "3.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0kb8dq458sflwl2agb2v9hp04qwygslrhdps819vq27wc44jabxw";
+  };
+
+  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..4c2db1f52146
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cufflinks/default.nix
@@ -0,0 +1,48 @@
+{ lib, buildPythonPackage, fetchPypi, fetchpatch
+, 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..09685d392d6a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cupy/default.nix
@@ -0,0 +1,50 @@
+{ lib, stdenv, buildPythonPackage
+, fetchPypi, isPy3k, linuxPackages
+, fastrlock, numpy, six, wheel, pytest, mock, setuptools
+, cudatoolkit, cudnn, nccl
+}:
+
+buildPythonPackage rec {
+  pname = "cupy";
+  version = "8.3.0";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "db699fddfde7806445908cf6454c6f4985e7a9563b40405ddf97845d808c5f12";
+  };
+
+  checkInputs = [
+    pytest
+    mock
+  ];
+
+  preConfigure = ''
+      export CUDA_PATH=${cudatoolkit}
+  '';
+
+  propagatedBuildInputs = [
+    cudatoolkit
+    cudnn
+    linuxPackages.nvidia_x11
+    nccl
+    fastrlock
+    numpy
+    six
+    setuptools
+    wheel
+  ];
+
+  # In python3, test was failed...
+  doCheck = !isPy3k;
+
+  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 ];
+  };
+}
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..31875abd1e83
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/curio/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+, pytestCheckHook
+, sphinx
+, stdenv
+}:
+
+buildPythonPackage rec {
+  pname = "curio";
+  version = "1.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "57edce81c837f3c2cf42fbb346dee26e537d1659e6605269fb13bd179e068744";
+  };
+
+  disabled = !isPy3k;
+
+  checkInputs = [ pytestCheckHook sphinx ];
+
+  __darwinAllowLocalNetworking = true;
+
+  disabledTests = [
+     "test_aside_basic" # times 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
+   ];
+
+  meta = with lib; {
+    homepage = "https://github.com/dabeaz/curio";
+    description = "Library for performing concurrent I/O with coroutines in Python 3";
+    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..4c4c7dbe231a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/curtsies/default.nix
@@ -0,0 +1,34 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, fetchpatch, pythonOlder, blessings, mock, nose, pyte, wcwidth, typing }:
+
+buildPythonPackage rec {
+  pname = "curtsies";
+  version = "0.3.0";
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "89c802ec051d01dec6fc983e9856a3706e4ea8265d2940b1f6d504a9e26ed3a9";
+  };
+
+  patches = [
+    # Fix dependency on typing. Remove with the next release
+    (fetchpatch {
+      url = "https://github.com/bpython/curtsies/commit/217b4f83e954837f8adc4c549c1f2f9f2bb272a7.patch";
+      sha256 = "1d3zwx9c7i0drb4nvydalm9mr83jrvdm75ffgisri89h337hiffs";
+    })
+  ];
+
+  propagatedBuildInputs = [ blessings wcwidth ]
+    ++ lib.optionals (pythonOlder "3.5") [ typing ];
+
+  checkInputs = [ mock pyte nose ];
+
+  checkPhase = ''
+    nosetests tests
+  '';
+
+  meta = with lib; {
+    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..e42f4021a6f2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/curve25519-donna/default.nix
@@ -0,0 +1,18 @@
+{ lib, stdenv, 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; [ elseym ];
+  };
+}
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..bafa75072f7a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cvxopt/default.nix
@@ -0,0 +1,73 @@
+{ stdenv
+, 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.2.5";
+
+  disabled = isPyPy; # hangs at [translation:info]
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0widrfxr0x0cyg72ibkv7fdzkvmf5mllchq1x4fs2a36plv8rv4l";
+  };
+
+  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..58d06e60d39c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cvxpy/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, pythonOlder
+, buildPythonPackage
+, fetchPypi
+, cvxopt
+, ecos
+, multiprocess
+, numpy
+, osqp
+, scipy
+, scs
+, six
+  # Check inputs
+, pytestCheckHook
+, nose
+}:
+
+buildPythonPackage rec {
+  pname = "cvxpy";
+  version = "1.1.7";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "330eb76e8369c360b68d9231c6eb350848e373b5952134f9bfebaed1a4c4211f";
+  };
+
+  propagatedBuildInputs = [
+    cvxopt
+    ecos
+    multiprocess
+    numpy
+    osqp
+    scipy
+    scs
+    six
+  ];
+
+  checkInputs = [ pytestCheckHook nose ];
+  pytestFlagsArray = [ "./cvxpy" ];
+  # Disable the slowest benchmarking tests, cuts test time in half
+  disabledTests = [
+    "test_tv_inpainting"
+    "test_diffcp_sdp_example"
+  ];
+
+  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/cx_freeze/default.nix b/nixpkgs/pkgs/development/python-modules/cx_freeze/default.nix
new file mode 100644
index 000000000000..14a585617c64
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cx_freeze/default.nix
@@ -0,0 +1,32 @@
+{ lib, stdenv, buildPythonPackage, pythonOlder, fetchPypi, ncurses, importlib-metadata }:
+
+buildPythonPackage rec {
+  pname = "cx_Freeze";
+  version = "6.4.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "043513b85e33038e38cc0571cea1f3ee8044ec083891c9a5dad1d436894424ea";
+  };
+
+  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; {
+    description = "A set of scripts and modules for freezing Python scripts into executables";
+    homepage = "http://cx-freeze.sourceforge.net/";
+    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..89946964544e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cx_oracle/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, odpic }:
+
+buildPythonPackage rec {
+  pname = "cx_Oracle";
+  version = "8.1.0";
+
+  buildInputs = [ odpic ];
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "e1698c5522ee1355e552b30bfa0a58e6e772475b882c5d69d158bd7e6aed45de";
+  };
+
+  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/cycler/default.nix b/nixpkgs/pkgs/development/python-modules/cycler/default.nix
new file mode 100644
index 000000000000..643a57e259ff
--- /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.10.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "cd7b2d1018258d7247a71425e9f26463dfb444d411c39569972f4ce586b0c9d8";
+  };
+
+  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/cymem/default.nix b/nixpkgs/pkgs/development/python-modules/cymem/default.nix
new file mode 100644
index 000000000000..d805ba5de1f9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cymem/default.nix
@@ -0,0 +1,39 @@
+{ lib, stdenv
+, 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; [ sdll ];
+    };
+}
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..8a0adb3d6c96
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cypari2/default.nix
@@ -0,0 +1,55 @@
+{ lib, stdenv
+, buildPythonPackage
+, python
+, 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.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "df1ef62e771ec36e5a456f5fc8b51bc6745b70f0efdd0c7a30c3f0b5f1fb93db";
+  };
+
+  # 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.gpl2;
+    maintainers = teams.sage.members;
+    homepage = "https://github.com/defeo/cypari2";
+  };
+}
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..736afab4257c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cysignals/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, cython
+, pariSupport ? true, pari # for interfacing with the PARI/GP signal handler
+}:
+
+assert pariSupport -> pari != null;
+
+buildPythonPackage rec {
+  pname = "cysignals";
+  version = "1.10.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1ckxzch3wk5cg80mppky5jib5z4fzslny3001r5zg4ar1ixbc1w1";
+  };
+
+  # 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
+  ];
+
+  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..0e72ecaa8252
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cytoolz/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPyPy
+, nose
+, toolz
+, python
+, fetchpatch
+, isPy27
+}:
+
+buildPythonPackage rec {
+  pname = "cytoolz";
+  version = "0.11.0";
+  disabled = isPy27 || isPyPy;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "c64f3590c3eb40e1548f0d3c6b2ccde70493d0b8dc6cc7f9f3fec0bb3dcd4222";
+  };
+
+  checkInputs = [ nose ];
+  propagatedBuildInputs = [ toolz ];
+
+  # Failing test https://github.com/pytoolz/cytoolz/issues/122
+  checkPhase = ''
+    NOSE_EXCLUDE=test_introspect_builtin_modules nosetests -v $out/${python.sitePackages}
+  '';
+
+  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/daemonize/default.nix b/nixpkgs/pkgs/development/python-modules/daemonize/default.nix
new file mode 100644
index 000000000000..30d4f1bd7146
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/daemonize/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv
+, 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/daphne/default.nix b/nixpkgs/pkgs/development/python-modules/daphne/default.nix
new file mode 100644
index 000000000000..fc48f9150124
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/daphne/default.nix
@@ -0,0 +1,35 @@
+{ lib, stdenv, buildPythonPackage, isPy3k, fetchFromGitHub
+, asgiref, autobahn, twisted, pytestrunner
+, hypothesis, pytest, pytest-asyncio, service-identity, pyopenssl
+}:
+buildPythonPackage rec {
+  pname = "daphne";
+  version = "3.0.1";
+
+  disabled = !isPy3k;
+
+  src = fetchFromGitHub {
+    owner = "django";
+    repo = pname;
+    rev = version;
+    sha256 = "1bkxhzvaqwz760c11nhaiwvsq1d1csmk5dz2a1j1ynypjprhvhsk";
+  };
+
+  nativeBuildInputs = [ pytestrunner ];
+
+  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/darcsver/default.nix b/nixpkgs/pkgs/development/python-modules/darcsver/default.nix
new file mode 100644
index 000000000000..6484d84253b5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/darcsver/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, isPy3k, mock }:
+
+buildPythonPackage rec {
+  pname = "darcsver";
+  version = "1.7.4";
+
+  disabled = isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1yb1c3jxqvy4r3qiwvnb86qi5plw6018h15r3yk5ji3nk54qdcb6";
+  };
+
+  buildInputs = [ mock ];
+
+  # Note: We don't actually need to provide Darcs as a build input.
+  # Darcsver will DTRT when Darcs isn't available.  See news.gmane.org
+  # http://thread.gmane.org/gmane.comp.file-systems.tahoe.devel/3200 for a
+  # discussion.
+
+  # AttributeError: 'module' object has no attribute 'test_darcsver'
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Darcsver, generate a version number from Darcs history";
+    homepage = "https://pypi.python.org/pypi/darcsver";
+    license = "BSD-style";
+  };
+}
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..9d5e650207bc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dash-core-components/default.nix
@@ -0,0 +1,24 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "dash_core_components";
+  version = "1.13.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f92025b12931539cdda2173f2b4cd077119cbabbf3ddf62333f6302fd0d8a3ac";
+  };
+
+  # 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..69eb4de2a237
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dash-html-components/default.nix
@@ -0,0 +1,24 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "dash_html_components";
+  version = "1.1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "2c662e640528c890aaa0fa23d48e51c4d13ce69a97841d856ddcaaf2c6a47be3";
+  };
+
+  # 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..8977d49489cb
--- /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.8.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f7ab2b922f4f0850bae0e9793cec99f8a1a241e5f7f5786e367ddd9e41d2b170";
+  };
+
+  # 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..c313aea6c062
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dash-table/default.nix
@@ -0,0 +1,24 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "dash_table";
+  version = "4.11.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "3170504a8626a9676b016c5ab456ab8c1fb1ea0206dcc2eddb8c4c6589216304";
+  };
+
+  # 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..f6f00553d930
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dash/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, plotly
+, flask
+, flask-compress
+, future
+, dash-core-components
+, dash-renderer
+, dash-html-components
+, dash-table
+, pytest
+, pytest-mock
+, mock
+}:
+
+buildPythonPackage rec {
+  pname = "dash";
+  version = "1.17.0";
+
+  src = fetchFromGitHub {
+    owner = "plotly";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1fbnhpmkxavv6yirmhx7659q1y9bqynwjd1g6cscv1mfv9m59l60";
+  };
+
+  propagatedBuildInputs = [
+    plotly
+    flask
+    flask-compress
+    future
+    dash-core-components
+    dash-renderer
+    dash-html-components
+    dash-table
+  ];
+
+  checkInputs = [
+    pytest
+    pytest-mock
+    mock
+  ];
+
+  checkPhase = ''
+    pytest tests/unit/test_{configs,fingerprint,import,resources}.py \
+      tests/unit/dash/
+  '';
+
+  pythonImportsCheck = [
+    "dash"
+  ];
+
+  meta = with lib; {
+    description = "Python framework for building analytical web applications";
+    homepage = "https://dash.plot.ly/";
+    license = licenses.mit;
+    maintainers = [ 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..d2f040609d32
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dask-gateway-server/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, aiohttp
+, colorlog
+, cryptography
+, traitlets
+, go
+, isPy27
+}:
+
+buildPythonPackage rec {
+  pname = "dask-gateway-server";
+  # update dask-gateway-server lock step with dask-gateway
+  version = "0.9.0";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "82bca8a98fc1dbda9f67c8eceac59cb92abe07db6227c120a1eb1d040ea40fda";
+  };
+
+  nativeBuildInputs = [
+    go
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    colorlog
+    cryptography
+    traitlets
+  ];
+
+  preBuild = ''
+    export HOME=$(mktemp -d)
+  '';
+
+  # tests requires cluster for testing
+  doCheck = false;
+
+  pythonImportsCheck = [ "dask_gateway_server" ];
+
+  meta = with lib; {
+    description = "A multi-tenant server for securely deploying and managing multiple Dask clusters";
+    homepage = "https://gateway.dask.org/";
+    license = licenses.bsd3;
+    maintainers = [ 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..81aa8de8bcfc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dask-gateway/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, aiohttp
+, dask
+, distributed
+}:
+
+buildPythonPackage rec {
+  pname = "dask-gateway";
+  # update dask-gateway lock step with dask-gateway-server
+  version = "0.9.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "743f3b88dabe7d1503ac08aadf399eb9205df786b12c5175ea2e10c6ded7df22";
+  };
+
+  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 = [ 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..1db03b66ffb0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dask-glm/default.nix
@@ -0,0 +1,35 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, cloudpickle
+, dask
+, numpy, toolz # dask[array]
+, multipledispatch
+, scipy
+, scikitlearn
+, pytest
+}:
+
+buildPythonPackage rec {
+  version = "0.2.0";
+  pname = "dask-glm";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "58b86cebf04fe5b9e58092e1c467e32e60d01e11b71fdc628baaa9fc6d1adee5";
+  };
+
+  checkInputs = [ pytest ];
+  propagatedBuildInputs = [ cloudpickle dask numpy toolz multipledispatch scipy scikitlearn ];
+
+  checkPhase = ''
+    py.test dask_glm
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/dask/dask-glm/";
+    description = "Generalized Linear Models with Dask";
+    license = licenses.bsd3;
+    maintainers = [ 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..eac503c2f855
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dask-image/default.nix
@@ -0,0 +1,48 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, dask
+, numpy, toolz # dask[array]
+, scipy
+, pims
+, pytest
+, pytest-flake8
+, scikitimage
+}:
+
+buildPythonPackage rec {
+  version = "0.4.0";
+  pname = "dask-image";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a6873a39af21b856a4eb7efee6838e6897b1399f21ab9e65403e69eb62f96c2d";
+  };
+
+  nativeBuildInputs = [ pytest-flake8 ];
+  propagatedBuildInputs = [ dask numpy toolz scipy pims ];
+  checkInputs = [
+    pytest
+    scikitimage
+  ];
+
+  # ignore errors from newer versions of flake8
+  prePatch = ''
+    substituteInPlace setup.cfg \
+      --replace "docs/conf.py,versioneer.py" \
+        "docs/conf.py,versioneer.py,dask_image/ndfilters/_utils.py"
+  '';
+
+  # scikit.external is not exported
+  checkPhase = ''
+    pytest --ignore=tests/test_dask_image/
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/dask/dask-image";
+    description = "Distributed image processing";
+    license = licenses.bsdOriginal;
+    maintainers = [ 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..be27399b71f6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dask-jobqueue/default.nix
@@ -0,0 +1,33 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, dask
+, distributed
+, docrep
+, pytest
+}:
+
+buildPythonPackage rec {
+  version = "0.7.1";
+  pname = "dask-jobqueue";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d32ddf3e3c7db29ace102037fa5f61c8db2d945176454dc316a6ffdb8bbfe88b";
+  };
+
+  checkInputs = [ pytest ];
+  propagatedBuildInputs = [ dask distributed docrep ];
+
+  # do not run entire tests suite (requires slurm, sge, etc.)
+  checkPhase = ''
+    py.test dask_jobqueue/tests/test_jobqueue_core.py
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/dask/dask-jobqueue";
+    description = "Deploy Dask on job schedulers like PBS, SLURM, and SGE";
+    license = licenses.bsd3;
+    maintainers = [ 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..4d3aa8e79a05
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dask-ml/default.nix
@@ -0,0 +1,64 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, dask
+, numpy, toolz # dask[array]
+, numba
+, pandas
+, scikitlearn
+, scipy
+, dask-glm
+, six
+, multipledispatch
+, packaging
+, pytest
+, xgboost
+, tensorflow
+, joblib
+, distributed
+}:
+
+buildPythonPackage rec {
+  version = "1.7.0";
+  pname = "dask-ml";
+  disabled = pythonOlder "3.6"; # >= 3.6
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "5f93e8560217ebbc5a2254eaf705e9cad8e1c82012567c658e26464a74fbab76";
+  };
+
+  propagatedBuildInputs = [
+    dask
+    dask-glm
+    distributed
+    multipledispatch
+    numba
+    numpy
+    packaging
+    pandas
+    scikitlearn
+    scipy
+    six
+    toolz
+  ];
+
+  # has non-standard build from source, and pypi doesn't include tests
+  doCheck = false;
+
+  # in lieu of proper tests
+  pythonImportsCheck = [
+    "dask_ml"
+    "dask_ml.naive_bayes"
+    "dask_ml.wrappers"
+    "dask_ml.utils"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/dask/dask-ml";
+    description = "Scalable Machine Learn with Dask";
+    license = licenses.bsd3;
+    maintainers = [ 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..f2d8737b38e9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dask-mpi/default.nix
@@ -0,0 +1,36 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, dask
+, distributed
+, mpi4py
+, pytest
+, requests
+}:
+
+buildPythonPackage rec {
+  version = "2.21.0";
+  pname = "dask-mpi";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "76e153fc8c58047d898970b33ede0ab1990bd4e69cc130c6627a96f11b12a1a7";
+  };
+
+  checkInputs = [ pytest requests ];
+  propagatedBuildInputs = [ dask distributed mpi4py ];
+
+  checkPhase = ''
+    py.test dask_mpi
+  '';
+
+  # hardcoded mpirun path in tests
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/dask/dask-mpi";
+    description = "Deploy Dask using mpi4py";
+    license = licenses.bsd3;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dask-xgboost/default.nix b/nixpkgs/pkgs/development/python-modules/dask-xgboost/default.nix
new file mode 100644
index 000000000000..c60f628d72eb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dask-xgboost/default.nix
@@ -0,0 +1,35 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, xgboost
+, dask
+, distributed
+, pytest
+, scikitlearn
+}:
+
+buildPythonPackage rec {
+  version = "0.1.11";
+  pname = "dask-xgboost";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "3fbe1bf4344dc74edfbe9f928c7e3e6acc26dc57cefd8da8ae56a15469c6941c";
+  };
+
+  checkInputs = [ pytest scikitlearn ];
+  propagatedBuildInputs = [ xgboost dask distributed ];
+
+  checkPhase = ''
+    py.test dask_xgboost/tests/test_core.py
+  '';
+
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/dask/dask-xgboost";
+    description = "Interactions between Dask and XGBoost";
+    license = licenses.bsd3;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..721463421440
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dask/default.nix
@@ -0,0 +1,72 @@
+{ lib
+, bokeh
+, buildPythonPackage
+, fetchFromGitHub
+, fsspec
+, pytestCheckHook
+, pythonOlder
+, cloudpickle
+, numpy
+, toolz
+, dill
+, pandas
+, partd
+}:
+
+buildPythonPackage rec {
+  pname = "dask";
+  version = "2021.01.0";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "dask";
+    repo = pname;
+    rev = version;
+    sha256 = "V2cEOzV/L1zjyQ76zlGyN9CIkq6W8y8Yab4NQi3/Ju4=";
+  };
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  dontUseSetuptoolsCheck = true;
+
+  propagatedBuildInputs = [
+    bokeh
+    cloudpickle
+    dill
+    fsspec
+    numpy
+    pandas
+    partd
+    toolz
+  ];
+
+  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()," ""
+  '';
+
+  #pytestFlagsArray = [ "-n $NIX_BUILD_CORES" ];
+
+  disabledTests = [
+    "test_argwhere_str"
+    "test_count_nonzero_str"
+    "rolling_methods"  # floating percision error ~0.1*10^8 small
+    "num_workers_config" # flaky
+    "test_2args_with_array[pandas1-darray1-ldexp]"  # flaky
+  ];
+
+  meta = {
+    description = "Minimal task scheduling abstraction";
+    homepage = "https://dask.org/";
+    changelog = "https://docs.dask.org/en/latest/changelog.html";
+    license = lib.licenses.bsd3;
+    maintainers = with lib.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..f5a7c52ef8e5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/databases/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, sqlalchemy
+, aiocontextvars
+, isPy27
+, pytest
+, asyncpg
+, aiomysql
+, aiosqlite
+}:
+
+buildPythonPackage rec {
+  pname = "databases";
+  version = "0.2.6";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "encode";
+    repo = pname;
+    rev = version;
+    sha256 = "0cdb4vln4zdmqbbcj7711b81b2l64jg1miihqcg8gpi35v404h2q";
+  };
+
+  propagatedBuildInputs = [
+    sqlalchemy
+    aiocontextvars
+  ];
+
+  checkInputs = [
+    pytest
+    asyncpg
+    aiomysql
+    aiosqlite
+  ];
+
+  # big chunk to tests depend on existing posgresql and mysql databases
+  # some tests are better than no tests
+  checkPhase = ''
+    pytest --ignore=tests/test_integration.py --ignore=tests/test_databases.py
+  '';
+
+  meta = with lib; {
+    description = "Async database support for Python";
+    homepage = "https://github.com/encode/databases";
+    license = licenses.bsd3;
+    maintainers = [ 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..30001b781d28
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/databricks-cli/default.nix
@@ -0,0 +1,41 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi
+, click
+, requests
+, tabulate
+, six
+, configparser
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "databricks-cli";
+  version = "0.14.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "bf94dc5187fa3500a31d52d7225fbc1a4699aa6e3c321223e7088eb5b5c94b62";
+  };
+
+  checkInputs = [
+    pytest
+  ];
+
+  checkPhase = "pytest tests";
+  # tests folder is missing in PyPI
+  doCheck = false;
+
+  propagatedBuildInputs = [
+    click
+    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..299fa8240340
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/databricks-connect/default.nix
@@ -0,0 +1,37 @@
+{ lib, jdk, buildPythonPackage, fetchPypi, six, py4j }:
+
+buildPythonPackage rec {
+  pname = "databricks-connect";
+  version = "7.3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "35ead50a0550e65a7d6fd78e2c8e54095b53514fba85180768a2dbcdd3f2cf0b";
+  };
+
+  sourceRoot = ".";
+
+  propagatedBuildInputs = [ py4j six jdk ];
+
+  # 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";
+    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..36430a29ef0f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dataclasses-json/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, stringcase
+, typing-inspect
+, marshmallow-enum
+}:
+
+buildPythonPackage rec {
+  pname = "dataclasses-json";
+  version = "0.5.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "56ec931959ede74b5dedf65cf20772e6a79764d20c404794cce0111c88c085ff";
+  };
+
+  propagatedBuildInputs = [
+    stringcase
+    typing-inspect
+    marshmallow-enum
+  ];
+
+  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/default.nix b/nixpkgs/pkgs/development/python-modules/dataclasses/default.nix
new file mode 100644
index 000000000000..a88995937d83
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dataclasses/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv, 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..680462352275
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/datadiff/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, nose
+}:
+
+buildPythonPackage rec {
+  pname = "datadiff";
+  version = "1.1.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "f1402701063998f6a70609789aae8dc05703f3ad0a34882f6199653654c55543";
+  };
+
+  buildInputs = [ nose ];
+
+  meta = with lib; {
+    description = "DataDiff";
+    homepage = "https://sourceforge.net/projects/datadiff/";
+    license = licenses.asl20;
+  };
+
+}
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..a8917c3965f8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/datadog/default.nix
@@ -0,0 +1,31 @@
+{ lib, buildPythonPackage, fetchPypi, pythonOlder
+, decorator, requests, simplejson, pillow, typing
+, nose, mock, pytest, freezegun }:
+
+buildPythonPackage rec {
+  pname = "datadog";
+  version = "0.39.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b0ef69a27aad0e4412c1ac3e6894fa1b5741db735515c34dfe1606d8cf30e4e5";
+  };
+
+  postPatch = ''
+    find . -name '*.pyc' -exec rm {} \;
+  '';
+
+  propagatedBuildInputs = [ decorator requests simplejson pillow ]
+    ++ lib.optionals (pythonOlder "3.5") [ typing ];
+
+  checkInputs = [ nose mock pytest freezegun ];
+  checkPhase = ''
+    pytest tests/unit
+  '';
+
+  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/datamodeldict/default.nix b/nixpkgs/pkgs/development/python-modules/datamodeldict/default.nix
new file mode 100644
index 000000000000..f3eab1d1d4e2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/datamodeldict/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, xmltodict
+}:
+
+buildPythonPackage rec {
+  version = "0.9.7";
+  pname = "DataModelDict";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b1be7573cb4401aa250fd00f2e6392543f6f2498f8e02f6313595aa220e5c99e";
+  };
+
+  propagatedBuildInputs = [ xmltodict ];
+
+  # no tests
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/usnistgov/DataModelDict/";
+    description = "Class allowing for data models equivalently represented as Python dictionaries, JSON, and XML";
+    license = licenses.mit;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..fc349cdc277b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/datasets/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, dill
+, filelock
+, multiprocess
+, numpy
+, pandas
+, pyarrow
+, requests
+, tqdm
+, xxhash
+}:
+
+buildPythonPackage rec {
+  pname = "datasets";
+  version = "1.1.2";
+
+  src = fetchFromGitHub {
+    owner = "huggingface";
+    repo = pname;
+    rev = version;
+    hash = "sha256-upXZ2rOfmjnJbDo6RMGeHv/fe10RQAf/zwDWWKdt6SA=";
+  };
+
+  propagatedBuildInputs = [
+    dill
+    filelock
+    multiprocess
+    numpy
+    pandas
+    pyarrow
+    requests
+    tqdm
+    xxhash
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py --replace '"tqdm>=4.27,<4.50.0"' '"tqdm>=4.27"'
+  '';
+
+  # 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; {
+    homepage = "https://github.com/huggingface/datasets";
+    description = "Fast, efficient, open-access datasets and evaluation metrics for natural language processing";
+    changelog = "https://github.com/huggingface/datasets/releases/tag/${version}";
+    license = licenses.asl20;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ danieldk ];
+  };
+}
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..2e0039b23179
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/datasette/default.nix
@@ -0,0 +1,106 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, aiofiles
+, asgi-csrf
+, click
+, click-default-group
+, janus
+, jinja2
+, hupper
+, mergedeep
+, pint
+, pluggy
+, python-baseconv
+, pyyaml
+, uvicorn
+, httpx
+# Check Inputs
+, pytestCheckHook
+, pytestrunner
+, pytest-asyncio
+, aiohttp
+, beautifulsoup4
+, asgiref
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "datasette";
+  version = "0.53";
+
+  src = fetchFromGitHub {
+    owner = "simonw";
+    repo = "datasette";
+    rev = version;
+    sha256 = "1rsgxkvav1qy2ia2csm1jvabd8klh3ly8719979gdlx2il1cjjkz";
+  };
+
+  nativeBuildInputs = [ pytestrunner ];
+
+  propagatedBuildInputs = [
+    aiofiles
+    asgi-csrf
+    click
+    click-default-group
+    janus
+    jinja2
+    hupper
+    mergedeep
+    pint
+    pluggy
+    python-baseconv
+    pyyaml
+    uvicorn
+    setuptools
+    httpx
+    asgiref
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    pytest-asyncio
+    aiohttp
+    beautifulsoup4
+  ];
+
+  postConfigure = ''
+    substituteInPlace setup.py \
+      --replace "click~=7.1.1" "click" \
+      --replace "click-default-group~=1.2.2" "click-default-group" \
+      --replace "hupper~=1.9" "hupper" \
+      --replace "pint~=0.9" "pint" \
+      --replace "pluggy~=0.13.0" "pluggy" \
+      --replace "uvicorn~=0.11" "uvicorn" \
+      --replace "PyYAML~=5.3" "PyYAML"
+  '';
+
+  # takes 30-180 mins to run entire test suite, not worth the cpu resources, slows down reviews
+  # with pytest-xdist, it still takes around 10mins 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 = "An instant JSON API for your SQLite databases";
+    homepage = "https://github.com/simonw/datasette";
+    license = licenses.asl20;
+    maintainers = [ 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..c49e2e30b809
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/datashader/default.nix
@@ -0,0 +1,95 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, dask
+, distributed
+, bokeh
+, toolz
+, datashape
+, numba
+, numpy
+, pandas
+, pillow
+, xarray
+, colorcet
+, param
+, pyct
+, pyyaml
+, requests
+, scikitimage
+, scipy
+, pytest
+, pytest-benchmark
+, flake8
+, nbsmoke
+, fastparquet
+, testpath
+, nbconvert
+, pytest_xdist
+}:
+
+buildPythonPackage rec {
+  pname = "datashader";
+  version = "0.11.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b1f80415f72f92ccb660aaea7b2881ddd35d07254f7c44101709d42e819d6be6";
+  };
+  patches = [ (fetchpatch {
+    # Unpins pyct==0.46 (Sep. 11, 2020).
+    # Will be incorporated into the next datashader release after 0.11.1
+    url = "https://github.com/holoviz/datashader/pull/960/commits/d7a462fa399106c34fd0d44505a8a73789dbf874.patch";
+    sha256 = "1wqsk9dpxnkxr49fa7y5q6ahin80cvys05lnirs2w2p1dja35y4x";
+  })];
+
+  propagatedBuildInputs = [
+    dask
+    distributed
+    bokeh
+    toolz
+    datashape
+    numba
+    numpy
+    pandas
+    pillow
+    xarray
+    colorcet
+    param
+    pyct
+    pyyaml
+    requests
+    scikitimage
+    scipy
+    testpath
+  ];
+
+  checkInputs = [
+    pytest
+    pytest-benchmark
+    pytest_xdist # not needed
+    flake8
+    nbsmoke
+    fastparquet
+    pandas
+    nbconvert
+  ];
+
+  postConfigure = ''
+    substituteInPlace setup.py \
+      --replace "'numba >=0.37.0,<0.49'" "'numba'"
+  '';
+
+  # dask doesn't do well with large core counts
+  checkPhase = ''
+    pytest -n $NIX_BUILD_CORES datashader -k 'not dask.array'
+  '';
+
+  meta = with lib; {
+    description = "Data visualization toolchain based on aggregating into a grid";
+    homepage = "https://datashader.org";
+    license = licenses.bsd3;
+    maintainers = [ 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..6f11ae62c3e9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/datashape/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytest
+, mock
+, numpy
+, multipledispatch
+, 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 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..c5271e473e3e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/datatable/default.nix
@@ -0,0 +1,68 @@
+{ stdenv, lib, buildPythonPackage, fetchPypi, substituteAll, pythonOlder
+, pipInstallHook, writeText
+, blessed
+, docutils
+, libcxx
+, llvm
+, pytestCheckHook
+, typesentry
+}:
+
+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";
+
+  # tarball doesn't appear to have been shipped totally ready-to-build
+  postPatch = ''
+    substituteInPlace ci/ext.py \
+      --replace \
+        'shell_cmd(["git"' \
+        '"0000000000000000000000000000000000000000" or shell_cmd(["git"'
+    echo '${version}' > VERSION.txt
+  '';
+  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 ${libcxx}/include/c++/v1";
+
+  pytestFlagsArray = let
+    # ini file (not included in tarball) required to change python_files setting,
+    pytestIni = writeText "pytest.ini" ''
+      [pytest]
+      python_files = test_*.py test-*.py
+    '';
+  in [
+    "-c ${pytestIni}"
+  ];
+  disabledTests = [
+    # skip tests which are irrelevant to our installation or use way too much memory
+    "test_xfunction_paths"
+    "test_fread_from_cmd2"
+    "test_cast_huge_to_str"
+    "test_create_large_string_column"
+  ];
+  pythonImportsCheck = [ "datatable" ];
+
+  meta = with lib; {
+    description = "data.table for Python";
+    homepage = "https://github.com/h2oai/datatable";
+    license = licenses.mpl20;
+    maintainers = with maintainers; [ abbradar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dateparser/default.nix b/nixpkgs/pkgs/development/python-modules/dateparser/default.nix
new file mode 100644
index 000000000000..2a80523a6560
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dateparser/default.nix
@@ -0,0 +1,61 @@
+{ lib, fetchPypi, buildPythonPackage
+, nose
+, parameterized
+, mock
+, flake8
+, glibcLocales
+, six
+, jdatetime
+, dateutil
+, umalqurra
+, pytz
+, tzlocal
+, regex
+, ruamel_yaml
+, python
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "dateparser";
+  version = "1.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "159cc4e01a593706a15cd4e269a0b3345edf3aef8bf9278a57dac8adf5bf1e4a";
+  };
+
+  checkInputs = [
+    flake8
+    nose
+    mock
+    parameterized
+    six
+    glibcLocales
+  ];
+  preCheck =''
+    # skip because of missing convertdate module, which is an extra requirement
+    rm tests/test_jalali.py
+  '';
+
+  checkPhase = ''
+    ${python.interpreter} -m unittest discover -s tests
+  '';
+
+  # Strange
+  # AttributeError: 'module' object has no attribute 'config'
+  doCheck = false;
+
+  propagatedBuildInputs = [
+    # install_requires
+    dateutil pytz regex tzlocal
+    # extra_requires
+    jdatetime ruamel_yaml umalqurra
+  ];
+
+  meta = with lib; {
+    description = "Date parsing library designed to parse dates from HTML pages";
+    homepage = "https://github.com/scrapinghub/dateparser";
+    license = licenses.bsd3;
+  };
+}
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..a6aca68ef293
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dateutil/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, six, setuptools_scm, pytest }:
+buildPythonPackage rec {
+  pname = "python-dateutil";
+  version = "2.8.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "73ebfe9dbf22e832286dafa60473e4cd239f8592f699aa5adaf10050e6e1823c";
+  };
+
+  checkInputs = [ pytest ];
+  propagatedBuildInputs = [ six setuptools_scm ];
+
+  checkPhase = ''
+    py.test dateutil/test
+  '';
+
+  # Requires fixing
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Powerful extensions to the standard datetime module";
+    homepage = "https://pypi.python.org/pypi/python-dateutil";
+    license = "BSD-style";
+  };
+}
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..c7f74730c161
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/datrie/default.nix
@@ -0,0 +1,36 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, fetchpatch
+, cython, pytest, pytestrunner, hypothesis }:
+
+buildPythonPackage rec {
+  pname = "datrie";
+  version = "0.7.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "08r0if7dry2q7p34gf7ffyrlnf4bdvnprxgydlfxgfnvq8f3f4bs";
+  };
+
+  patches = [
+    # fix tests against recent hypothesis
+    (fetchpatch {
+      url = "https://github.com/pytries/datrie/commit/9b24b4c02783cdb703ac3f6c6d7d881db93166e0.diff";
+      sha256 = "1ql7jcf57q3x3fcbddl26y9kmnbnj2dv6ga8mwq94l4a3213j2iy";
+    })
+  ];
+
+  nativeBuildInputs = [ cython ];
+  buildInputs = [ pytest pytestrunner hypothesis ];
+
+  # recompile pxd and pyx for python37
+  # https://github.com/pytries/datrie/issues/52
+  preBuild = ''
+    ./update_c.sh
+  '';
+
+  meta = with lib; {
+    description = "Super-fast, efficiently stored Trie for Python";
+    homepage = "https://github.com/kmike/datrie";
+    license = licenses.lgpl2;
+    maintainers = with maintainers; [ lewo ];
+  };
+}
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..b9c264a20150
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dbf/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv, fetchPypi, buildPythonPackage, aenum, isPy3k, pythonOlder, enum34, python }:
+
+buildPythonPackage rec {
+    pname = "dbf";
+    version = "0.99.0";
+
+    src = fetchPypi {
+      inherit pname version;
+      sha256 = "a4a7a8cdc113d840142d21a796c16c7d329ad35c48f17156446732c83ebc571a";
+    };
+
+    propagatedBuildInputs = [ aenum ] ++ lib.optional (pythonOlder "3.4") enum34;
+
+    doCheck = !isPy3k;
+    # tests are not yet ported.
+    # https://groups.google.com/forum/#!topic/python-dbase/96rx2xmCG4w
+
+    checkPhase = ''
+      ${python.interpreter} dbf/test.py
+    '';
+
+    meta = with lib; {
+      description = "Pure python package for reading/writing dBase, FoxPro, and Visual FoxPro .dbf files";
+      homepage    = "https://pypi.python.org/pypi/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..9f78f3fdde1b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dbfread/default.nix
@@ -0,0 +1,18 @@
+{ lib, stdenv, 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-next/default.nix b/nixpkgs/pkgs/development/python-modules/dbus-next/default.nix
new file mode 100644
index 000000000000..76385ac8023a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dbus-next/default.nix
@@ -0,0 +1,41 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, python
+, dbus, dbus-python, pytest, pytestcov, pytest-asyncio, pytest-timeout
+}:
+
+buildPythonPackage rec {
+  pname = "dbus-next";
+  version = "0.2.2";
+
+  src = fetchFromGitHub {
+    owner = "altdesktop";
+    repo = "python-dbus-next";
+    rev = "v${version}";
+    sha256 = "0x78ghkci4las13gwbrm8fzg671lx1q2cn8h0f64ki8yag1myia1";
+  };
+
+  checkInputs = [
+    dbus
+    dbus-python
+    pytest
+    pytestcov
+    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; {
+    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..a6e2e28c6f59
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dbus/default.nix
@@ -0,0 +1,36 @@
+{ lib, fetchPypi, buildPythonPackage, python, pkg-config, dbus, dbus-glib, isPyPy
+, ncurses, pygobject3, isPy3k }:
+
+buildPythonPackage rec {
+  pname = "dbus-python";
+  version = "1.2.16";
+  format = "other";
+
+  outputs = [ "out" "dev" ];
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "196m5rk3qzw5nkmgzjl7wmq0v7vpwfhh8bz2sapdi5f9hqfqy8qi";
+  };
+
+  patches = [
+    ./fix-includedir.patch
+  ];
+
+  disabled = isPyPy;
+
+  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 ];
+
+  meta = {
+    description = "Python DBus bindings";
+    license = lib.licenses.mit;
+    platforms = dbus.meta.platforms;
+  };
+}
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..42ae779e0d21
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dbutils/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, pytestCheckHook }:
+
+buildPythonPackage rec {
+  version = "2.0";
+  pname = "dbutils";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "DBUtils";
+    sha256 = "131ifm2c2a7bipij597i8fvjka0dk2qv1xr2ghcvbc30jlkvag2g";
+  };
+
+  checkInputs = [ pytestCheckHook ];
+
+  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..a6669d0e30df
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dcmstack/default.nix
@@ -0,0 +1,39 @@
+{ lib, stdenv
+, 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..f993c3844b85
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ddt/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, six, pyyaml, mock
+, pytestCheckHook
+, enum34
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "ddt";
+  version = "1.4.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0595e70d074e5777771a45709e99e9d215552fb1076443a25fad6b23d8bf38da";
+  };
+
+  checkInputs = [ six pyyaml mock pytestCheckHook ];
+
+  propagatedBuildInputs = lib.optionals (!isPy3k) [
+    enum34
+  ];
+
+  meta = with lib; {
+    description = "Data-Driven/Decorated Tests, a library to multiply test cases";
+    homepage = "https://github.com/txels/ddt";
+    license = licenses.mit;
+  };
+
+}
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..21dc9d3832c8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/deap/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, python, numpy, matplotlib, nose }:
+
+buildPythonPackage rec {
+  pname = "deap";
+  version = "1.3.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0bvshly83c4h5jhxaa97z192viczymz5fxp6vl8awjmmrs9l9x8i";
+  };
+
+  propagatedBuildInputs = [ numpy matplotlib ];
+
+  checkInputs = [ nose ];
+  checkPhase = ''
+    ${python.interpreter} setup.py 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/default.nix b/nixpkgs/pkgs/development/python-modules/debian/default.nix
new file mode 100644
index 000000000000..e97c3420f454
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/debian/default.nix
@@ -0,0 +1,22 @@
+{ lib, buildPythonPackage, fetchPypi
+, chardet, six}:
+
+buildPythonPackage rec {
+  pname = "python-debian";
+  version = "0.1.39";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "6cca96239b5981f5203216d2113fea522477628607ed0a8427e15094a792541c";
+  };
+
+  propagatedBuildInputs = [ chardet six ];
+
+  # No tests in archive
+  doCheck = false;
+
+  meta = {
+    description = "Debian package related modules";
+    license = lib.licenses.gpl2;
+  };
+}
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/debugpy/default.nix b/nixpkgs/pkgs/development/python-modules/debugpy/default.nix
new file mode 100644
index 000000000000..beb5ba9c46b7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/debugpy/default.nix
@@ -0,0 +1,97 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, substituteAll
+, gdb
+, flask
+, psutil
+, pytest-timeout
+, pytest_xdist
+, pytestCheckHook
+, requests
+, isPy27
+, django
+, gevent
+}:
+
+buildPythonPackage rec {
+  pname = "debugpy";
+  version = "1.2.1";
+
+  src = fetchFromGitHub {
+    owner = "Microsoft";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1dgjbbhy228w2zbfq5pf0hkai7742zw8mmybnzjdc9l6pw7360rq";
+  };
+
+  patches = [
+    # Hard code GDB path (used to attach to process)
+    (substituteAll {
+      src = ./hardcode-gdb.patch;
+      inherit gdb;
+    })
+
+    (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 -m64 -o attach_linux_amd64.so";
+      "i686-linux"    = "-shared -m32 -o attach_linux_x86.so";
+      "x86_64-darwin" = "-std=c++11 -lc -D_REENTRANT -dynamiclib -arch x86_64 -o attach_x86_64.dylib";
+      "i686-darwin"   = "-std=c++11 -lc -D_REENTRANT -dynamiclib -arch i386 -o attach_x86.dylib";
+    }.${stdenv.hostPlatform.system}}
+  )'';
+
+  checkInputs = [
+    flask
+    psutil
+    pytest-timeout
+    pytest_xdist
+    pytestCheckHook
+    requests
+  ] ++ lib.optionals (!isPy27) [
+    django
+    gevent
+  ];
+
+  # Override default arguments in pytest.ini
+  pytestFlagsArray = [ "--timeout=0" "-n=$NIX_BUILD_CORES" ];
+
+  disabledTests = lib.optionals isPy27 [
+    # django 1.11 is the last version to support Python 2.7
+    # and is no longer built in nixpkgs
+    "django"
+
+    # gevent fails to import zope.interface with Python 2.7
+    "gevent"
+  ];
+
+  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; [ metadark ];
+    platforms = [ "x86_64-linux" "i686-linux" "x86_64-darwin" "i686-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..751351e03cde
--- /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 2b39106..6d45a10 100644
+--- a/tests/debug/session.py
++++ b/tests/debug/session.py
+@@ -625,6 +625,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..780cb1aed1c4
--- /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 6d031b4..ecf21f2 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
+@@ -293,7 +293,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..2879716f704d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/debugpy/hardcode-version.patch
@@ -0,0 +1,51 @@
+diff --git a/setup.py b/setup.py
+index cfec60d..32ca206 100644
+--- a/setup.py
++++ b/setup.py
+@@ -24,7 +24,6 @@ elif "--abi" in sys.argv:
+ from setuptools import setup  # noqa
+ 
+ sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
+-import versioneer  # noqa
+ 
+ del sys.path[0]
+ 
+@@ -86,7 +85,7 @@ if __name__ == "__main__":
+     if not os.getenv("SKIP_CYTHON_BUILD"):
+         cython_build()
+ 
+-    cmds = versioneer.get_cmdclass()
++    cmds = {}
+     cmds["bdist_wheel"] = bdist_wheel
+ 
+     extras = {}
+@@ -96,7 +95,7 @@ if __name__ == "__main__":
+ 
+     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/__init__.py b/src/debugpy/__init__.py
+index baa5a7c..5355327 100644
+--- a/src/debugpy/__init__.py
++++ b/src/debugpy/__init__.py
+@@ -27,7 +27,6 @@ __all__ = [
+ import codecs
+ import os
+ 
+-from debugpy import _version
+ from debugpy.common import compat
+ 
+ 
+@@ -204,7 +203,7 @@ def trace_this_thread(should_trace):
+     return api.trace_this_thread(should_trace)
+ 
+ 
+-__version__ = _version.get_versions()["version"]
++__version__ = "@version@"
+ 
+ # Force absolute path on Python 2.
+ __file__ = os.path.abspath(__file__)
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..8e8fd28f0b54
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/decorator/default.nix
@@ -0,0 +1,21 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "decorator";
+  version = "4.4.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1rxzhk5zwiggk45hl53zydvy70lk654kg0nc1p54090p402jz9p3";
+  };
+
+  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/deep_merge/default.nix b/nixpkgs/pkgs/development/python-modules/deep_merge/default.nix
new file mode 100644
index 000000000000..533bc6aa3477
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/deep_merge/default.nix
@@ -0,0 +1,24 @@
+{ lib, buildPythonPackage, fetchPypi, pytestCheckHook, 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..e8d2731eb559
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/deepdiff/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, mock
+, jsonpickle
+, mmh3
+, ordered-set
+, numpy
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "deepdiff";
+  version = "5.0.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "e2b74af4da0ef9cd338bb6e8c97242c1ec9d81fcb28298d7bb24acdc19ea79d7";
+  };
+
+  # # Extra packages (may not be necessary)
+  checkInputs = [
+    mock
+    numpy
+    pytestCheckHook
+  ];
+
+  propagatedBuildInputs = [
+    jsonpickle
+    mmh3
+    ordered-set
+  ];
+
+  meta = with lib; {
+    description = "Deep Difference and Search of any Python object/data";
+    homepage = "https://github.com/seperman/deepdiff";
+    license = licenses.mit;
+    maintainers = [ maintainers.mic92 ];
+  };
+}
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..0d81110dee82
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/deepmerge/default.nix
@@ -0,0 +1,29 @@
+{ lib, buildPythonPackage, fetchPypi, isPy27
+, vcver }:
+
+buildPythonPackage rec {
+  pname = "deepmerge";
+  version = "0.1.1";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "fa1d44269786bcc12d30a7471b0b39478aa37a43703b134d7f12649792f92c1f";
+  };
+
+  propagatedBuildInputs = [
+    vcver
+  ];
+
+  # depends on https://pypi.org/project/uranium/
+  doCheck = false;
+
+  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..eef8d51ae911
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/deeptoolsintervals/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest
+, zlib
+, lzma
+}:
+
+buildPythonPackage rec {
+  pname = "deeptoolsintervals";
+  version = "0.1.9";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1xnl80nblysj6dylj4683wgrfa425rkx4dp5k65hvwdns9pw753x";
+  };
+
+  buildInputs = [ zlib lzma ];
+
+  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/defcon/default.nix b/nixpkgs/pkgs/development/python-modules/defcon/default.nix
new file mode 100644
index 000000000000..25c590299922
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/defcon/default.nix
@@ -0,0 +1,35 @@
+{ lib, buildPythonPackage, fetchPypi, pythonOlder
+, fonttools
+, pytest, pytestrunner, lxml, fs, unicodedata2, fontpens
+}:
+
+buildPythonPackage rec {
+  pname = "defcon";
+  version = "0.7.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1lfqsvxmq1j0nvp26gidnqkj1dyxv7jalc6i7fz1r3nc7niflrqr";
+    extension = "zip";
+  };
+
+  propagatedBuildInputs = [
+    fonttools
+  ];
+
+  checkInputs = [
+    pytest
+    pytestrunner
+    lxml
+    fs
+    unicodedata2
+    fontpens
+  ];
+
+  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 = [ 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..bc84df26a278
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/deform/default.nix
@@ -0,0 +1,43 @@
+{ 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";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "iso8601<=0.1.11" iso8601
+  '';
+
+  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..581a6cce9b2a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/defusedxml/default.nix
@@ -0,0 +1,11 @@
+{ buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "defusedxml";
+  version = "0.6.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f684034d135af4c6cbb949b8a4d2ed61634515257a67299e5f940fbaa34377f5";
+  };
+}
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..3521e8ce1298
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/delegator-py/default.nix
@@ -0,0 +1,30 @@
+{ buildPythonPackage
+, lib
+, fetchFromGitHub
+, pexpect
+, pytest
+}:
+
+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/deluge-client/default.nix b/nixpkgs/pkgs/development/python-modules/deluge-client/default.nix
new file mode 100644
index 000000000000..a271371e22fc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/deluge-client/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv, 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/demjson/default.nix b/nixpkgs/pkgs/development/python-modules/demjson/default.nix
new file mode 100644
index 000000000000..fc70562938ef
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/demjson/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv, python, buildPythonPackage, fetchPypi, isPy3k }:
+
+buildPythonPackage rec {
+  pname = "demjson";
+  version = "2.2.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0ygbddpnvp5lby6mr5kz60la3hkvwwzv3wwb3z0w9ngxl0w21pii";
+  };
+
+  checkPhase = lib.optionalString isPy3k ''
+    ${python.interpreter} -m lib2to3 -w test/test_demjson.py
+  '' + ''
+    ${python.interpreter} test/test_demjson.py
+  '';
+
+  meta = with lib; {
+    description = "Encoder/decoder and lint/validator for JSON (JavaScript Object Notation)";
+    homepage = "https://github.com/dmeranda/demjson";
+    license = licenses.lgpl3Plus;
+    maintainers = with maintainers; [ bjornfor ];
+    platforms = platforms.all;
+  };
+}
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..05737ecf9a86
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dendropy/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, pkgs
+, buildPythonPackage
+, fetchFromGitHub
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname   = "DendroPy";
+  version = "4.4.0";
+
+  # tests are incorrectly packaged in pypi version
+  src = fetchFromGitHub {
+    owner = "jeetsukumaran";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "097hfyv2kaf4x92i4rjx0paw2cncxap48qivv8zxng4z7nhid0x9";
+  };
+
+  preCheck = ''
+    # Needed for unicode python tests
+    export LC_ALL="en_US.UTF-8"
+    cd tests  # to find the 'support' module
+  '';
+
+  checkInputs = [ pytest pkgs.glibcLocales ];
+
+  checkPhase = ''
+    pytest -k 'not test_dataio_nexml_reader_tree_list and not test_pscores_with'
+  '';
+
+  meta = {
+    homepage = "https://dendropy.org/";
+    description = "A Python library for phylogenetic computing";
+    maintainers = with lib.maintainers; [ unode ];
+    license = lib.licenses.bsd3;
+  };
+}
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..b02e1e498b9d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/denonavr/default.nix
@@ -0,0 +1,33 @@
+{ lib, buildPythonPackage, fetchFromGitHub, isPy27, requests, netifaces
+, pytestCheckHook, testtools, requests-mock }:
+
+buildPythonPackage rec {
+  pname = "denonavr";
+  version = "0.9.10";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "scarface-4711";
+    repo = "denonavr";
+    rev = version;
+    sha256 = "sha256-3ap8F3ayBTpaR98md+gT0+hkIWlFBNxStTGWT5AL//A=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    netifaces
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    testtools
+    requests-mock
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/scarface-4711/denonavr";
+    description = "Automation Library for Denon AVR receivers.";
+    license = 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..0c2e2055ff9f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dependency-injector/default.nix
@@ -0,0 +1,32 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, isPy3k, six, unittest2, pyyaml, flask }:
+
+let
+  testPath =
+    if isPy3k
+    then "test_*_py3.py"
+    else "test_*_py2_py3.py";
+in
+
+buildPythonPackage rec {
+  pname = "dependency-injector";
+  version = "4.5.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "99e65335cb84d543ebb47e76edadc695d062e5c25cc474698f50ed5e2aaa9002";
+  };
+
+  propagatedBuildInputs = [ six ];
+  checkInputs = [ unittest2 pyyaml flask ];
+
+  checkPhase = ''
+    unit2 discover -s tests/unit -p "${testPath}"
+  '';
+
+  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..a64ed0b9d992
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/deprecated/default.nix
@@ -0,0 +1,22 @@
+{ lib, stdenv, fetchPypi, buildPythonPackage,
+  wrapt, pytest, tox }:
+
+buildPythonPackage rec {
+  pname = "Deprecated";
+  version = "1.2.10";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0x3zkmykcyjn8k57g8lcf89fxw8q7hvvcj6xkwb0f2zrnmpscnsj";
+  };
+
+  propagatedBuildInputs = [ wrapt ];
+  checkInputs = [ pytest ];
+  meta = with lib; {
+    homepage = "https://github.com/tantale/deprecated";
+    description = "Python @deprecated decorator to deprecate old python classes, functions or methods";
+    platforms = platforms.all;
+    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..fb5698062f77
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/deprecation/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, fetchPypi, python, packaging, unittest2 }:
+
+buildPythonPackage rec {
+  pname = "deprecation";
+  version = "2.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1zqqjlgmhgkpzg9ss5ki8wamxl83xn51fs6gn2a8cxsx9vkbvcvj";
+  };
+
+  propagatedBuildInputs = [ packaging ];
+
+  checkInputs = [ 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..f9b8f5dec7c0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/derpconf/default.nix
@@ -0,0 +1,19 @@
+{ lib, stdenv, 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..5280ff2417aa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/descartes/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv, 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 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/deskcon/default.nix b/nixpkgs/pkgs/development/python-modules/deskcon/default.nix
new file mode 100644
index 000000000000..01918445b342
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/deskcon/default.nix
@@ -0,0 +1,42 @@
+{ lib, stdenv
+, buildPythonPackage
+, pyopenssl
+, pkgs
+, isPy3k
+, python
+}:
+
+buildPythonPackage {
+  pname = "deskcon";
+  version = "0.3";
+  disabled = isPy3k;
+
+  src = pkgs.fetchFromGitHub {
+    owner= "screenfreeze";
+    repo = "deskcon-desktop";
+    rev = "267804122188fa79c37f2b21f54fe05c898610e6";
+    sha256 ="0i1dd85ls6n14m9q7lkympms1w3x0pqyaxvalq82s4xnjdv585j3";
+  };
+
+  phases = [ "unpackPhase" "installPhase" ];
+
+  pythonPath = [ pyopenssl pkgs.gtk3 ];
+
+  installPhase = ''
+    substituteInPlace server/deskcon-server --replace "python2" "python"
+
+    mkdir -p $out/bin
+    mkdir -p $out/lib/${python.libPrefix}/site-packages
+    cp -r "server/"* $out/lib/${python.libPrefix}/site-packages
+    mv $out/lib/${python.libPrefix}/site-packages/deskcon-server $out/bin/deskcon-server
+
+    wrapPythonProgramsIn $out/bin "$out $pythonPath"
+  '';
+
+  meta = with lib; {
+    description = "Integrates an Android device into a desktop";
+    homepage = "https://github.com/screenfreeze/deskcon-desktop";
+    license = licenses.gpl3;
+  };
+
+}
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..1e388fd3a117
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/devolo-home-control-api/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pytest-cov
+, pytest-mock
+, requests
+, zeroconf
+, websocket_client
+, pytest-runner
+}:
+
+buildPythonPackage rec {
+  pname = "devolo-home-control-api";
+  version = "0.16.0";
+
+  src = fetchFromGitHub {
+    owner = "2Fake";
+    repo = "devolo_home_control_api";
+    rev = "v${version}";
+    sha256 = "19zzdbx0dxlm8pq0yk00nn9gqqblgpp16fgl7z6a98hsa6459zzb";
+  };
+
+  nativeBuildInputs = [ pytest-runner ];
+
+  propagatedBuildInputs = [
+    requests
+    zeroconf
+    websocket_client
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    pytest-cov
+    pytest-mock
+  ];
+
+  # Disable test that requires network access
+  disabledTests = [ "test__on_pong" ];
+  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/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/dftfit/default.nix b/nixpkgs/pkgs/development/python-modules/dftfit/default.nix
new file mode 100644
index 000000000000..0f0563e3baf5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dftfit/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, pymatgen
+, marshmallow
+, pyyaml
+, pygmo
+, pandas
+, scipy
+, numpy
+, scikitlearn
+, lammps-cython
+, pymatgen-lammps
+, pytestrunner
+, pytest
+, pytestcov
+, pytest-benchmark
+, isPy3k
+, openssh
+}:
+
+buildPythonPackage rec {
+  pname = "dftfit";
+  version = "0.5.1";
+  disabled = (!isPy3k);
+
+  src = fetchPypi {
+     inherit pname version;
+     sha256 = "4dcbde48948835dcf2d49d6628c9df5747a8ec505d517e374b8d6c7fe95892df";
+  };
+
+  buildInputs = [ pytestrunner ];
+  checkInputs = [ pytest pytestcov pytest-benchmark openssh ];
+  propagatedBuildInputs = [ pymatgen marshmallow pyyaml pygmo
+                            pandas scipy numpy scikitlearn
+                            lammps-cython pymatgen-lammps ];
+
+  # tests require git lfs download. and is quite large so skip tests
+  doCheck = false;
+
+  meta = {
+    description = "Ab-Initio Molecular Dynamics Potential Development";
+    homepage = "https://gitlab.com/costrouc/dftfit";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ costrouc ];
+  };
+}
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..8e35eabfb0d7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/diceware/default.nix
@@ -0,0 +1,33 @@
+{ lib, buildPythonPackage, fetchPypi
+, pytestrunner
+, setuptools
+, coverage, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "diceware";
+  version = "0.9.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0klb0ysybzlh2wihvir82hgq62v0jjmlcqklwajyms7c0p529yby";
+  };
+
+  nativeBuildInputs = [ pytestrunner ];
+
+  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..abc07346efd3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dicom2nifti/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, isPy27
+, gdcm
+, nose
+, nibabel
+, numpy
+, pydicom
+, scipy
+}:
+
+buildPythonPackage rec {
+  pname = "dicom2nifti";
+  version = "2.2.8";
+  disabled = isPy27;
+
+  # no tests in PyPI dist
+  src = fetchFromGitHub {
+    owner = "icometrix";
+    repo = pname;
+    rev = version;
+    sha256 = "1qi2map6f4pa1l8wsif7ff7rhja6ynrjlm7w306dzvi9l25mia34";
+  };
+
+  propagatedBuildInputs = [ gdcm nibabel numpy pydicom scipy ];
+
+  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..457e9d3e530b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dict2xml/default.nix
@@ -0,0 +1,20 @@
+{ lib, fetchPypi, buildPythonPackage, six }:
+
+buildPythonPackage rec {
+  pname = "dict2xml";
+  version = "1.7.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0bfn8n8sb3slwx7ra8m8fbfy65k20h2qxcqfq99hwqrrkgcffihl";
+  };
+
+  propagatedBuildInputs = [ six ];
+
+  meta = with lib; {
+    description = "Super simple 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/dictionaries/default.nix b/nixpkgs/pkgs/development/python-modules/dictionaries/default.nix
new file mode 100644
index 000000000000..2a3e752c2062
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dictionaries/default.nix
@@ -0,0 +1,19 @@
+{ buildPythonPackage, fetchPypi, lib, six }:
+
+buildPythonPackage rec {
+  pname = "dictionaries";
+  version = "0.0.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "8fa92745eb7c707b8588888875234f2f0a61b67936d8deb91b2b7b4c32366112";
+  };
+
+  buildInputs = [ six ];
+
+  meta = {
+    description = "Dict implementations with attribute access";
+    license = lib.licenses.mit;
+    maintainers = [ lib.maintainers.MostAwesomeDude ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dicttoxml/default.nix b/nixpkgs/pkgs/development/python-modules/dicttoxml/default.nix
new file mode 100644
index 000000000000..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/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/diff_cover/default.nix b/nixpkgs/pkgs/development/python-modules/diff_cover/default.nix
new file mode 100644
index 000000000000..9672cca46b05
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/diff_cover/default.nix
@@ -0,0 +1,46 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi
+, inflect
+, jinja2
+, jinja2_pluralize
+, pygments
+, six
+# test dependencies
+, coverage
+, flake8
+, mock
+, nose
+, pycodestyle
+, pyflakes
+, pylint
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "diff_cover";
+  version = "4.0.1";
+
+  preCheck = ''
+    export LC_ALL=en_US.UTF-8;
+  '';
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "61a98ec126552d985c0e3e3c33cc72e79d7577f91f6edba99f635411a173d3b9";
+  };
+
+  propagatedBuildInputs = [ jinja2 jinja2_pluralize pygments six inflect ];
+
+  checkInputs = [ mock coverage pytest nose pylint pyflakes pycodestyle ];
+
+  # ignore tests which try to write files
+  checkPhase = ''
+    pytest -k 'not added_file_pylint_console and not file_does_not_exist'
+  '';
+
+  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/digi-xbee/default.nix b/nixpkgs/pkgs/development/python-modules/digi-xbee/default.nix
new file mode 100644
index 000000000000..ad653c6313c6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/digi-xbee/default.nix
@@ -0,0 +1,24 @@
+{ stdenv, buildPythonPackage, fetchPypi, isPy27, pyserial, srp, lib }:
+
+buildPythonPackage rec {
+  pname = "digi-xbee";
+  version = "1.3.0";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "2ed798faee0853bf7ae9ca5aa4bdcbab496e3c2d56c9f0719a8e3e0d13270891";
+  };
+
+  propagatedBuildInputs = [ pyserial srp ];
+
+  # Upstream doesn't contain unit tests, only functional tests which require specific hardware
+  doCheck = false;
+
+  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..7ba0d106e25b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/digitalocean/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchPypi
+, isPy3k
+, jsonpickle
+, mock
+, pytest
+, pytestCheckHook
+, requests
+, responses
+}:
+
+buildPythonPackage rec {
+  pname = "python-digitalocean";
+  version = "1.16.0";
+
+  src = fetchFromGitHub {
+    owner = "koalalorenzo";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "16fxlfpisj4rcj9dvlifs6bpx42a0sn9b07bnyzwrbhi6nfvkd2g";
+  };
+
+  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..0983805780fa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dill/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, nose
+}:
+
+buildPythonPackage rec {
+  pname = "dill";
+  version = "0.3.1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "42d8ef819367516592a825746a18073ced42ca169ab1f5f4044134703e7a049c";
+  };
+
+  # python2 can't import a test fixture
+  doCheck = !isPy27;
+  checkInputs = [ nose ];
+  checkPhase = ''
+    PYTHONPATH=$PWD/tests:$PYTHONPATH
+    nosetests \
+      --ignore-files="test_classdef" \
+      --ignore-files="test_objects" \
+      --ignore-files="test_selected" \
+      --exclude="test_the_rest" \
+      --exclude="test_importable"
+  '';
+  # 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.
+
+  meta = {
+    description = "Serialize all of python (almost)";
+    homepage = "https://github.com/uqfoundation/dill/";
+    license = lib.licenses.bsd3;
+  };
+}
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..c473f2fb4200
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/diofant/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, isPy3k
+, buildPythonPackage
+, fetchPypi
+, pytestrunner
+, setuptools_scm
+, isort
+, mpmath
+, strategies
+}:
+
+buildPythonPackage rec {
+  pname = "diofant";
+  version = "0.10.0";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "Diofant";
+    sha256 = "0qjg0mmz2cqxryr610mppx3virf1gslzrsk24304502588z53v8w";
+  };
+
+  nativeBuildInputs = [
+    isort
+    pytestrunner
+    setuptools_scm
+  ];
+
+  propagatedBuildInputs = [
+    mpmath
+    strategies
+  ];
+
+  # tests take ~1h
+  doCheck = false;
+
+  disabled = !isPy3k;
+
+  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..51d689f98596
--- /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.3.0";
+
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner  = "dipy";
+    repo   = pname;
+    rev    = version;
+    sha256 = "0555abx0fwqmk6dc3im7r45d9j7r9xh6gm9mbwfwvlf7laf8h098";
+  };
+
+  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/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..5e3ac1e1fcde
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/discogs_client/default.nix
@@ -0,0 +1,19 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, requests, oauthlib }:
+
+buildPythonPackage rec {
+  pname = "discogs-client";
+  version = "2.3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "cc979fcbb5283f74d388c7111c8ed6bef920b01614a014d6b1c5d6fbb554bfc3";
+  };
+
+  propagatedBuildInputs = [ requests oauthlib ];
+
+  meta = with lib; {
+    description = "Official Python API client for Discogs";
+    license = licenses.bsd2;
+    homepage = "https://github.com/discogs/discogs_client";
+  };
+}
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..9c30606f75d9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/discordpy/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, pythonOlder
+, withVoice ? true, libopus
+, aiohttp
+, websockets
+}:
+
+buildPythonPackage rec {
+  pname = "discord.py";
+  version = "1.6.0";
+  disabled = pythonOlder "3.5.3";
+
+  # only distributes wheels on pypi now
+  src = fetchFromGitHub {
+    owner = "Rapptz";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "036prc4iw91qx31zz48hy3b30kn2qnlg68lgrvv2mcvsjxf2gd1l";
+  };
+
+  propagatedBuildInputs = [ aiohttp websockets ];
+  patchPhase = ''
+    substituteInPlace "requirements.txt" \
+      --replace "aiohttp>=3.6.0,<3.7.0" "aiohttp" \
+      --replace "websockets>=6.0,!=7.0,!=8.0,!=8.0.1,<9.0" "websockets"
+  '' + lib.optionalString withVoice ''
+    substituteInPlace "discord/opus.py" \
+      --replace "ctypes.util.find_library('opus')" "'${libopus}/lib/libopus.so.0'"
+  '';
+
+  # 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 = "A python wrapper for the Discord API";
+    homepage = "https://discordpy.rtfd.org/";
+    maintainers = [ maintainers.ivar ];
+    license = licenses.mit;
+  };
+}
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..8b968c3272fb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/diskcache/default.nix
@@ -0,0 +1,41 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pytestcov
+, pytest_xdist
+, pytest-django
+, mock
+, django
+}:
+
+buildPythonPackage rec {
+  pname = "diskcache";
+  version = "5.1.0";
+
+  src = fetchFromGitHub {
+    owner = "grantjenks";
+    repo = "python-diskcache";
+    rev = "v${version}";
+    sha256 = "0xwqw60dbn1x2294galcs08vm6ydcr677lr8slqz8a3ry6sgkhn9";
+  };
+
+  checkInputs = [
+    pytestCheckHook
+    pytestcov
+    pytest_xdist
+    pytest-django
+    mock
+  ];
+
+  # Darwin sandbox causes most tests to fail.
+  doCheck = !stdenv.isDarwin;
+
+  meta = with lib; {
+    description = "Disk and file backed persistent cache";
+    homepage = "http://www.grantjenks.com/docs/diskcache/";
+    license = licenses.asl20;
+    maintainers = [ 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..403834a3731c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/distlib/default.nix
@@ -0,0 +1,23 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "distlib";
+  version = "0.3.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "edf6116872c863e1aa9d5bb7cb5e05a022c519a4594dc703843343a9ddd9bff1";
+    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..e9b8e66d4c99
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/distorm3/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "distorm3";
+  version = "3.3.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "1bh9xdiz9mkf9lfffimfn3hgd0mh60y7wl1micgkxzpl7hnxrpd4";
+  };
+
+  # no tests included
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Powerful Disassembler Library For x86/AMD64";
+    homepage = "https://github.com/gdabah/distorm";
+    license = licenses.bsd3;
+  };
+}
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..f4be407fade2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/distributed/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest
+, pytest-repeat
+, pytest-timeout
+, mock
+, joblib
+, click
+, cloudpickle
+, dask
+, msgpack
+, psutil
+, six
+, sortedcontainers
+, tblib
+, toolz
+, tornado
+, zict
+, pyyaml
+, isPy3k
+, futures
+, singledispatch
+, mpi4py
+, bokeh
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "distributed";
+  version = "2.30.1";
+
+  # get full repository need conftest.py to run tests
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1421d3b84a0885aeb2c4bdc9e8896729c0f053a9375596c9de8864e055e2ac8e";
+  };
+
+  disabled = pythonOlder "3.6";
+
+  checkInputs = [ pytest pytest-repeat pytest-timeout mock joblib ];
+  propagatedBuildInputs = [
+      click cloudpickle dask msgpack psutil six
+      sortedcontainers tblib toolz tornado zict pyyaml mpi4py bokeh
+  ];
+
+  # tests take about 10-15 minutes
+  # ignore 5 cli tests out of 1000 total tests that fail due to subprocesses
+  # these tests are not critical to the library (only the cli)
+  checkPhase = ''
+    py.test distributed -m "not avoid-travis" -r s --timeout-method=thread --timeout=0 --durations=20 --ignore="distributed/cli/tests"
+  '';
+
+  # when tested random tests would fail and not repeatably
+  doCheck = false;
+
+  meta = {
+    description = "Distributed computation in Python.";
+    homepage = "https://distributed.readthedocs.io/en/latest/";
+    license = lib.licenses.bsd3;
+    platforms = lib.platforms.x86; # fails on aarch64
+    maintainers = with lib.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..81bcccd8bd6c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/distro/default.nix
@@ -0,0 +1,23 @@
+{ lib, stdenv, fetchPypi, buildPythonPackage }:
+
+buildPythonPackage rec {
+  pname = "distro";
+  version = "1.5.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0e58756ae38fbd8fc3020d54badb8eae17c5b9dcbed388b17bb55b8a5928df92";
+  };
+
+  # 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; [ nand0p ];
+  };
+}
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..882a39957993
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/distutils_extra/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchurl
+}:
+
+buildPythonPackage rec {
+  pname = "distutils-extra";
+  version = "2.39";
+
+  src = fetchurl {
+    url = "https://launchpad.net/python-distutils-extra/trunk/${version}/+download/python-${pname}-${version}.tar.gz";
+    sha256 = "1bv3h2p9ffbzyddhi5sccsfwrm3i6yxzn0m06fdxkj2zsvs28gvj";
+  };
+
+  meta = with lib; {
+    homepage = "https://launchpad.net/python-distutils-extra";
+    description = "Enhancements to Python's distutils";
+    license = licenses.gpl2;
+  };
+
+}
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..f8dd9dca202c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dj-email-url/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, python
+}:
+
+buildPythonPackage rec {
+  version = "1.0.1";
+  pname = "dj-email-url";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "32dc567c5cc3d4106710ec36dd645c8c1b20e2d8f588a17ab88bcc23e347d00a";
+  };
+
+  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-search-url/default.nix b/nixpkgs/pkgs/development/python-modules/dj-search-url/default.nix
new file mode 100644
index 000000000000..321bec8149d1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dj-search-url/default.nix
@@ -0,0 +1,22 @@
+{ lib, stdenv
+, 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..fafd7ab9a63f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-allauth/default.nix
@@ -0,0 +1,31 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub, requests, requests_oauthlib
+, django, python3-openid, mock, coverage }:
+
+buildPythonPackage rec {
+  pname = "django-allauth";
+  version = "0.40.0";
+
+  # no tests on PyPI
+  src = fetchFromGitHub {
+    owner = "pennersr";
+    repo = pname;
+    rev = version;
+    sha256 = "10id4k01p1hg5agb8cmllg8mv4kc7ryl75br10idwxabqqp4vla1";
+  };
+
+  propagatedBuildInputs = [ requests requests_oauthlib django python3-openid ];
+
+  checkInputs = [ coverage mock ];
+
+  doCheck = false;
+  checkPhase = ''
+    cd $NIX_BUILD_TOP/$sourceRoot
+    coverage run manage.py test 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;
+  };
+}
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..892cf179c370
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-anymail/default.nix
@@ -0,0 +1,47 @@
+{
+    lib, stdenv,
+    buildPythonPackage,
+    fetchFromGitHub,
+    six,
+    requests,
+    django,
+    boto3,
+    python,
+    mock,
+}:
+
+buildPythonPackage rec {
+  pname = "django-anymail";
+  version = "8.1";
+
+  src = fetchFromGitHub {
+    owner = "anymail";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1v8ayd3nh7pna9lg0pzwgwmvmzzh2g1kxsy7i6mka0hi52g1xvz5";
+  };
+
+  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; [ ivegotasthma ];
+  };
+}
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..d0dacd659a15
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-auth-ldap/default.nix
@@ -0,0 +1,30 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi, isPy27
+, ldap , django
+, mock
+}:
+
+buildPythonPackage rec {
+  pname = "django-auth-ldap";
+  version = "2.2.0";
+  disabled = isPy27;
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "11af1773b08613339d2c3a0cec1308a4d563518f17b1719c3759994d0b4d04bf";
+  };
+
+  propagatedBuildInputs = [ ldap django ];
+  checkInputs = [ mock ];
+
+  # django.core.exceptions.ImproperlyConfigured: Requested setting INSTALLED_APPS, 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 = "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..103bfb29578d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-cache-url/default.nix
@@ -0,0 +1,31 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, pytest
+}:
+
+buildPythonPackage rec {
+  version = "3.1.2";
+  pname = "django-cache-url";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d0ee0d6c5daab92787bff47a4a6f5a6cf97c3c80d81a990820b2af16e12ad65a";
+  };
+
+  checkInputs = [ pytest ];
+
+  checkPhase = ''
+    pytest tests
+  '';
+
+  # tests not included with pypi release
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/ghickman/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-cleanup/default.nix b/nixpkgs/pkgs/development/python-modules/django-cleanup/default.nix
new file mode 100644
index 000000000000..39f65275feed
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-cleanup/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, django
+, redis, async-timeout, hiredis
+}:
+
+buildPythonPackage rec {
+  pname = "django-cleanup";
+  version = "5.1.0";
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "8976aec12a22913afb3d1fcb541b1aedde2f5ec243e4260c5ff78bb6aa75a089";
+  };
+
+  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..ef18bfe77ec9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-compat/default.nix
@@ -0,0 +1,42 @@
+{ lib, stdenv, 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-configurations/default.nix b/nixpkgs/pkgs/development/python-modules/django-configurations/default.nix
new file mode 100644
index 000000000000..bf1835071f88
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-configurations/default.nix
@@ -0,0 +1,44 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, django-discover-runner
+, mock
+, dj-database-url
+, dj-email-url
+, dj-search-url
+, django-cache-url
+, six
+, django
+, setuptools_scm
+}:
+
+buildPythonPackage rec {
+  version = "2.2";
+  pname = "django-configurations";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "9e3bcea1355ac50a4c9f854f751d214cb17e5f8adf18405a4488d0a1e8945915";
+  };
+
+  buildInputs = [ setuptools_scm ];
+  propagatedBuildInputs = [ six ];
+  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;
+
+  meta = with lib; {
+    homepage = "https://django-configurations.readthedocs.io/";
+    description = "A helper for organizing Django settings";
+    license = licenses.bsd0;
+    maintainers = [ 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..313ae32f04e3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-cors-headers/default.nix
@@ -0,0 +1,27 @@
+{ lib,
+  fetchPypi,
+  django,
+  buildPythonPackage
+}:
+
+buildPythonPackage rec {
+  pname = "django-cors-headers";
+  version = "3.6.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "5665fc1b1aabf1b678885cf6f8f8bd7da36ef0a978375e767d491b48d3055d8f";
+  };
+
+  propagatedBuildInputs = [ django ];
+
+  # pypi release does not include tests
+  doCheck = false;
+
+  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 = [ maintainers.ivegotasthma ];
+  };
+}
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..d87e39b8e3f7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-csp/default.nix
@@ -0,0 +1,23 @@
+{ lib, stdenv, fetchPypi, buildPythonPackage, django }:
+
+buildPythonPackage rec {
+  pname = "django-csp";
+  version = "3.5";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "django_csp";
+    sha256 = "0ks4zszbjx5lyqlc34pjica8hfcjzw4i5m6pivvnyv8yf0vh4q04";
+  };
+
+  # 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-discover-runner/default.nix b/nixpkgs/pkgs/development/python-modules/django-discover-runner/default.nix
new file mode 100644
index 000000000000..63d51d41fc93
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-discover-runner/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv
+, 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..7288896c4fea
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-dynamic-preferences/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi
+, django, persisting-theory, six
+}:
+
+buildPythonPackage rec {
+  pname = "django-dynamic-preferences";
+  version = "1.10.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "e4b2bb7b2563c5064ba56dd76441c77e06b850ff1466a386a1cd308909a6c7de";
+  };
+
+  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..455eeebddde0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-extensions/default.nix
@@ -0,0 +1,64 @@
+{ lib, buildPythonPackage, fetchFromGitHub, pythonOlder, python
+, django
+, factory_boy
+, glibcLocales
+, mock
+, pygments
+, pytest
+, pytestcov
+, pytest-django
+, python-dateutil
+, shortuuid
+, six
+, tox
+, typing
+, vobject
+, werkzeug
+}:
+
+buildPythonPackage rec {
+  pname = "django-extensions";
+  version = "3.1.0";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = version;
+    sha256 = "hZ6GS2VkXH8KfKZuL1rR6JS/nDkx8SfKuUx5XrvTbec=";
+  };
+
+  LC_ALL = "en_US.UTF-8";
+  __darwinAllowLocalNetworking = true;
+
+  propagatedBuildInputs = [ six ]
+    ++ lib.optional (pythonOlder "3.5") typing;
+
+  checkInputs = [
+    django
+    factory_boy
+    glibcLocales
+    mock
+    pygments # not explicitly declared in setup.py, but some tests require it
+    pytest
+    pytestcov
+    pytest-django
+    python-dateutil
+    shortuuid
+    tox
+    vobject
+    werkzeug
+  ];
+
+  # remove tests that need network access
+  checkPhase = ''
+    rm tests/management/commands/test_pipchecker.py
+    DJANGO_SETTINGS_MODULE=tests.testapp.settings \
+      pytest django_extensions tests
+  '';
+
+  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..e4ca546bbc28
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-filter/default.nix
@@ -0,0 +1,34 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, django
+, djangorestframework, python, mock
+}:
+
+buildPythonPackage rec {
+  pname = "django-filter";
+  version = "2.4.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "84e9d5bb93f237e451db814ed422a3a625751cbc9968b484ecc74964a8696b06";
+  };
+
+  propagatedBuildInputs = [ django ];
+
+  # 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-gravatar2/default.nix b/nixpkgs/pkgs/development/python-modules/django-gravatar2/default.nix
new file mode 100644
index 000000000000..083126066039
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-gravatar2/default.nix
@@ -0,0 +1,19 @@
+{ lib, stdenv, 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-haystack/default.nix b/nixpkgs/pkgs/development/python-modules/django-haystack/default.nix
new file mode 100644
index 000000000000..7342aa3300c4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-haystack/default.nix
@@ -0,0 +1,30 @@
+{ lib, buildPythonPackage, fetchPypi
+, setuptools, setuptools_scm, django, dateutil, whoosh, pysolr
+, coverage, mock, nose, geopy, requests }:
+
+buildPythonPackage rec {
+  pname = "django-haystack";
+  version = "3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d490f920afa85471dd1fa5000bc8eff4b704daacbe09aee1a64e75cbc426f3be";
+  };
+
+  checkInputs = [ pysolr whoosh dateutil geopy coverage nose mock coverage requests ];
+  propagatedBuildInputs = [ django setuptools ];
+  nativeBuildInputs = [ setuptools_scm ];
+
+  postPatch = ''
+    sed -i 's/geopy==/geopy>=/' setup.py
+  '';
+
+  # ImportError: cannot import name django.contrib.gis.geos.prototypes
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Modular search for Django";
+    homepage = "http://haystacksearch.org/";
+    license = licenses.bsd3;
+  };
+}
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..54056547f48a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-hijack-admin/default.nix
@@ -0,0 +1,38 @@
+{ lib, stdenv, 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 ];
+  };
+}
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..bd6f870de66e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-hijack/default.nix
@@ -0,0 +1,39 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub, python,
+  django, django_compat, django_nose
+}:
+buildPythonPackage rec {
+  pname = "django-hijack";
+  version = "2.1.10";
+
+  # the pypi packages don't include everything required for the tests
+  src = fetchFromGitHub {
+    owner = "arteria";
+    repo = "django-hijack";
+    rev = "v${version}";
+    sha256 = "01fwkjdzvw0yx2spwi7zc1yy64ndq1y72bfmk7kxnq5x803m2ak6";
+  };
+
+  checkInputs = [ django_nose ];
+  propagatedBuildInputs = [ django django_compat ];
+
+  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
+    popd
+
+    runHook postCheck
+  '';
+
+  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..6145b1266291
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-ipware/default.nix
@@ -0,0 +1,22 @@
+{ lib, buildPythonPackage, fetchPypi, django }:
+
+buildPythonPackage rec {
+  pname = "django-ipware";
+  version = "3.0.2";
+
+  meta = {
+    description = "A Django application to retrieve user's IP address";
+    homepage = "https://github.com/un33k/django-ipware";
+    license = lib.licenses.mit;
+  };
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "c7df8e1410a8e5d6b1fbae58728402ea59950f043c3582e033e866f0f0cf5e94";
+  };
+
+  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;
+}
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..13b5354e17ee
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-jinja2/default.nix
@@ -0,0 +1,28 @@
+{ lib, buildPythonPackage, fetchPypi,
+  django, jinja2, pytz, tox
+ }:
+
+buildPythonPackage rec {
+  pname = "django-jinja";
+  version = "2.7.0";
+
+  meta = {
+    description = "Simple and nonobstructive jinja2 integration with Django";
+    homepage = "https://github.com/niwinz/django-jinja";
+    license = lib.licenses.bsd3;
+  };
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d56ecddaa6d3caf508509aae5a979ebd8a3427477c34fcbcac14bf8389a21a12";
+  };
+
+  buildInputs = [ django pytz tox ];
+  propagatedBuildInputs = [ django jinja2 ];
+
+  # python installed: The directory '/homeless-shelter/.cache/pip/http' or its parent directory is not owned by the current user and the cache has been disabled. Please check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.,appdirs==1.4.3,Django==1.11.1,django-jinja==2.2.2,Jinja2==2.9.6,MarkupSafe==1.0,packaging==16.8,pyparsing==2.2.0,pytz==2017.2,six==1.10.0
+  doCheck = false;
+  checkPhase = ''
+    tox
+  '';
+}
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..59e9782f0501
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-logentry-admin/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv, fetchFromGitHub, buildPythonPackage, django, pytest, pytest-django }:
+
+buildPythonPackage rec {
+  pname = "django-logentry-admin";
+  version = "1.0.4";
+
+  src = fetchFromGitHub {
+    owner = "yprez";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1ji04qklzhjb7fx6644vzikjb2196rxyi8hrwf2knsz41ndvq1l9";
+  };
+
+  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..92765c687ae6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-mailman3/default.nix
@@ -0,0 +1,31 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi
+, django-gravatar2, django_compressor, django-allauth, mailmanclient
+, django, mock
+}:
+
+buildPythonPackage rec {
+  pname = "django-mailman3";
+  version = "1.3.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "7e37b68bb47e9ae196ca19018f576e2c8c90189c5bd82d4e549d0c2f2f3f35fb";
+  };
+
+  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
+  '';
+
+  meta = with lib; {
+    description = "Django library for Mailman UIs";
+    homepage = "https://gitlab.com/mailman/django-mailman3";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ globin peti ];
+  };
+}
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..c599e28d2062
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-maintenance-mode/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv, fetchFromGitHub, buildPythonPackage, pytest, django }:
+
+buildPythonPackage rec {
+  pname = "django-maintenance-mode";
+  version = "0.14.0";
+
+  src = fetchFromGitHub {
+    owner = "fabiocaccamo";
+    repo = pname;
+    rev = version;
+    sha256 = "1k06fhqd8wyrkp795x5j2r328l2phqgg1m1qm7fh4l2qrha43aw6";
+  };
+
+  checkInputs = [ pytest ];
+
+  propagatedBuildInputs = [ django ];
+
+  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-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..6e16af5bc8f9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-oauth-toolkit/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub
+, django, requests, oauthlib
+}:
+
+buildPythonPackage rec {
+  pname = "django-oauth-toolkit";
+  version = "1.2.0";
+
+  src = fetchFromGitHub {
+    owner = "jazzband";
+    repo = pname;
+    rev = version;
+    sha256 = "1zbksxrcxlqnapmlvx4rgvpqc4plgnq0xnf45cjwzwi1626zs8g6";
+  };
+
+  propagatedBuildInputs = [ django requests oauthlib ];
+
+  # django.core.exceptions.ImproperlyConfigured: Requested setting OAUTH2_PROVIDER, 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 = "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-paintstore/default.nix b/nixpkgs/pkgs/development/python-modules/django-paintstore/default.nix
new file mode 100644
index 000000000000..4fed9bf470b2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-paintstore/default.nix
@@ -0,0 +1,20 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, requests, requests_oauthlib
+, django, python3-openid }:
+
+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..4710de2c7ecb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-picklefield/default.nix
@@ -0,0 +1,30 @@
+{ lib, buildPythonPackage, fetchFromGitHub, django, pytest, pytest-django }:
+
+buildPythonPackage rec {
+  pname = "django-picklefield";
+  version = "3.0.1";
+
+  # The PyPi source doesn't contain tests
+  src = fetchFromGitHub {
+    owner = "gintas";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0ni7bc86k0ra4pc8zv451pzlpkhs1nyil1sq9jdb4m2mib87b5fk";
+  };
+
+  propagatedBuildInputs = [ django ];
+
+  checkInputs = [ pytest pytest-django ];
+
+  checkPhase = ''
+    PYTHONPATH="$(pwd):$PYTHONPATH" \
+    DJANGO_SETTINGS_MODULE=tests.settings \
+      pytest tests/tests.py
+  '';
+
+  meta = {
+    description = "A pickled object field for Django";
+    homepage = "https://github.com/gintas/django-picklefield";
+    license = lib.licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-pipeline/default.nix b/nixpkgs/pkgs/development/python-modules/django-pipeline/default.nix
new file mode 100644
index 000000000000..3276f7a065c7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-pipeline/default.nix
@@ -0,0 +1,37 @@
+{ lib, buildPythonPackage, fetchFromGitHub, isPy3k
+, django, futures, mock, jinja2, jsmin, slimit }:
+
+buildPythonPackage rec {
+  pname = "django-pipeline";
+  version = "1.6.14";
+
+  # no tests on PyPI
+  src = fetchFromGitHub {
+    owner = "jazzband";
+    repo = pname;
+    rev = version;
+    sha256 = "1xf732bd17mgha75jfhlnms46ib2pffhpfa0ca7bmng9jhbvsl9j";
+  };
+
+  postPatch = ''
+    substituteInPlace tests/tests/test_compiler.py \
+      --replace "/usr/bin/env" ""
+  '';
+
+  propagatedBuildInputs = [ django ] ++ lib.optional (!isPy3k) futures;
+
+  checkInputs = [ jinja2 jsmin slimit ] ++ lib.optional (!isPy3k) mock;
+
+  checkPhase = ''
+    export PYTHONPATH=.:$PYTHONPATH
+    export DJANGO_SETTINGS_MODULE=tests.settings
+    ${django}/bin/django-admin.py test tests
+  '';
+
+  meta = with lib; {
+    description = "Pipeline is an asset packaging library for Django";
+    homepage = "https://github.com/cyberdelia/django-pipeline";
+    license = licenses.mit;
+    broken = true;
+  };
+}
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..b3b71231b75b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-polymorphic/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub, python, django, dj-database-url }:
+
+buildPythonPackage rec {
+  pname = "django-polymorphic";
+  version = "2.1.2";
+
+  # PyPI tarball is missing some test files
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0zghrq7y7g2ls38cz6y98qj5xwnn992slhb95qyp6l66d420j179";
+  };
+
+  checkInputs = [ dj-database-url ];
+  propagatedBuildInputs = [ django ];
+
+  checkPhase = ''
+    ${python.interpreter} runtests.py
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/django-polymorphic/django-polymorphic";
+    description = "Improved Django model inheritance with automatic downcasting";
+    license = licenses.bsd3;
+  };
+}
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..f2bd574919aa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-postgresql-netfields/default.nix
@@ -0,0 +1,49 @@
+{ lib, stdenv
+, 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-q/default.nix b/nixpkgs/pkgs/development/python-modules/django-q/default.nix
new file mode 100644
index 000000000000..2eb3b19f554b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-q/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, django-picklefield, arrow
+, blessed, django, future }:
+
+buildPythonPackage rec {
+  pname = "django-q";
+  version = "1.3.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "523d54dcf1b66152c1b658f914f00ed3b518a3432a9decd4898738ca8dbbe10f";
+  };
+
+  propagatedBuildInputs = [
+    django-picklefield arrow blessed django future
+  ];
+
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A multiprocessing distributed task queue for Django";
+    homepage = "https://django-q.readthedocs.org";
+    license = licenses.mit;
+  };
+}
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..d517563590fb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-ranged-response/default.nix
@@ -0,0 +1,23 @@
+{ lib, stdenv, fetchurl, 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..173452ebe484
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-raster/default.nix
@@ -0,0 +1,30 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, isPy3k,
+  numpy, django_colorful, pillow, psycopg2,
+  pyparsing, django, celery, boto3, importlib-metadata
+}:
+if lib.versionOlder django.version "2.0"
+then throw "django-raster requires Django >= 2.0. Consider overiding the python package set to use django_2."
+else
+buildPythonPackage rec {
+  version = "0.8";
+  pname = "django-raster";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "9417d8a17930dffee4719f79a38c6ab5d20ac7145d4edf88df0abcb5a360de51";
+  };
+
+  # 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-rest-auth/default.nix b/nixpkgs/pkgs/development/python-modules/django-rest-auth/default.nix
new file mode 100644
index 000000000000..9e11c2b6a03e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-rest-auth/default.nix
@@ -0,0 +1,29 @@
+{ lib,
+  fetchPypi,
+  django,
+  djangorestframework,
+  six,
+  buildPythonPackage
+}:
+
+buildPythonPackage rec {
+  pname = "django-rest-auth";
+  version = "0.9.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f11e12175dafeed772f50d740d22caeab27e99a3caca24ec65e66a8d6de16571";
+  };
+
+  propagatedBuildInputs = [ django djangorestframework six ];
+
+  # pypi release does not include tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Django app that makes registration and authentication easy";
+    homepage = "https://github.com/Tivix/django-rest-auth";
+    license = licenses.mit;
+    maintainers = [ maintainers.ivegotasthma ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-sampledatahelper/default.nix b/nixpkgs/pkgs/development/python-modules/django-sampledatahelper/default.nix
new file mode 100644
index 000000000000..faad550d4391
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-sampledatahelper/default.nix
@@ -0,0 +1,30 @@
+{ lib, buildPythonPackage, fetchPypi,
+  django, nose, pillow, sampledata, six, versiontools
+}:
+
+buildPythonPackage rec {
+  pname = "django-sampledatahelper";
+  version = "0.5";
+
+  meta = {
+    description = "Helper class for generate sample data for django apps development";
+    homepage = "https://github.com/kaleidos/django-sampledatahelper";
+    license = lib.licenses.bsd3;
+  };
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "3fbc5533f1055f9d1944097f6271e8b18fcf4ed5cc582b518616445145300015";
+  };
+
+  buildInputs = [ django nose pillow sampledata six versiontools ];
+  propagatedBuildInputs = [ django sampledata ];
+
+  # HACK To prevent collision with pythonPackages.sampledata
+  preBuild = ''
+    rm tests/*
+  '';
+
+  # ERROR: test_image_from_directory (tests.tests.TestImageHelpers)
+  doCheck = false;
+}
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..0724bf27b317
--- /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.13";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "5e43ba3b61daf690ac0319157837bb57e31df8bddbdc9a59ef42ef1a99e21fa2";
+    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..468f7e738038
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-sites/default.nix
@@ -0,0 +1,32 @@
+{ lib, buildPythonPackage, fetchPypi, django }:
+
+buildPythonPackage rec {
+  pname = "django-sites";
+  version = "0.10";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f6f9ae55a05288a95567f5844222052b6b997819e174f4bde4e7c23763be6fc3";
+  };
+  # LICENSE file appears to be missing from pypi package, but expected by the installer
+  # https://github.com/niwinz/django-sites/issues/11
+  postPatch = ''
+    touch LICENSE
+  '';
+
+  propagatedBuildInputs = [ django ];
+
+  # required files for test don't seem to be included in pypi package, full source for 0.10
+  # version doesn't appear to be present on github
+  # https://github.com/niwinz/django-sites/issues/9
+  doCheck = false;
+
+  meta = {
+    description = ''
+      Alternative implementation of django "sites" framework
+      based on settings instead of models.
+    '';
+    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-storages/default.nix b/nixpkgs/pkgs/development/python-modules/django-storages/default.nix
new file mode 100644
index 000000000000..869c3bf74eef
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-storages/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi
+, django
+}:
+
+buildPythonPackage rec {
+  pname = "django-storages";
+  version = "1.11.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "c823dbf56c9e35b0999a13d7e05062b837bae36c518a40255d522fbe3750fbb4";
+  };
+
+  propagatedBuildInputs = [ django ];
+
+  # 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;
+
+  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-versatileimagefield/default.nix b/nixpkgs/pkgs/development/python-modules/django-versatileimagefield/default.nix
new file mode 100644
index 000000000000..39912f474204
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-versatileimagefield/default.nix
@@ -0,0 +1,32 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, django
+, python
+, pillow
+, python_magic
+}:
+
+buildPythonPackage rec {
+  pname = "django-versatileimagefield";
+  version = "2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b197e7066f23bb73b001a61525f2b1cae3dd654bf208a944a7ff5a3fe6107b51";
+  };
+  propagatedBuildInputs = [ pillow python_magic ];
+
+  checkInputs = [ django ];
+
+  # tests not included with pypi release
+  doCheck = false;
+
+  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..e3e094ab706a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-webpack-loader/default.nix
@@ -0,0 +1,21 @@
+{ stdenv, lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "django-webpack-loader";
+  version = "0.7.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0izl6bibhz3v538ad5hl13lfr6kvprf62rcl77wq2i5538h8hg3s";
+  };
+
+  # 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..8529df09bb76
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-widget-tweaks/default.nix
@@ -0,0 +1,25 @@
+{ buildPythonPackage, fetchFromGitHub, python, lib, stdenv, django }:
+
+buildPythonPackage rec {
+  pname = "django-widget-tweaks";
+  version = "1.4.8";
+
+  src = fetchFromGitHub { # package from Pypi missing runtests.py
+    owner = "jazzband";
+    repo = pname;
+    rev = version;
+    sha256 = "00w1ja56dc7cyw7a3mph69ax6mkch1lsh4p98ijdhzfpjdy36rbg";
+  };
+
+  checkPhase = "${python.interpreter} runtests.py";
+  propagatedBuildInputs = [ django ];
+
+  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/1.10-gis-libs.template.patch b/nixpkgs/pkgs/development/python-modules/django/1.10-gis-libs.template.patch
new file mode 100644
index 000000000000..da154554d1b3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django/1.10-gis-libs.template.patch
@@ -0,0 +1,24 @@
+diff --git a/django/contrib/gis/gdal/libgdal.py b/django/contrib/gis/gdal/libgdal.py
+--- a/django/contrib/gis/gdal/libgdal.py
++++ b/django/contrib/gis/gdal/libgdal.py
+@@ -17,7 +17,7 @@ try:
+     lib_path = settings.GDAL_LIBRARY_PATH
+ except (AttributeError, EnvironmentError,
+         ImportError, ImproperlyConfigured):
+-    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
+--- a/django/contrib/gis/geos/libgeos.py
++++ b/django/contrib/gis/geos/libgeos.py
+@@ -26,7 +26,7 @@ try:
+         lib_path = settings.GEOS_LIBRARY_PATH
+     except (AttributeError, EnvironmentError,
+             ImportError, ImproperlyConfigured):
+-        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/2.nix b/nixpkgs/pkgs/development/python-modules/django/2.nix
new file mode 100644
index 000000000000..eac48593de20
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django/2.nix
@@ -0,0 +1,38 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, substituteAll,
+  isPy3k,
+  geos, gdal, pytz, sqlparse,
+  withGdal ? false
+}:
+
+buildPythonPackage rec {
+  pname = "Django";
+  version = "2.2.17";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "cf5370a4d7765a9dd6d42a7b96b53c74f9446cd38209211304b210fe0404b861";
+  };
+
+  patches = lib.optional withGdal
+    (substituteAll {
+      src = ./1.10-gis-libs.template.patch;
+      geos = geos;
+      gdal = gdal;
+      extension = stdenv.hostPlatform.extensions.sharedLibrary;
+    })
+  ;
+
+  propagatedBuildInputs = [ pytz sqlparse ];
+
+  # too complicated to setup
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A high-level Python Web framework";
+    homepage = "https://www.djangoproject.com/";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ georgewhewell lsix ];
+  };
+}
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..2444146e8374
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django/3.nix
@@ -0,0 +1,48 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, substituteAll
+, geos
+, gdal
+, asgiref
+, pytz
+, sqlparse
+, pythonOlder
+, withGdal ? false
+}:
+
+buildPythonPackage rec {
+  pname = "Django";
+  version = "3.1.5";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "2d78425ba74c7a1a74b196058b261b9733a8570782f4e2828974777ccca7edf7";
+  };
+
+  patches = lib.optional withGdal
+    (substituteAll {
+      src = ./django_3_set_geos_gdal_lib.patch;
+      geos = geos;
+      gdal = gdal;
+      extension = stdenv.hostPlatform.extensions.sharedLibrary;
+    });
+
+  propagatedBuildInputs = [
+    asgiref
+    pytz
+    sqlparse
+  ];
+
+  # too complicated to setup
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A high-level Python Web framework";
+    homepage = "https://www.djangoproject.com/";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ georgewhewell lsix ];
+  };
+}
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..6b853f8d85f0
--- /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 = "@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_appconf/default.nix b/nixpkgs/pkgs/development/python-modules/django_appconf/default.nix
new file mode 100644
index 000000000000..c9c9913d7644
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django_appconf/default.nix
@@ -0,0 +1,35 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub, six, django, fetchpatch }:
+buildPythonPackage rec {
+  pname = "django-appconf";
+  version = "1.0.3";
+
+  src = fetchFromGitHub {
+    owner = "django-compressor";
+    repo = "django-appconf";
+    rev = version;
+    sha256 = "06hwbz7362y0la9np3df25mms235fcqgpd2vn0mnf8dri9spzy1h";
+  };
+
+  propagatedBuildInputs = [ six django ];
+
+  patches = [
+    (fetchpatch {
+      name = "backport_django_2_2.patch";
+      url = "https://github.com/django-compressor/django-appconf/commit/1526a842ee084b791aa66c931b3822091a442853.patch";
+      sha256 = "1vl2s6vlf15089s8p4c3g4d5iqm8jva66bdw683r8440f80ixgmw";
+    })
+  ];
+
+  checkPhase = ''
+    # prove we're running tests against installed package, not build dir
+    rm -r appconf
+    python -m django test --settings="tests.test_settings"
+  '';
+
+  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_classytags/default.nix b/nixpkgs/pkgs/development/python-modules/django_classytags/default.nix
new file mode 100644
index 000000000000..e0a297e53c0c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django_classytags/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, django
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "django-classy-tags";
+  version = "2.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d59d98bdf96a764dcf7a2929a86439d023b283a9152492811c7e44fc47555bc9";
+  };
+
+  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..468327139e64
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django_colorful/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv
+, 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_compressor/default.nix b/nixpkgs/pkgs/development/python-modules/django_compressor/default.nix
new file mode 100644
index 000000000000..f00804364899
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django_compressor/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi,
+  rcssmin, rjsmin, django_appconf }:
+buildPythonPackage rec {
+    pname = "django_compressor";
+    version = "2.4";
+
+    src = fetchPypi {
+      inherit pname version;
+      sha256 = "0kx7bclfa0sxlsz6ka70zr9ra00lks0hmv1kc99wbanx6xhirvfj";
+    };
+    postPatch = ''
+      substituteInPlace setup.py --replace 'rcssmin == 1.0.6' 'rcssmin' \
+        --replace 'rjsmin == 1.0.12' 'rjsmin'
+    '';
+
+    # requires django-sekizai, which we don't have packaged yet
+    doCheck = false;
+
+    propagatedBuildInputs = [ rcssmin rjsmin django_appconf ];
+
+    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_contrib_comments/default.nix b/nixpkgs/pkgs/development/python-modules/django_contrib_comments/default.nix
new file mode 100644
index 000000000000..a8872967df4d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django_contrib_comments/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, django
+}:
+
+buildPythonPackage rec {
+  pname = "django-contrib-comments";
+  version = "2.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "26350b2c353816570a74b7fb19c558ce00288625ac32886a5274f4f931c098f9";
+  };
+
+  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..fa2618fa1a71
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django_environ/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, django
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "django-environ";
+  version = "0.4.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "6c9d87660142608f63ec7d5ce5564c49b603ea8ff25da595fd6098f6dc82afde";
+  };
+
+  # 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_evolution/default.nix b/nixpkgs/pkgs/development/python-modules/django_evolution/default.nix
new file mode 100644
index 000000000000..dba92efb2d94
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django_evolution/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+, django
+}:
+
+buildPythonPackage rec {
+  pname = "django_evolution";
+  version = "2.1";
+  disabled = isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "997efdc7f27248fd3c5e9eeccae1cfee046dfead037b171d30cbe6e91c9ca3d7";
+  };
+
+  propagatedBuildInputs = [ django ];
+
+  meta = with lib; {
+    description = "A database schema evolution tool for the Django web framework";
+    homepage = "https://github.com/beanbaginc/django-evolution";
+    license = licenses.bsd0;
+    broken = true;
+  };
+
+}
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..60023660ea56
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django_guardian/default.nix
@@ -0,0 +1,22 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi
+, django_environ, mock, django
+, pytest, pytestrunner, pytest-django
+}:
+buildPythonPackage rec {
+  pname = "django-guardian";
+  version = "2.3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ed2de26e4defb800919c5749fb1bbe370d72829fbd72895b6cf4f7f1a7607e1b";
+  };
+
+  checkInputs = [ pytest pytestrunner pytest-django django_environ mock ];
+  propagatedBuildInputs = [ django ];
+
+  meta = with lib; {
+    description = "Per object permissions for Django";
+    homepage = "https://github.com/django-guardian/django-guardian";
+    license = [ licenses.mit licenses.bsd2 ];
+  };
+}
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..500fe2e2fbce
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django_modelcluster/default.nix
@@ -0,0 +1,31 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, pytz
+, pythonOlder
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "django-modelcluster";
+  version = "5.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "783d177f7bf5c8f30fe365c347b9a032920de371fe1c63d955d7b283684d4c08";
+  };
+
+  disabled = pythonOlder "3.5";
+
+  doCheck = false;
+
+  propagatedBuildInputs = [ pytz six ];
+
+  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..7f2f9efcfc5b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django_nose/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv
+, 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_redis/default.nix b/nixpkgs/pkgs/development/python-modules/django_redis/default.nix
new file mode 100644
index 000000000000..434dea7f0f21
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django_redis/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv, fetchPypi, buildPythonPackage,
+  mock, django, redis, msgpack }:
+buildPythonPackage rec {
+  pname = "django-redis";
+  version = "4.12.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "306589c7021e6468b2656edc89f62b8ba67e8d5a1c8877e2688042263daa7a63";
+  };
+
+  doCheck = false;
+
+  buildInputs = [ mock ];
+
+  propagatedBuildInputs = [
+    django
+    redis
+    msgpack
+  ];
+
+  meta = with lib; {
+    description = "Full featured redis cache backend for Django";
+    homepage = "https://github.com/niwibe/django-redis";
+    license = licenses.bsd3;
+  };
+}
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..16574770ff9e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django_reversion/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, django
+}:
+
+buildPythonPackage rec {
+  pname = "django-reversion";
+  version = "3.0.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "49e9930f90322dc6a2754dd26144285cfcc1c5bd0c1c39ca95d5602c5054ae32";
+  };
+
+  # tests assume the availability of a mysql/postgresql database
+  doCheck = false;
+
+  propagatedBuildInputs = [ django ];
+
+  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;
+  };
+
+}
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..66475b35d2a3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django_silk/default.nix
@@ -0,0 +1,64 @@
+{ lib, stdenv
+, buildPythonPackage
+, python
+, fetchFromGitHub
+, django
+, pygments
+, simplejson
+, dateutil
+, requests
+, sqlparse
+, jinja2
+, autopep8
+, pytz
+, pillow
+, mock
+, gprof2dot
+, freezegun
+, contextlib2
+, networkx
+, pydot
+, factory_boy
+}:
+
+buildPythonPackage rec {
+  pname = "django-silk";
+  version = "4.0.1";
+
+  # pypi tarball doesn't include test project
+  src = fetchFromGitHub {
+    owner = "jazzband";
+    repo = "django-silk";
+    rev = version;
+    sha256 = "0yy9rzxvwlp2xvnw76r9hnqajlp417snam92xpb6ay0hxwslwqyb";
+  };
+  # "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}"'
+  '';
+
+  buildInputs = [ mock ];
+  propagatedBuildInputs = [
+    django pygments simplejson dateutil requests
+    sqlparse jinja2 autopep8 pytz pillow gprof2dot
+  ];
+
+  checkInputs = [ freezegun contextlib2 networkx pydot factory_boy ];
+  checkPhase = ''
+    cd project
+    DB=sqlite3 DB_NAME=db.sqlite3 ${python.interpreter} manage.py test
+  '';
+
+  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_taggit/default.nix b/nixpkgs/pkgs/development/python-modules/django_taggit/default.nix
new file mode 100644
index 000000000000..e715dde7c41e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django_taggit/default.nix
@@ -0,0 +1,38 @@
+{ lib, stdenv
+, buildPythonPackage
+, python
+, fetchPypi
+, pythonOlder
+, django
+, mock
+, isort
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "django-taggit";
+  version = "1.3.0";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "4a833bf71f4c2deddd9745924eee53be1c075d7f0020a06f12e29fa3d752732d";
+  };
+
+  propagatedBuildInputs = [ isort django ];
+
+  checkInputs = [ mock ];
+  checkPhase = ''
+    # prove we're running tests against installed package, not build dir
+    rm -r taggit
+    ${python.interpreter} -m django test --settings=tests.settings
+  '';
+
+  meta = with lib; {
+    description = "django-taggit is a reusable Django application for simple tagging";
+    homepage = "https://github.com/alex/django-taggit/tree/master/";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ desiderius ];
+  };
+
+}
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..e734a5f7ae8e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django_treebeard/default.nix
@@ -0,0 +1,30 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, pytest
+, django
+}:
+
+buildPythonPackage rec {
+  pname = "django-treebeard";
+  version = "4.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f50e4eea146f7af6702decf7ef198ac1eee1fb9bb4af2c5dba276c3c48f76623";
+  };
+
+  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..ef9e6be1d3c4
--- /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.14.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d1b1344cb1e037f094c04ccc67b809e8df80dea1e88cfb919078426131737018";
+  };
+
+  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; [ earvstedt ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/djangorestframework-jwt/default.nix b/nixpkgs/pkgs/development/python-modules/djangorestframework-jwt/default.nix
new file mode 100644
index 000000000000..643218242d79
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/djangorestframework-jwt/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, fetchPypi
+, django
+, pyjwt
+, djangorestframework
+, buildPythonPackage
+}:
+
+buildPythonPackage rec {
+  pname = "djangorestframework-jwt";
+  version = "1.11.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "19rng6v1sw14mbjp5cplnrgxjnhlj8faalfw02iihi9s5w1k7zjy";
+  };
+
+  propagatedBuildInputs = [ pyjwt django djangorestframework ];
+
+  # ./runtests.py fails because the project must be tested against a django
+  # installation, there are missing database tables for User, that don't exist.
+  doCheck = false;
+
+  meta = with lib; {
+    description = "JSON Web Token Authentication support for Django REST Framework";
+    homepage = "https://github.com/GetBlimp/django-rest-framework-jwt";
+    license = licenses.mit;
+    maintainers = [ maintainers.ivegotasthma ];
+  };
+}
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..9fb7f882567a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/djangorestframework-simplejwt/default.nix
@@ -0,0 +1,23 @@
+{ lib, buildPythonPackage, fetchPypi, django, djangorestframework, pyjwt }:
+
+buildPythonPackage rec {
+  pname = "djangorestframework_simplejwt";
+  version = "4.6.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "7adc913ba0d2ed7f46e0b9bf6e86f9bd9248f1c4201722b732b8213e0ea66f9f";
+  };
+
+  propagatedBuildInputs = [ django djangorestframework pyjwt ];
+
+  # Test raises django.core.exceptions.ImproperlyConfigured
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A minimal JSON Web Token authentication plugin for Django REST Framework";
+    homepage = "https://github.com/davesque/django-rest-framework-simplejwt";
+    license = licenses.mit;
+    maintainers = [ 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..ce92fab3e965
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/djangorestframework/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub, django, isPy27 }:
+
+buildPythonPackage rec {
+  version = "3.12.2";
+  pname = "djangorestframework";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "encode";
+    repo = "django-rest-framework";
+    rev = version;
+    sha256 = "y/dw6qIOc6NaNpBWJXDwHX9aFodgKv9rGKWQKS6STlk=";
+  };
+
+  # Test settings are missing
+  doCheck = false;
+
+  propagatedBuildInputs = [ django ];
+
+  meta = with lib; {
+    description = "Web APIs for Django, made easy";
+    homepage = "https://www.django-rest-framework.org/";
+    maintainers = with maintainers; [ desiderius ];
+    license = licenses.bsd2;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/djmail/default.nix b/nixpkgs/pkgs/development/python-modules/djmail/default.nix
new file mode 100644
index 000000000000..8efb9788e127
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/djmail/default.nix
@@ -0,0 +1,29 @@
+{ lib, buildPythonPackage, fetchPypi
+, glibcLocales
+, celery, django, psycopg2
+}:
+
+buildPythonPackage rec {
+  pname = "djmail";
+  version = "2.0.0";
+
+  meta = {
+    description = "Simple, powerfull and nonobstructive django email middleware";
+    homepage = "https://github.com/bameda/djmail";
+    license = lib.licenses.bsd3;
+  };
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "cf3ce7626305d218a8bf2b6a219266ef8061aceeefc1c70a54170f4105465202";
+  };
+
+  nativeBuildInputs = [ glibcLocales ];
+
+  LC_ALL = "en_US.UTF-8";
+
+  propagatedBuildInputs = [ celery django psycopg2 ];
+
+  # django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.
+  doCheck = false;
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dkimpy/default.nix b/nixpkgs/pkgs/development/python-modules/dkimpy/default.nix
new file mode 100644
index 000000000000..e7a80d91d24c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dkimpy/default.nix
@@ -0,0 +1,38 @@
+{ lib, stdenv, 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..204c1a985425
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dlib/default.nix
@@ -0,0 +1,28 @@
+{ buildPythonPackage, stdenv, lib, dlib, python, pytest, more-itertools
+, 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 = lib.optional avxSupport "--no USE_AVX_INSTRUCTIONS";
+
+  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/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-sonnet/default.nix b/nixpkgs/pkgs/development/python-modules/dm-sonnet/default.nix
new file mode 100644
index 000000000000..627f8eedaeb1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dm-sonnet/default.nix
@@ -0,0 +1,92 @@
+{ lib
+, fetchFromGitHub
+, buildBazelPackage
+, buildPythonPackage
+, git
+, python
+, six
+, absl-py
+, semantic-version
+, contextlib2
+, wrapt
+, tensorflow
+, tensorflow-probability
+, tensorflow-estimator
+}:
+
+let
+  version = "1.33";
+
+  # first build all binaries and generate setup.py using bazel
+  bazel-build = buildBazelPackage {
+    name = "dm-sonnet-bazel-${version}";
+
+    src = fetchFromGitHub {
+      owner = "deepmind";
+      repo = "sonnet";
+      rev = "v${version}";
+      sha256 = "1nqsja1s8jrkq6v1whgh7smk17313mjr9vs3k5c1m8px4yblzhqc";
+    };
+
+    nativeBuildInputs = [
+      git # needed to fetch the bazel deps (protobuf in particular)
+    ];
+
+    # see https://github.com/deepmind/sonnet/blob/master/docs/INSTALL.md
+    bazelTarget = ":install";
+
+    fetchAttrs = {
+      sha256 = "1dka5nap3d28n18pn3wp5xsi4x3z02h1j8rcjdvi3y6dbqjwdw0v";
+    };
+
+    bazelFlags = [
+      # https://github.com/deepmind/sonnet/issues/134
+      "--incompatible_disable_deprecated_attr_params=false"
+    ];
+
+    buildAttrs = {
+      preBuild = ''
+        patchShebangs .
+      '';
+
+      installPhase = ''
+        # do not generate a wheel, instead just copy the generated files to $out to be installed by buildPythonPackage
+        sed -i 's,.*bdist_wheel.*,cp -rL . "$out"; exit 0,' bazel-bin/install
+
+        # the target directory "dist" does not actually matter since we're not generating a wheel
+        bazel-bin/install dist
+      '';
+    };
+  };
+
+# now use pip to install the package prepared by bazel
+in buildPythonPackage {
+  pname = "dm-sonnet";
+  inherit version;
+
+  src = bazel-build;
+
+  propagatedBuildInputs = [
+    six
+    absl-py
+    semantic-version
+    contextlib2
+    wrapt
+    tensorflow
+    tensorflow-probability
+    tensorflow-estimator
+  ];
+
+  # not sure how to properly run the real test suite -- through bazel?
+  checkPhase = ''
+    ${python.interpreter} -c "import sonnet"
+  '';
+
+  meta = with lib; {
+    description = "TensorFlow-based neural network library";
+    homepage = "https://sonnet.dev";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ timokau ];
+    platforms = platforms.linux;
+  };
+}
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..50ba05aca6f3
--- /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.6";
+
+  src = fetchFromGitHub {
+    owner = "Edinburgh-Genome-Foundry";
+    repo = "DnaChisel";
+    rev = "v${version}";
+    sha256 = "0m88biw7sycjwsmncdybj9n3yf4n9cyvifv9zv7irm8ha3scchji";
+  };
+
+  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..25a2ffea2f08
--- /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.14";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1yz63cgiv910wkx90if09bql1n63lq6hy4wfpqink0q4sxy0mlpv";
+  };
+
+  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/1.nix b/nixpkgs/pkgs/development/python-modules/dnspython/1.nix
new file mode 100644
index 000000000000..30f280a5029e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dnspython/1.nix
@@ -0,0 +1,22 @@
+{ buildPythonPackage, fetchPypi, lib, pythonOlder }:
+
+buildPythonPackage rec {
+  pname = "dnspython";
+  version = "1.16.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "36c5e8e38d4369a08b6780b7f27d790a292b2b08eea01607865bf0936c558e01";
+  };
+
+  # needs networking for some tests
+  doCheck = false;
+
+  meta = {
+    description = "A DNS toolkit for Python 3.x";
+    homepage = "http://www.dnspython.org";
+    # BSD-like, check https://www.dnspython.org/LICENSE for details
+    license = lib.licenses.free;
+  };
+}
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..1d224af0354d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dnspython/default.nix
@@ -0,0 +1,23 @@
+{ buildPythonPackage, fetchPypi, lib, pythonOlder }:
+
+buildPythonPackage rec {
+  pname = "dnspython";
+  version = "2.0.0";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "044af09374469c3a39eeea1a146e8cac27daec951f1f1f157b1962fc7cb9d1b7";
+  };
+
+  # needs networking for some tests
+  doCheck = false;
+
+  meta = {
+    description = "A DNS toolkit for Python 3.x";
+    homepage = "http://www.dnspython.org";
+    # BSD-like, check https://www.dnspython.org/LICENSE for details
+    license = lib.licenses.free;
+  };
+}
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..c2a7df098f4b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/doc8/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pbr
+, docutils
+, six
+, chardet
+, stevedore
+, restructuredtext_lint
+, pygments
+}:
+
+buildPythonPackage rec {
+  pname = "doc8";
+  version = "0.8.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "4d1df12598807cf08ffa9a1d5ef42d229ee0de42519da01b768ff27211082c12";
+  };
+
+  buildInputs = [ pbr ];
+  propagatedBuildInputs = [
+    docutils
+    six
+    chardet
+    stevedore
+    restructuredtext_lint
+    pygments
+  ];
+
+  doCheck = false;
+
+  meta = {
+    description = "Style checker for Sphinx (or other) RST documentation";
+    homepage = "https://launchpad.net/doc8";
+    license = lib.licenses.asl20;
+  };
+}
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..f7982c4a1191
--- /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..543f4994020c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/docker-pycreds/default.nix
@@ -0,0 +1,22 @@
+{ lib, stdenv, 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..5b148a9d62af
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/docker/default.nix
@@ -0,0 +1,46 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, isPy27
+, backports_ssl_match_hostname
+, mock
+, paramiko
+, pytest
+, pytestCheckHook
+, requests
+, six
+, websocket_client
+}:
+
+buildPythonPackage rec {
+  pname = "docker";
+  version = "4.4.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-BgSnRxnV0t5Dh1OTS3Vb/NpvYvSbjkswlppLCiqKEiA=";
+  };
+
+  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 [ "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..74e363d18b97
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dockerfile-parse/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, six, pytestcov, pytest }:
+
+buildPythonPackage rec {
+  version = "1.1.0";
+  pname = "dockerfile-parse";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f37bfa327fada7fad6833aebfaac4a3aaf705e4cf813b737175feded306109e8";
+  };
+
+  postPatch = ''
+    echo " " > tests/requirements.txt \
+  '';
+
+  propagatedBuildInputs = [ six ];
+
+  checkInputs = [ pytestcov pytest ];
+
+  meta = with lib; {
+    description = "Python 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..b6267b87c1bd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dockerpty/default.nix
@@ -0,0 +1,19 @@
+{ lib, stdenv, 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..192fb94bd45a
--- /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 = "0.11.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "83fd8ee012bb32432cb57bd408ff65534749aed8696648e6ac029a87fc474928";
+  };
+
+  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..f1ec269f7cbb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/docloud/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "docloud";
+  version = "1.0.375";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "996d55407498fd01e6c6c480f367048f92255e9ca9db0e9ea19aaef91328a441";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  # 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/default.nix b/nixpkgs/pkgs/development/python-modules/docopt/default.nix
new file mode 100644
index 000000000000..2dc4bb38cf14
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/docopt/default.nix
@@ -0,0 +1,17 @@
+{ lib, stdenv, 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..0fa202addb92
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/docplex/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, futures
+, docloud
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "docplex";
+  version = "2.19.202";
+
+  # No source available from official repo
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "2b606dc645f99feae67dfc528620dddc773ecef5d59bcaeae68bba601f25162b";
+  };
+
+  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..cd1971234a3b
--- /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.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ef6e7433716c0d2c59889aae8bff800b48e82d7e759dfd934b93100dc7bccaa1";
+  };
+
+  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/doctest-ignore-unicode/default.nix b/nixpkgs/pkgs/development/python-modules/doctest-ignore-unicode/default.nix
new file mode 100644
index 000000000000..12d15799ecc6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/doctest-ignore-unicode/default.nix
@@ -0,0 +1,19 @@
+{ lib, stdenv, 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..e24a00564be8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/docutils/default.nix
@@ -0,0 +1,37 @@
+{ stdenv
+, lib
+, fetchPypi
+, buildPythonPackage
+, isPy3k
+, isPy38
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "docutils";
+  version = "0.16";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "c2de3a60e9e7d07be26b7f2b00ca0309c207e06c100f9cc2a94931fc75a478fc";
+  };
+
+  # 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 = {
+    description = "Python Documentation Utilities";
+    homepage = "http://docutils.sourceforge.net/";
+    maintainers = with lib.maintainers; [ AndersonTorres ];
+  };
+}
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..5dba1b91bc17
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dogpile.cache/default.nix
@@ -0,0 +1,45 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, pytest
+, pytestcov
+, mock
+, Mako
+, decorator
+, stevedore
+}:
+
+buildPythonPackage rec {
+  pname = "dogpile.cache";
+  version = "1.1.1";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "40147b19696f387415a7efaaa4cf8ea0b5d31bdd1b53e5187e75d48ddfee9f0e";
+  };
+
+  # Disable concurrency tests that often fail,
+  # probably some kind of timing issue.
+  postPatch = ''
+    rm tests/test_lock.py
+    # Failing tests. https://bitbucket.org/zzzeek/dogpile.cache/issues/116
+    rm tests/cache/test_memcached_backend.py
+  '';
+
+  dontUseSetuptoolsCheck = true;
+  checkPhase = ''
+    pytest
+  '';
+
+  checkInputs = [ pytest pytestcov 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;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dogpile.core/default.nix b/nixpkgs/pkgs/development/python-modules/dogpile.core/default.nix
new file mode 100644
index 000000000000..f6eabc378b3b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dogpile.core/default.nix
@@ -0,0 +1,19 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "dogpile.core";
+  version = "0.4.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0xpdvg4kr1isfkrh1rfsh7za4q5a5s6l2kf9wpvndbwf3aqjyrdy";
+  };
+
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A 'dogpile' lock, typically used as a component of a larger caching solution";
+    homepage = "https://bitbucket.org/zzzeek/dogpile.core";
+    license = licenses.bsd3;
+  };
+}
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..4981440c7ccd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dogtail/default.nix
@@ -0,0 +1,60 @@
+{ 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";
+
+  # 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/default.nix b/nixpkgs/pkgs/development/python-modules/doit/default.nix
new file mode 100644
index 000000000000..36cd0b0ee185
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/doit/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, stdenv
+, fetchPypi
+, buildPythonPackage
+, isPy3k
+, mock
+, pytestCheckHook
+, cloudpickle
+, pyinotify
+, macfsevents
+}:
+
+buildPythonPackage rec {
+  pname = "doit";
+  version = "0.33.1";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "37c3b35c2151647b968b2af24481112b2f813c30f695366db0639d529190a143";
+  };
+
+  propagatedBuildInputs = [ cloudpickle ]
+    ++ lib.optional stdenv.isLinux pyinotify
+    ++ lib.optional stdenv.isDarwin macfsevents;
+
+  checkInputs = [ mock pytestCheckHook ];
+
+  disabledTests = [
+    # depends on doit-py, which has a circular dependency on doit
+    "test___main__.py"
+  ];
+
+  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 ];
+  };
+}
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..3f0cca295dcb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dominate/default.nix
@@ -0,0 +1,20 @@
+{ lib, buildPythonPackage, fetchPypi, isPy3k }:
+
+buildPythonPackage rec {
+  pname = "dominate";
+  version = "2.6.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "76ec2cde23700a6fc4fee098168b9dee43b99c2f1dd0ca6a711f683e8eb7e1e4";
+  };
+
+  doCheck = !isPy3k;
+
+  meta = with lib; {
+    homepage = "https://github.com/Knio/dominate/";
+    description = "Dominate is a Python library for creating and manipulating HTML documents using an elegant DOM API";
+    license = licenses.lgpl3;
+    maintainers = with maintainers; [ ];
+  };
+}
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..538a861c9f4c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dopy/default.nix
@@ -0,0 +1,26 @@
+{ pkgs
+, buildPythonPackage
+, requests
+, six
+}:
+
+buildPythonPackage {
+  version = "2016-01-04";
+  pname = "dopy";
+
+  src = pkgs.fetchFromGitHub {
+    owner = "Wiredcraft";
+    repo = "dopy";
+    rev = "cb443214166a4e91b17c925f40009ac883336dc3";
+    sha256 ="0ams289qcgna96aak96jbz6wybs6qb95h2gn8lb4lmx2p5sq4q56";
+  };
+
+  propagatedBuildInputs = [ requests six ];
+
+  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..2626f420676a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dot2tex/default.nix
@@ -0,0 +1,46 @@
+{ lib, stdenv
+, 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/dotty-dict/default.nix b/nixpkgs/pkgs/development/python-modules/dotty-dict/default.nix
new file mode 100644
index 000000000000..22d469b96693
--- /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.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-6wA1o2KezYQ5emjx9C8elKvRw0V3oZzT6srTMe58uvA=";
+  };
+
+  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/dparse/default.nix b/nixpkgs/pkgs/development/python-modules/dparse/default.nix
new file mode 100644
index 000000000000..6433e0d17a72
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dparse/default.nix
@@ -0,0 +1,23 @@
+{ lib, buildPythonPackage, fetchPypi, isPy27, pytest, toml, pyyaml }:
+
+buildPythonPackage rec {
+  pname = "dparse";
+  version = "0.5.1";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a1b5f169102e1c894f9a7d5ccf6f9402a836a5d24be80a986c7ce9eaed78f367";
+  };
+
+  propagatedBuildInputs = [ toml pyyaml ];
+
+  checkInputs = [ pytest ];
+
+  meta = with lib; {
+    description = "A parser for Python dependency files";
+    homepage = "https://github.com/pyupio/safety";
+    license = licenses.mit;
+    maintainers = with maintainers; [ thomasdesr ];
+  };
+}
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..505bd7bb456c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dpath/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv, fetchPypi, buildPythonPackage, isPy27
+, mock, pytestCheckHook, nose, hypothesis
+}:
+
+buildPythonPackage rec {
+  pname = "dpath";
+  version = "2.0.1";
+  disabled = isPy27; # uses python3 imports
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "bea06b5f4ff620a28dfc9848cf4d6b2bfeed34238edeb8ebe815c433b54eb1fa";
+  };
+
+  # use pytest as nosetests hangs
+  checkInputs = [ mock nose pytestCheckHook hypothesis ];
+
+  meta = with lib; {
+    homepage = "https://github.com/akesterson/dpath-python";
+    license = [ licenses.mit ];
+    description = "A python library for accessing and searching dictionaries via /slashed/paths ala xpath";
+    maintainers = [ maintainers.mmlb ];
+  };
+}
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..177b260e8044
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dpkt/default.nix
@@ -0,0 +1,19 @@
+{ lib, stdenv, fetchPypi, buildPythonPackage }:
+
+buildPythonPackage rec {
+  pname = "dpkt";
+  version = "1.9.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f4e579cbaf6e2285ebf3a9e84019459b4367636bac079ba169527e582fca48b4";
+  };
+
+  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/drf-yasg/default.nix b/nixpkgs/pkgs/development/python-modules/drf-yasg/default.nix
new file mode 100644
index 000000000000..dd92d51d6c6b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/drf-yasg/default.nix
@@ -0,0 +1,40 @@
+{
+  lib, stdenv,
+  buildPythonPackage,
+  fetchPypi,
+  inflection,
+  ruamel_yaml,
+  setuptools_scm,
+  six,
+  coreapi,
+  djangorestframework,
+}:
+
+buildPythonPackage rec {
+  pname = "drf-yasg";
+  version = "1.20.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d50f197c7f02545d0b736df88c6d5cf874f8fea2507ad85ad7de6ae5bf2d9e5a";
+  };
+
+  nativeBuildInputs = [
+    setuptools_scm
+  ];
+
+  propagatedBuildInputs = [
+    six
+    inflection
+    ruamel_yaml
+    coreapi
+    djangorestframework
+  ];
+
+  meta = with lib; {
+    description = "Generation of Swagger/OpenAPI schemas for Django REST Framework";
+    homepage = "https://github.com/axnsan12/drf-yasg";
+    maintainers = with maintainers; [ ivegotasthma ];
+    license = licenses.bsd3;
+  };
+}
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..613d2444d73c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/drms/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, numpy
+, pandas
+, six
+, astropy
+, pytestCheckHook
+, pytest-doctestplus
+}:
+
+buildPythonPackage rec {
+  pname = "drms";
+  version = "0.6.0";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "74efb903f42647ea536de0c5aea4f9a81efe027c95055ec4e72ef62479a04c89";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+    pandas
+    six
+  ];
+
+  checkInputs = [
+    astropy
+    pytestCheckHook
+    pytest-doctestplus
+  ];
+
+  meta = with lib; {
+    description = "Access HMI, AIA and MDI data with Python";
+    homepage = "https://github.com/sunpy/drms";
+    license = licenses.mit;
+    maintainers = [ 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..22e66d0a4a43
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dropbox/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi
+, pytestrunner, requests, urllib3, mock, setuptools }:
+
+buildPythonPackage rec {
+  pname = "dropbox";
+  version = "10.10.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "df43e9e0bdcae6d610dd754a5ec72f2f91a311bbc2c8a28d076df69695b18398";
+  };
+
+  # Set DROPBOX_TOKEN environment variable to a valid token.
+  doCheck = false;
+
+  buildInputs = [ pytestrunner ];
+  propagatedBuildInputs = [ requests urllib3 mock setuptools ];
+
+  meta = with lib; {
+    description = "A Python library for Dropbox's HTTP-based Core and Datastore APIs";
+    homepage = "https://www.dropbox.com/developers/core/docs";
+    license = licenses.mit;
+  };
+}
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/dtopt/default.nix b/nixpkgs/pkgs/development/python-modules/dtopt/default.nix
new file mode 100644
index 000000000000..84631c217089
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dtopt/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "dtopt";
+  version = "0.1";
+  # Test contain Python 2 print
+  disabled = isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "06ae07a12294a7ba708abaa63f838017d1a2faf6147a1e7a14ca4fa28f86da7f";
+  };
+
+  meta = with lib; {
+    description = "Add options to doctest examples while they are running";
+    homepage = "https://pypi.python.org/pypi/dtopt";
+    license = licenses.mit;
+  };
+
+}
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..ea6dfe32fda9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/duckdb/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, duckdb
+, numpy
+, pandas
+, pybind11
+, setuptools_scm
+, pytestrunner
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "duckdb";
+  inherit (duckdb) version src;
+
+  # build attempts to use git to figure out its own version. don't want to add
+  # the dependency for something pointless.
+  postPatch = ''
+    substituteInPlace scripts/package_build.py --replace \
+      "'git'" "'false'"
+  '';
+
+  postConfigure = ''
+    cd tools/pythonpkg
+    export SETUPTOOLS_SCM_PRETEND_VERSION=${version}
+  '';
+
+  nativeBuildInputs = [
+    pybind11
+    setuptools_scm
+    pytestrunner
+  ];
+
+  checkInputs = [
+    pytest
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    pandas
+  ];
+
+  checkPhase = ''
+    pytest
+  '';
+
+  meta = with lib; {
+    description = "DuckDB is an embeddable SQL OLAP Database Management System";
+    homepage = "https://pypi.python.org/pypi/duckdb";
+    license = licenses.mit;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..28aaf8ee47c9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/duecredit/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, contextlib2
+, pytest
+, pytestCheckHook
+, vcrpy
+, citeproc-py
+, requests
+, setuptools
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "duecredit";
+  version = "0.8.0";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1yxd8579pakrfhq0hls0iy37nxllsm8y33na220g08znibrp7ix0";
+  };
+
+  # bin/duecredit requires setuptools at runtime
+  propagatedBuildInputs = [ citeproc-py requests setuptools six ];
+
+  checkInputs = [ contextlib2 pytest pytestCheckHook vcrpy ];
+  disabledTests = [ "test_io" ];
+
+  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/dufte/default.nix b/nixpkgs/pkgs/development/python-modules/dufte/default.nix
new file mode 100644
index 000000000000..d8435afa3f97
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dufte/default.nix
@@ -0,0 +1,44 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+, pythonOlder
+, importlib-metadata
+, matplotlib
+, numpy
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "dufte";
+  version = "0.2.9";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0nkaczipbsm8c14j9svxry2wigmn5iharibb6b8g062sjaph8x17";
+  };
+  format = "pyproject";
+
+  propagatedBuildInputs = [
+    matplotlib
+    numpy
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  preCheck = ''
+    export HOME=$TMPDIR
+    mkdir -p $HOME/.matplotlib
+    echo "backend: ps" > $HOME/.matplotlib/matplotlibrc
+  '';
+  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..09a0f25e18fd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dugong/default.nix
@@ -0,0 +1,14 @@
+{ buildPythonPackage, fetchPypi, pythonOlder }:
+
+buildPythonPackage rec {
+  pname = "dugong";
+  version = "3.7.5";
+
+  disabled = pythonOlder "3.3"; # Library does not support versions older than 3.3
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "tar.bz2";
+    sha256 = "10vjdp21m0gzm096lgl84z184s5l9iz69ppj6acgsc125037dl6h";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dulwich/0_19.nix b/nixpkgs/pkgs/development/python-modules/dulwich/0_19.nix
new file mode 100644
index 000000000000..f0d3bad7a04f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dulwich/0_19.nix
@@ -0,0 +1,30 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi
+, urllib3, certifi
+, gevent, geventhttpclient, mock, fastimport
+, git, glibcLocales }:
+
+buildPythonPackage rec {
+  version = "0.19.16";
+  pname = "dulwich";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f74561c448bfb6f04c07de731c1181ae4280017f759b0bb04fa5770aa84ca850";
+  };
+
+  LC_ALL = "en_US.UTF-8";
+
+  propagatedBuildInputs = [ urllib3 certifi ];
+
+  # Only test dependencies
+  checkInputs = [ git glibcLocales gevent geventhttpclient mock fastimport ];
+
+  doCheck = !stdenv.isDarwin;
+
+  meta = with lib; {
+    description = "Simple Python implementation of the Git file formats and protocols";
+    homepage = "https://samba.org/~jelmer/dulwich/";
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ koral ];
+  };
+}
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..5d4ac94f7fa0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dulwich/default.nix
@@ -0,0 +1,35 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi
+, urllib3, certifi
+, gevent, geventhttpclient, mock, fastimport
+, git, glibcLocales }:
+
+buildPythonPackage rec {
+  version = "0.20.15";
+  pname = "dulwich";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1248942fr12av2rkzpm2fq0qn6rajvv2lcgq65h8kby27qvp65zv";
+  };
+
+  LC_ALL = "en_US.UTF-8";
+
+  propagatedBuildInputs = [ urllib3 certifi ];
+
+  # Only test dependencies
+  checkInputs = [ git glibcLocales gevent geventhttpclient mock fastimport ];
+
+  doCheck = !stdenv.isDarwin;
+
+  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/dyn/default.nix b/nixpkgs/pkgs/development/python-modules/dyn/default.nix
new file mode 100644
index 000000000000..b5fa28f2de6b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dyn/default.nix
@@ -0,0 +1,32 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, pytest, pytestcov, mock
+, pytest_xdist, covCore, glibcLocales }:
+
+buildPythonPackage rec {
+  pname = "dyn";
+  version = "1.8.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "e112149d48b4500c18b3cfb6e0e6e780bb5aa0e56ff87cac412280200b9ec8bf";
+  };
+
+  buildInputs = [ glibcLocales ];
+
+  checkInputs = [
+    pytest
+    pytestcov
+    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/dynd/default.nix b/nixpkgs/pkgs/development/python-modules/dynd/default.nix
new file mode 100644
index 000000000000..f23d19510ee7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dynd/default.nix
@@ -0,0 +1,45 @@
+{ lib, stdenv
+, 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/easy-thumbnails/default.nix b/nixpkgs/pkgs/development/python-modules/easy-thumbnails/default.nix
new file mode 100644
index 000000000000..f2be7b1903da
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/easy-thumbnails/default.nix
@@ -0,0 +1,21 @@
+{ lib, buildPythonPackage, fetchPypi,
+  django, pillow
+}:
+
+buildPythonPackage rec {
+  pname = "easy-thumbnails";
+  version = "2.7.1";
+
+  meta = {
+    description = "Easy thumbnails for Django";
+    homepage = "https://github.com/SmileyChris/easy-thumbnails";
+    license = lib.licenses.bsd3;
+  };
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f862949208d9066cd3d84ffcf9c2dbe9c7344ea6152b741e440f861eca46855c";
+  };
+
+  propagatedBuildInputs = [ django pillow ];
+}
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..441d839d36f6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/easygui/default.nix
@@ -0,0 +1,20 @@
+{ lib, stdenv, fetchPypi, buildPythonPackage }:
+
+buildPythonPackage rec {
+  pname = "easygui";
+  version = "0.98.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1zmvmwgxyzvm83818skhn8b4wrci4kmnixaax8q3ia5cn7xrmj6v";
+  };
+
+  doCheck = false; # No tests available
+
+  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..fc86edf5d4d0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/easyprocess/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "EasyProcess";
+  version = "0.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "115rzzr0hx4af4m6krf7dxn8851n4l8jfxahjzjc2r0zq2m8v57v";
+  };
+
+  # 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..d5c69d4c7e9d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/easysnmp/default.nix
@@ -0,0 +1,56 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, pythonAtLeast
+, fetchFromGitHub
+, net-snmp
+, openssl
+, pytest
+, pytestcov
+, 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
+    pytestcov
+    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..a56ffb952819
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/easywatch/default.nix
@@ -0,0 +1,28 @@
+{ 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;
+
+  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/ecdsa/default.nix b/nixpkgs/pkgs/development/python-modules/ecdsa/default.nix
new file mode 100644
index 000000000000..2a17f84bb3b4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ecdsa/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, pkgs
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "ecdsa";
+  version = "0.16.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "cfc046a2ddd425adbd1a78b3c46f0d1325c657811c0f45ecc3a0a6236c1e50ff";
+  };
+
+  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/ecos/default.nix b/nixpkgs/pkgs/development/python-modules/ecos/default.nix
new file mode 100644
index 000000000000..6c07a5d485a6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ecos/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, pythonOlder
+, buildPythonPackage
+, fetchFromGitHub
+, pkgs
+, numpy
+, scipy
+  # check inputs
+, nose
+}:
+
+buildPythonPackage rec {
+  pname = "ecos";
+  version = "2.0.7.post1";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "embotech";
+    repo = "ecos-python";
+    rev = version;
+    sha256 = "1wzmamz2r4xr2zxgfwnm5q283185d1q6a7zn30vip18lxpys70z0";
+    fetchSubmodules = true;
+  };
+
+  prePatch = ''
+    echo '__version__ = "${version}"' >> ./src/ecos/version.py
+  '';
+
+  propagatedBuildInputs = [
+    numpy
+    scipy
+  ];
+
+  checkInputs = [ nose ];
+  checkPhase = ''
+    # Run tests
+    cd ./src
+    nosetests test_interface.py test_interface_bb.py
+  '';
+  pythonImportsCheck = [ "ecos" ];
+
+  meta = with lib; {
+    description = "Python package for ECOS: Embedded Cone Solver";
+    downloadPage = "https://github.com/embotech/ecos-python/releases";
+    homepage = pkgs.ecos.meta.homepage;
+    license = licenses.asl20;
+    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/ed25519/default.nix b/nixpkgs/pkgs/development/python-modules/ed25519/default.nix
new file mode 100644
index 000000000000..183d7cc3ca55
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ed25519/default.nix
@@ -0,0 +1,18 @@
+{ lib, stdenv, 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/editorconfig/default.nix b/nixpkgs/pkgs/development/python-modules/editorconfig/default.nix
new file mode 100644
index 000000000000..727c3003db5c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/editorconfig/default.nix
@@ -0,0 +1,34 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchgit
+, cmake
+}:
+
+buildPythonPackage rec {
+  pname = "editorconfig";
+  version = "0.12.2";
+
+  # fetchgit used to ensure test submodule is available
+  src = fetchgit {
+    url = "https://github.com/editorconfig/editorconfig-core-py";
+    rev = "596da5e06ebee05bdbdc6224203c79c4d3c6486a"; # Not tagged
+    sha256 = "05cbp971b0zix7kfxkk7ndxb4ax1l21frwc00d4g78mk4sdz6dig";
+  };
+
+  nativeBuildInputs = [ cmake ];
+
+  dontUseCmakeConfigure = true;
+
+  checkPhase = ''
+    cmake .
+    # utf_8_char fails with python3
+    ctest -E "utf_8_char" .
+  '';
+
+  meta = with lib; {
+    homepage = "https://editorconfig.org";
+    description = "EditorConfig File Locator and Interpreter for Python";
+    license = licenses.psfl;
+  };
+
+}
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..c1171043356a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/edward/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv, 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..ae339368ff5d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/eggdeps/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, zope_interface
+, zope_testing
+}:
+
+buildPythonPackage rec {
+  pname = "tl-eggdeps";
+  version = "0.4";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "tl.eggdeps";
+    sha256 = "a99de5e4652865224daab09b2e2574a4f7c1d0d9a267048f9836aa914a2caf3a";
+  };
+
+  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/elasticsearch-dsl/default.nix b/nixpkgs/pkgs/development/python-modules/elasticsearch-dsl/default.nix
new file mode 100644
index 000000000000..67e277b57ac4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/elasticsearch-dsl/default.nix
@@ -0,0 +1,38 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+, elasticsearch
+, ipaddress
+, python-dateutil
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "elasticsearch-dsl";
+  version = "7.3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0ed75f6ff037e36b2397a8e92cae0ddde79b83adc70a154b8946064cb62f7301";
+  };
+
+  propagatedBuildInputs = [ elasticsearch python-dateutil six ]
+                          ++ lib.optional (!isPy3k) ipaddress;
+
+  # 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..4929d1f51a48
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/elasticsearch/default.nix
@@ -0,0 +1,29 @@
+{ buildPythonPackage
+, fetchPypi
+, urllib3, requests
+, nosexcover, mock
+, lib, stdenv
+}:
+
+buildPythonPackage (rec {
+  pname = "elasticsearch";
+  version = "7.10.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a725dd923d349ca0652cf95d6ce23d952e2153740cf4ab6daf4a2d804feeed48";
+  };
+
+  # 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/elementpath/default.nix b/nixpkgs/pkgs/development/python-modules/elementpath/default.nix
new file mode 100644
index 000000000000..bbab0bfe6e4f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/elementpath/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, fetchFromGitHub, isPy27 }:
+
+buildPythonPackage rec {
+  version = "2.1.1";
+  pname = "elementpath";
+  disabled = isPy27; # uses incompatible class syntax
+
+  src = fetchFromGitHub {
+    owner = "sissaschool";
+    repo = "elementpath";
+    rev = "v${version}";
+    sha256 = "1h910v8f0648nqnk40bxgdim3623m07yg4xdfwcips2h55d19rk2";
+  };
+
+  # 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/eliot/default.nix b/nixpkgs/pkgs/development/python-modules/eliot/default.nix
new file mode 100644
index 000000000000..472834c5c725
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/eliot/default.nix
@@ -0,0 +1,56 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, aiocontextvars
+, boltons
+, hypothesis
+, pyrsistent
+, pytest
+, setuptools
+, six
+, testtools
+, zope_interface
+}:
+
+buildPythonPackage rec {
+  pname = "eliot";
+  version = "1.13.0";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "5760194b308a7ab35514ae1b942d88e9f2359071556d82580383f09ca586fff7";
+  };
+
+  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/email-validator/default.nix b/nixpkgs/pkgs/development/python-modules/email-validator/default.nix
new file mode 100644
index 000000000000..5d9f0ca88fa6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/email-validator/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, fetchPypi, isPy3k, dnspython, idna, ipaddress }:
+
+buildPythonPackage rec {
+  pname = "email-validator";
+  version = "1.1.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1a13bd6050d1db4475f13e444e169b6fe872434922d38968c67cea9568cce2f0";
+  };
+
+  doCheck = false;
+
+  propagatedBuildInputs = [
+    dnspython
+    idna
+  ] ++ (if isPy3k then [ ] else [ ipaddress ]);
+
+  meta = with lib; {
+    description = "A robust email syntax and deliverability validation library for Python 2.x/3.x.";
+    homepage    = "https://github.com/JoshData/python-email-validator";
+    license     = licenses.cc0;
+    maintainers = with maintainers; [ siddharthist ];
+    platforms   = platforms.unix;
+  };
+}
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..36553daff55f
--- /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.0";
+  disabled = !isPy3k;
+
+  # pypi is missing files for tests
+  src = fetchFromGitHub {
+    owner = "emersion";
+    repo = "python-emailthreads";
+    rev = "v${version}";
+    sha256 = "17pfal8kbxhs025apkijqbkppw2lljca8x1cwcx49jv60h05c3cn";
+  };
+
+  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/emcee/default.nix b/nixpkgs/pkgs/development/python-modules/emcee/default.nix
new file mode 100644
index 000000000000..12974a9422d6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/emcee/default.nix
@@ -0,0 +1,20 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi
+, numpy }:
+
+buildPythonPackage rec {
+  pname = "emcee";
+  version = "3.0.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "035a44d7594fdd03efd10a522558cdfaa080e046ad75594d0bf2aec80ec35388";
+  };
+
+  propagatedBuildInputs = [ numpy ];
+
+  meta = with lib; {
+    description = "Kick ass affine-invariant ensemble MCMC sampling";
+    homepage = "https://emcee.readthedocs.io/";
+    license = licenses.mit;
+  };
+}
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..d15185e14479
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/emoji/default.nix
@@ -0,0 +1,22 @@
+{ lib, buildPythonPackage, fetchPypi, nose }:
+
+buildPythonPackage rec {
+  pname = "emoji";
+  version = "0.6.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "e42da4f8d648f8ef10691bc246f682a1ec6b18373abfd9be10ec0b398823bd11";
+  };
+
+  checkInputs = [ nose ];
+
+  checkPhase = "nosetests";
+
+  meta = with lib; {
+    description = "Emoji for Python";
+    homepage = "https://pypi.python.org/pypi/emoji/";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ joachifm ];
+  };
+}
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..26d40d8d2052
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/emv/default.nix
@@ -0,0 +1,39 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub
+, click, enum-compat, pyscard, pycountry, terminaltables
+, pytestCheckHook, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "emv";
+  version = "1.0.11";
+  disabled = pythonOlder "3.4";
+
+  src = fetchFromGitHub {
+    owner = "russss";
+    repo = "python-emv";
+    rev = "v${version}";
+    hash = "sha256:1715hcba3fdi0i5awnrjdjnk74p66sxm9349pd8bb717zrh4gpj7";
+  };
+
+  checkInputs = [ pytestCheckHook ];
+  propagatedBuildInputs = [
+    enum-compat
+    click
+    pyscard
+    pycountry
+    terminaltables
+  ];
+
+  # argparse is part of the standardlib
+  prePatch = ''
+    substituteInPlace setup.py \
+      --replace '"argparse==1.4.0",' ""
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/russss/python-emv";
+    description = "Implementation of the EMV chip-and-pin smartcard protocol";
+    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..1102443884f7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/enaml/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, atom
+, ply
+, kiwisolver
+, qtpy
+, sip
+, cppy
+, bytecode
+}:
+
+buildPythonPackage rec {
+  pname = "enaml";
+  version = "0.11.2";
+
+  src = fetchFromGitHub {
+    owner = "nucleic";
+    repo = pname;
+    rev = version;
+    sha256 = "1in5qa5j96qs3gsv8yaxs1l6dbm69xhzvc0pbzg0dd9kpqxfdy1j";
+  };
+
+  # 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"
+  ];
+
+  propagatedBuildInputs = [
+    atom
+    ply
+    kiwisolver
+    qtpy
+    sip
+    cppy
+    bytecode
+  ];
+
+  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..344000fa118e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/enamlx/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, enaml
+, pyqtgraph
+, pythonocc-core
+}:
+
+buildPythonPackage rec {
+  pname = "enamlx";
+  version = "0.4.3";
+
+  src = fetchFromGitHub {
+    owner = "frmdstryr";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1rlrx3cw6h1zl9svnqbzwdfy8469qa1y7w6576lbhdwpfhpipscy";
+  };
+
+  patches = [
+    # Minimally modified version of https://github.com/frmdstryr/enamlx/commit/16df11227b8cee724624541d274e481802ea67e3
+    # (without the change to setup.py), already on master and expected in the first post-0.4.3 release
+    ./replace-unicode-with-str.patch
+  ];
+
+  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/entrance/default.nix b/nixpkgs/pkgs/development/python-modules/entrance/default.nix
new file mode 100644
index 000000000000..2f0f80bcf7a5
--- /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.14";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d1fc9d128ce05837d7e149413fbec71bcf84d9ca510accea56761d3f4bd0a021";
+  };
+
+  # 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/entrypoint2/default.nix b/nixpkgs/pkgs/development/python-modules/entrypoint2/default.nix
new file mode 100644
index 000000000000..d62361e7be08
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/entrypoint2/default.nix
@@ -0,0 +1,36 @@
+{ lib, buildPythonPackage, fetchPypi, EasyProcess, pathpy, pytest }:
+
+buildPythonPackage rec {
+  pname = "entrypoint2";
+  version = "0.2.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "4ac1a8f08477d93282c422faa90875ce5edaa941e1f3fd410b95cb31d9f473a7";
+  };
+
+  propagatedBuildInputs = [ ];
+
+  pythonImportsCheck = [ "entrypoint2" ];
+
+  # argparse is part of the standardlib
+  prePatch = ''
+    substituteInPlace setup.py --replace "argparse" ""
+  '';
+
+  checkInputs = [ EasyProcess pathpy pytest ];
+
+  # 0.2.1 has incompatible pycache files included
+  # https://github.com/ponty/entrypoint2/issues/8
+  checkPhase = ''
+    rm -rf tests/__pycache__
+    pytest tests
+  '';
+
+  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..a26d6ede8904
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/entrypoints/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, configparser
+, pytest
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "entrypoints";
+  version = "0.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "c70dd71abe5a8c85e55e12c19bd91ccfeec11a6e99044204511f9ed547d48451";
+  };
+
+  checkInputs = [ pytest ];
+
+  propagatedBuildInputs = lib.optional (!isPy3k) configparser;
+
+  checkPhase = ''
+    py.test tests
+  '';
+
+  meta = {
+    description = "Discover and load entry points from installed packages";
+    homepage = "https://github.com/takluyver/entrypoints";
+    license = lib.licenses.mit;
+  };
+}
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/enum/default.nix b/nixpkgs/pkgs/development/python-modules/enum/default.nix
new file mode 100644
index 000000000000..ad266623c78b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/enum/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+, isPyPy
+}:
+
+buildPythonPackage rec {
+  pname = "enum";
+  version = "0.4.7";
+  disabled = isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "001iq0yqs9f5bslvl793bhkcs71k5km9kv8yrj5h0lfsgrcg6z4c";
+  };
+
+  doCheck = !isPyPy;
+
+  meta = with lib; {
+    homepage = "https://pypi.python.org/pypi/enum/";
+    description = "Robust enumerated type support in Python";
+    license = licenses.gpl2;
+  };
+
+}
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..5e26853098fb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/enum34/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv
+, 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/envisage/default.nix b/nixpkgs/pkgs/development/python-modules/envisage/default.nix
new file mode 100644
index 000000000000..397e573a252f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/envisage/default.nix
@@ -0,0 +1,46 @@
+{ lib, fetchPypi, fetchpatch, isPy27
+, buildPythonPackage
+, traits, apptools
+, python, ipykernel, ipython
+}:
+
+buildPythonPackage rec {
+  pname = "envisage";
+  version = "4.9.2";
+
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1srjmkhnz84nz5jd72vdsnc4fn7dd9jr8nyf3hzk6yx1dsn815gd";
+  };
+
+  propagatedBuildInputs = [ traits apptools ];
+
+  preCheck = ''
+    export HOME=$PWD/HOME
+  '';
+
+  # fix a test failure; should be merged in next release
+  patches = [ (fetchpatch {
+    url = "https://github.com/enthought/envisage/pull/248/commits/7b6d2dd615d5cb7455b200eb8f37e030bbf4df9e.patch";
+    sha256 = "0a3dmbpxwsn1bkjcjv9v7b751rcmppj6hc9wcgiayg4l9r2nrvyh";
+  }) ];
+
+  checkInputs = [
+    ipykernel ipython
+  ];
+
+  checkPhase = ''
+    runHook preCheck
+    ${python.interpreter} -m unittest
+    runHook postCheck
+  '';
+
+  meta = with lib; {
+    description = "Framework for building applications whose functionalities can be extended by adding 'plug-ins'";
+    homepage = "https://github.com/enthought/envisage";
+    maintainers = with lib.maintainers; [ knedlsepp ];
+    license = licenses.bsdOriginal;
+  };
+}
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..133e99912cbd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/envs/default.nix
@@ -0,0 +1,22 @@
+{ lib, buildPythonPackage, fetchPypi
+, mock, jinja2, click, terminaltables
+}:
+
+buildPythonPackage rec {
+  pname = "envs";
+  version = "1.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ccf5cd85ddb8ed335e39ed8a22e0d23658f5a6d7da430f225e6f750c6f50ae42";
+  };
+
+  checkInputs = [ mock jinja2 click terminaltables ];
+
+  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..d74595431639
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/epc/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv
+, 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..4d6e59409266
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ephem/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, isPy3k
+, glibcLocales, pytest }:
+
+buildPythonPackage rec {
+  pname = "ephem";
+  version = "3.7.7.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "36b51a8dc7cfdeb456dd6b8ab811accab8341b2d562ee3c6f4c86f6d3dbb984e";
+  };
+
+  patchFlags = [ "-p0" ];
+  checkInputs = [ pytest glibcLocales ];
+  # JPLTest uses assets not distributed in package
+  checkPhase = ''
+    LC_ALL="en_US.UTF-8" py.test --pyargs ephem.tests -k "not JPLTest"
+  '';
+
+  meta = with lib; {
+    description = "Compute positions of the planets and stars";
+    homepage = "https://pypi.python.org/pypi/ephem/";
+    license = licenses.lgpl3;
+    maintainers = with maintainers; [ chrisrosset ];
+  };
+}
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..45f0599ea2d7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/eradicate/default.nix
@@ -0,0 +1,19 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "eradicate";
+  version = "2.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "27434596f2c5314cc9b31410c93d8f7e8885747399773cd088d3adea647a60c8";
+  };
+
+  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/et_xmlfile/default.nix b/nixpkgs/pkgs/development/python-modules/et_xmlfile/default.nix
new file mode 100644
index 000000000000..5ba9490d945a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/et_xmlfile/default.nix
@@ -0,0 +1,40 @@
+{ lib, stdenv
+, 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; [ sjourdois ];
+  };
+
+}
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..338992259a14
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/etcd/default.nix
@@ -0,0 +1,34 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchurl
+, simplejson
+, pytz
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "etcd";
+  version = "2.0.8";
+
+  # PyPI package is incomplete
+  src = fetchurl {
+    url = "https://github.com/dsoprea/PythonEtcdClient/archive/${version}.tar.gz";
+    sha256 = "0fi6rxa1yxvz7nwrc7dw6fax3041d6bj3iyhywjgbkg7nadi9i8v";
+  };
+
+  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..7832f6b4787a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/etebase/default.nix
@@ -0,0 +1,61 @@
+{ lib, stdenv
+, wheel
+, rustPlatform
+, pipInstallHook
+, setuptools-rust
+, python
+, msgpack
+, requests
+, openssl
+, perl
+, rustfmt
+, fetchFromGitHub
+, Security
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "etebase";
+  version = "0.31.1";
+
+  src = fetchFromGitHub {
+    owner = "etesync";
+    repo = "etebase-py";
+    rev = "v${version}";
+    sha256 = "163iw64l8lwawf84qswcjsq9p8qddv9ysjrr3dzqpqxb2yb0sy39";
+  };
+
+  cargoSha256 = "0w8ypl6kj1mf6ahbdiwbd4jw6ldxdaig47zwk91jjsww5lbyx4lf";
+
+  nativeBuildInputs = [
+    rustfmt
+    perl
+    openssl
+    pipInstallHook
+    setuptools-rust
+    wheel
+  ];
+
+  buildInputs = lib.optionals stdenv.isDarwin [ Security ];
+
+  propagatedBuildInputs = [
+    python
+    msgpack
+  ];
+
+  doCheck = true;
+
+  buildPhase = ''
+    ${python.interpreter} setup.py bdist_wheel
+  '';
+
+  installPhase = ''
+    pipInstallPhase
+  '';
+
+  meta = with lib; {
+    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..869c6ccba92c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/etelemetry/default.nix
@@ -0,0 +1,30 @@
+{ lib, buildPythonPackage, fetchPypi, isPy27, ci-info, ci-py, requests, pytest }:
+
+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/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-hash/default.nix b/nixpkgs/pkgs/development/python-modules/eth-hash/default.nix
new file mode 100644
index 000000000000..ad58ee3ae2fe
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/eth-hash/default.nix
@@ -0,0 +1,45 @@
+{ lib, fetchPypi, buildPythonPackage, pythonOlder, pytest, pysha3, pycrypto,
+  pycryptodome }:
+
+buildPythonPackage rec {
+  pname = "eth-hash";
+  version = "0.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0xpiz0wrxxj11ki9yapvsibl25qnki90bl3d39nqascg14nw17a9";
+  };
+
+  checkInputs = [ pytest ];
+
+  propagatedBuildInputs = [ pysha3 pycrypto pycryptodome ];
+
+  # setuptools-markdown uses pypandoc which is broken at the moment
+  preConfigure = ''
+    substituteInPlace setup.py --replace \'setuptools-markdown\' ""
+  '';
+
+  # Run tests separately because we don't want to run tests on tests/backends/
+  # but only on its selected subdirectories. Also, the directories under
+  # tests/backends/ must be run separately because they have identically named
+  # test files so pytest would raise errors because of that.
+  #
+  # Also, tests in tests/core/test_import.py are broken so just ignore them:
+  # https://github.com/ethereum/eth-hash/issues/25
+  # There is a pull request to fix the tests:
+  # https://github.com/ethereum/eth-hash/pull/26
+  checkPhase = ''
+    pytest tests/backends/pycryptodome/
+    pytest tests/backends/pysha3/
+    # pytest tests/core/
+  '';
+
+  disabled = pythonOlder "3.5";
+
+  meta = {
+    description = "The Ethereum hashing function keccak256";
+    homepage = "https://github.com/ethereum/eth-hash";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ jluttine ];
+  };
+}
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..87aa914b59f7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/eth-typing/default.nix
@@ -0,0 +1,35 @@
+{ lib, fetchFromGitHub, buildPythonPackage, pythonOlder, pytest }:
+
+buildPythonPackage rec {
+  pname = "eth-typing";
+  version = "2.2.1";
+
+  # Tests are missing from the PyPI source tarball so let's use GitHub
+  # https://github.com/ethereum/eth-typing/issues/8
+  src = fetchFromGitHub {
+    owner = "ethereum";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0k9jydsclk81qpkvl7hpchwclm3c89gyzlk17480wcw90nkps9ap";
+  };
+
+  # setuptools-markdown uses pypandoc which is broken at the moment
+  preConfigure = ''
+    substituteInPlace setup.py --replace \'setuptools-markdown\' ""
+  '';
+
+  disabled = pythonOlder "3.5";
+
+  checkInputs = [ pytest ];
+
+  checkPhase = ''
+    pytest .
+  '';
+
+  meta = {
+    description = "Common type annotations for Ethereum Python packages";
+    homepage = "https://github.com/ethereum/eth-typing";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ jluttine ];
+  };
+}
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..9c67f0816e37
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/eth-utils/default.nix
@@ -0,0 +1,28 @@
+{ lib, fetchFromGitHub, buildPythonPackage, pytestCheckHook, eth-hash, eth-typing,
+  cytoolz, hypothesis }:
+
+buildPythonPackage rec {
+  pname = "eth-utils";
+  version = "1.9.5";
+
+  # Tests are missing from the PyPI source tarball so let's use GitHub
+  # https://github.com/ethereum/eth-utils/issues/130
+  src = fetchFromGitHub {
+    owner = "ethereum";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1h3xlw74zdf6cfvqf9193lx05bpdm05pmy9ap1g7q2kx0j2b6352";
+  };
+
+  checkInputs = [ pytestCheckHook hypothesis ];
+  propagatedBuildInputs = [ eth-hash eth-typing cytoolz ];
+
+  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; [ jluttine ];
+  };
+}
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..1a3f2a0e642e
--- /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.4.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "8782740eb1a86b187334c07feb5127d3faa0b236e113206dfe3ae8f77fb1aaf1";
+  };
+
+  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..b931db188e3e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/eve/default.nix
@@ -0,0 +1,41 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, flask
+, events
+, pymongo
+, simplejson
+, cerberus
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "Eve";
+  version = "1.1.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "3a057277bba7144a0c15ab8c737dc8a1002e87e7284847aa011ce122e353418e";
+  };
+
+  propagatedBuildInputs = [
+    cerberus
+    events
+    flask
+    pymongo
+    simplejson
+    setuptools
+  ];
+
+  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";
+    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..93b058859858
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/eventlet/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, dnspython
+, enum34
+, greenlet
+, monotonic
+, six
+, nose
+}:
+
+buildPythonPackage rec {
+  pname = "eventlet";
+  version = "0.30.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "19d6f3aa9525221ba60d0ec31b570508021af7ad5497fb77f77501fe9a7c34d3";
+  };
+
+  propagatedBuildInputs = [ dnspython greenlet monotonic six ]
+    ++ lib.optional (pythonOlder "3.4") enum34;
+
+  prePatch = ''
+    substituteInPlace setup.py \
+      --replace "dnspython >= 1.15.0, < 2.0.0" "dnspython"
+  '';
+
+  checkInputs = [ nose ];
+
+  doCheck = false;  # too much transient errors to bother
+
+  # unfortunately, it needs /etc/protocol to be present to not fail
+  #pythonImportsCheck = [ "eventlet" ];
+
+  meta = with lib; {
+    homepage = "https://pypi.python.org/pypi/eventlet/";
+    description = "A concurrent networking library for Python";
+    license = licenses.mit;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/eventlib/default.nix b/nixpkgs/pkgs/development/python-modules/eventlib/default.nix
new file mode 100644
index 000000000000..1b2b44d65f70
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/eventlib/default.nix
@@ -0,0 +1,30 @@
+{ lib, stdenv
+, buildPythonPackage
+, isPy3k
+, fetchdarcs
+, greenlet
+}:
+
+buildPythonPackage rec {
+  pname = "python-eventlib";
+  version = "0.2.4";
+  # Judging from SyntaxError
+  disabled = isPy3k;
+
+  src = fetchdarcs {
+    url = "http://devel.ag-projects.com/repositories/${pname}";
+    rev = "release-${version}";
+    sha256 = "1w1axsm6w9bl2smzxmyk4in1lsm8gk8ma6y183m83cpj66aqxg4z";
+  };
+
+  propagatedBuildInputs = [ greenlet ];
+
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Eventlib bindings for python";
+    homepage    = "https://ag-projects.com/";
+    license     = licenses.lgpl2;
+  };
+
+}
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..70c7fad963af
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/evernote/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv
+, 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/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/exchangelib/default.nix b/nixpkgs/pkgs/development/python-modules/exchangelib/default.nix
new file mode 100644
index 000000000000..e380ca613cfd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/exchangelib/default.nix
@@ -0,0 +1,38 @@
+{ lib, stdenv, fetchFromGitHub, buildPythonPackage,
+  pythonOlder,
+  lxml, tzlocal, python-dateutil, pygments, requests-kerberos,
+  defusedxml, cached-property, isodate, requests_ntlm, dnspython,
+  psutil, requests-mock, pyyaml,
+  oauthlib, requests_oauthlib,
+  flake8,
+}:
+
+buildPythonPackage rec {
+  pname = "exchangelib";
+  version = "3.2.1";
+  disabled = pythonOlder "3.5";
+
+  # tests are not present in the PyPI version
+  src = fetchFromGitHub {
+    owner = "ecederstrand";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1sh780q2iwdm3bnlnfdacracf0n7jhbv0g39cdx65v3d510zp4jv";
+  };
+
+  checkInputs = [ psutil requests-mock pyyaml
+    flake8
+  ];
+  propagatedBuildInputs = [
+    lxml tzlocal python-dateutil pygments requests-kerberos
+    defusedxml cached-property isodate requests_ntlm dnspython
+    oauthlib requests_oauthlib
+  ];
+
+  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/exchangelib/skip_failing_test.patch b/nixpkgs/pkgs/development/python-modules/exchangelib/skip_failing_test.patch
new file mode 100644
index 000000000000..6c070acaf75a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/exchangelib/skip_failing_test.patch
@@ -0,0 +1,18 @@
+--- ./tests/__init__.py	1980-01-02 00:00:00.000000000 +0000
++++ ./tests/__init__.py	1980-01-02 00:00:00.000000000 +0000
+@@ -301,6 +301,7 @@
+             self.assertEqual(id(base_p.thread_pool), id(p.thread_pool))
+             self.assertEqual(id(base_p._session_pool), id(p._session_pool))
+ 
++    @unittest.skip("no network connection inside the Nix sandbox")
+     def test_close(self):
+         proc = psutil.Process()
+         ip_addresses = {info[4][0] for info in socket.getaddrinfo(
+@@ -1257,6 +1258,7 @@
+         )
+ 
+ 
++@unittest.skip("no network connection inside the Nix sandbox")
+ class EWSTest(unittest.TestCase):
+     @classmethod
+     def setUpClass(cls):
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..0a22ab4b0516
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/execnet/default.nix
@@ -0,0 +1,46 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, isPyPy
+, fetchPypi
+, pytest
+, setuptools_scm
+, apipkg
+}:
+
+buildPythonPackage rec {
+  pname = "execnet";
+  version = "1.7.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "cacb9df31c9680ec5f95553976c4da484d407e85e41c83cb812aa014f0eddc50";
+  };
+
+  checkInputs = [ pytest ];
+  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"}
+  '';
+
+  checkPhase = ''
+    py.test testing
+  '';
+
+  __darwinAllowLocalNetworking = true;
+
+  meta = with lib; {
+    description = "Rapid multi-Python deployment";
+    license = licenses.gpl2;
+    homepage = "https://execnet.readthedocs.io/";
+    maintainers = with maintainers; [ nand0p ];
+  };
+
+}
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..84026d7374c4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/executing/default.nix
@@ -0,0 +1,20 @@
+{ lib, buildPythonPackage, fetchzip, pytest, asttokens }:
+
+buildPythonPackage rec {
+  pname = "executing";
+  version = "0.4.3";
+
+  src = fetchzip {
+    url = "https://github.com/alexmojaki/executing/archive/v${version}.tar.gz";
+    sha256 = "1fqfc26nl703nsx2flzf7x4mgr3rpbd8pnn9c195rca648zhi3nh";
+  };
+
+  checkInputs = [ pytest asttokens ];
+
+  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/exifread/default.nix b/nixpkgs/pkgs/development/python-modules/exifread/default.nix
new file mode 100644
index 000000000000..e86a681a8e39
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/exifread/default.nix
@@ -0,0 +1,22 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "ExifRead";
+  version = "2.3.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a0f74af5040168d3883bbc980efe26d06c89f026dc86ba28eb34107662d51766";
+  };
+
+  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; [ vozz ];
+  };
+
+}
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..08faf5c2ba84
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/eyed3/default.nix
@@ -0,0 +1,52 @@
+{ stdenv
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, python
+, isPyPy
+, six
+, lib
+, 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..6dfefe092040
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ezdxf/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv, 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/fabulous/default.nix b/nixpkgs/pkgs/development/python-modules/fabulous/default.nix
new file mode 100644
index 000000000000..6079f22020a2
--- /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.3.0";
+
+  src = fetchFromGitHub {
+    owner = "jart";
+    repo = pname;
+    rev = version;
+    sha256 = "0yxdaz6yayp1a57kdb2i8q7kwwdlwy4a3d0lr012h2ji9m89c8q7";
+  };
+
+  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..89e7156fa524
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/face/default.nix
@@ -0,0 +1,31 @@
+{ lib, stdenv, 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..1896bdfac592
--- /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, stdenv, 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; [ ma27 ];
+    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..d5838438b7d9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/face_recognition_models/default.nix
@@ -0,0 +1,23 @@
+{ buildPythonPackage, lib, stdenv, 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; [ ma27 ];
+    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..a953632f9fd7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/factory_boy/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, faker
+, python
+, ipaddress
+}:
+
+buildPythonPackage rec {
+  pname = "factory_boy";
+  version = "3.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ded73e49135c24bd4d3f45bf1eb168f8d290090f5cf4566b8df3698317dc9c08";
+  };
+
+  propagatedBuildInputs = [ faker ] ++ lib.optionals isPy27 [ ipaddress ];
+
+  # tests not included with pypi release
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A Python package to create factories for complex objects";
+    homepage    = "https://github.com/rbarrois/factory_boy";
+    license     = licenses.mit;
+  };
+
+}
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..be26ab98af62
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fake-useragent/default.nix
@@ -0,0 +1,22 @@
+{ lib, stdenv, 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/fake_factory/default.nix b/nixpkgs/pkgs/development/python-modules/fake_factory/default.nix
new file mode 100644
index 000000000000..82af8d04e077
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fake_factory/default.nix
@@ -0,0 +1,37 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, python
+, six
+, dateutil
+, ipaddress
+, mock
+}:
+
+buildPythonPackage rec {
+  pname = "fake-factory";
+  version = "9999.9.9";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f5bd18deb22ad8cb4402513c025877bc6b50de58902d686b6b21ba8981dce260";
+  };
+
+  propagatedBuildInputs = [ six dateutil ipaddress mock ];
+
+  # fake-factory is depreciated and single test will always fail
+  doCheck = false;
+
+  checkPhase = ''
+    ${python.interpreter} -m unittest faker.tests
+  '';
+
+  meta = with lib; {
+    description = "A Python package that generates fake data for you";
+    homepage    = "https://pypi.python.org/pypi/fake-factory";
+    license     = licenses.mit;
+    maintainers = with maintainers; [ lovek323 ];
+    platforms   = platforms.unix;
+  };
+
+}
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..990908efe034
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/faker/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, dateutil
+, text-unidecode
+, freezegun
+, pytestCheckHook
+, ukpostcodeparser
+, validators
+}:
+
+buildPythonPackage rec {
+  pname = "Faker";
+  version = "5.5.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1bskhmiir1ajipj7j535j2mxgnp6s3mxbvlag4aryj9zbhgg1c19";
+  };
+
+  propagatedBuildInputs = [
+    dateutil
+    text-unidecode
+  ];
+
+  checkInputs = [
+    freezegun
+    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/falcon/default.nix b/nixpkgs/pkgs/development/python-modules/falcon/default.nix
new file mode 100644
index 000000000000..8d1aa02026c1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/falcon/default.nix
@@ -0,0 +1,34 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, coverage
+, ddt
+, nose
+, pyyaml
+, requests
+, testtools
+}:
+
+buildPythonPackage rec {
+  pname = "falcon";
+  version = "2.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "eea593cf466b9c126ce667f6d30503624ef24459f118c75594a69353b6c3d5fc";
+  };
+
+  checkInputs = [coverage ddt nose pyyaml requests testtools];
+
+  # The travis build fails since the migration from multiprocessing to threading for hosting the API under test.
+  # OSError: [Errno 98] Address already in use
+  doCheck = false;
+
+  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/fastapi/default.nix b/nixpkgs/pkgs/development/python-modules/fastapi/default.nix
new file mode 100644
index 000000000000..dadfc41c68bc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fastapi/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pydantic
+, starlette
+, pytestCheckHook
+, pytest-asyncio
+, aiosqlite
+, databases
+, flask
+, httpx
+, passlib
+, peewee
+, python-jose
+, sqlalchemy
+}:
+
+buildPythonPackage rec {
+  pname = "fastapi";
+  version = "0.63.0";
+  format = "flit";
+
+  src = fetchFromGitHub {
+    owner = "tiangolo";
+    repo = "fastapi";
+    rev = version;
+    sha256 = "0l3imrcs42pqf9d6k8c1q15k5sqcnapl5zk71xl52mrxhz49lgpi";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "starlette ==0.13.6" "starlette"
+  '';
+
+  propagatedBuildInputs = [
+    starlette
+    pydantic
+  ];
+
+  checkInputs = [
+    aiosqlite
+    databases
+    flask
+    httpx
+    passlib
+    peewee
+    python-jose
+    pytestCheckHook
+    pytest-asyncio
+    sqlalchemy
+  ];
+
+  # disabled tests require orjson which requires rust nightly
+  pytestFlagsArray = [ "--ignore=tests/test_default_response_class.py" ];
+  disabledTests = [ "test_get_custom_response" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/tiangolo/fastapi";
+    description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production";
+    license = licenses.mit;
+    maintainers = with maintainers; [ wd15 ];
+  };
+}
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/fastdiff/default.nix b/nixpkgs/pkgs/development/python-modules/fastdiff/default.nix
new file mode 100644
index 000000000000..b3e27d7a5e81
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fastdiff/default.nix
@@ -0,0 +1,30 @@
+{ lib, buildPythonPackage, fetchPypi, pytestCheckHook, pytest-benchmark, wasmer }:
+
+buildPythonPackage rec {
+  pname = "fastdiff";
+  version = "0.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1ai95vjchl4396zjl1b69xfqvn9kn1y7c40d9l0qxdss0pcx6fk2";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace 'pytest-runner' ""
+  '';
+
+  propagatedBuildInputs = [ wasmer ];
+
+  checkInputs = [ pytestCheckHook pytest-benchmark ];
+
+  pythonImportsCheck = [ "fastdiff" ];
+  disabledTests = [ "test_native" ];
+
+  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 ];
+  };
+}
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..04d9da87c5c1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fastecdsa/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, gmp
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "fastecdsa";
+  version = "2.1.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d0772f7fe243e8a82d33e95c542ea6cc0ef7f3cfcced7440d6defa71a35addfa";
+  };
+
+  buildInputs = [ gmp ];
+
+  checkInputs = [ pytestCheckHook ];
+
+  # skip tests which require being online to download test vectors
+  pytestFlags = [
+     "--ignore=fastecdsa/tests/test_wycheproof_vectors.py"
+     "--ignore=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..57ad69c0be41
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fasteners/default.nix
@@ -0,0 +1,35 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, six
+, monotonic
+, testtools
+, isPy3k
+, nose
+, futures
+}:
+
+buildPythonPackage rec {
+  pname = "fasteners";
+  version = "0.15";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "3a176da6b70df9bb88498e1a18a9e4a8579ed5b9141207762368a1017bf8f5ef";
+  };
+
+  propagatedBuildInputs = [ six monotonic ];
+
+  checkInputs = [ testtools nose ] ++ lib.optionals (!isPy3k) [ futures ];
+
+  checkPhase = ''
+    nosetests
+  '';
+
+  meta = with lib; {
+    description = "A python package that provides useful locks";
+    homepage = "https://github.com/harlowja/fasteners";
+    license = licenses.asl20;
+  };
+
+}
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..eb86784ddc7b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fastentrypoints/default.nix
@@ -0,0 +1,18 @@
+{ lib, stdenv, 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..55aad9d71ea5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fastimport/default.nix
@@ -0,0 +1,22 @@
+{ lib, stdenv, buildPythonPackage, python, fetchPypi}:
+
+buildPythonPackage rec {
+  pname = "fastimport";
+  version = "0.9.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b2f2e8eb97000256e1aab83d2a0a053fc7b93c3aa4f7e9b971a5703dfc5963b9";
+  };
+
+  checkPhase = ''
+    ${python.interpreter} -m unittest discover
+  '';
+
+  meta = with lib; {
+    homepage = "https://launchpad.net/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..34eb0a158d97
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fastjsonschema/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+  # Check inputs
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "fastjsonschema";
+  version = "2.14.5";
+
+  disabled = pythonOlder "3.3";
+
+  src = fetchFromGitHub {
+    owner = "horejsek";
+    repo = "python-fastjsonschema";
+    rev = "v${version}";
+    fetchSubmodules = true;
+    sha256 = "1hgzafswdw5zqrd8qhdxa43crzfy7lrlifdn90133a0h3psr7qs1";
+  };
+
+  checkInputs = [ pytestCheckHook ];
+  dontUseSetuptoolsCheck = true;
+  disabledTests = [
+    "benchmark"
+
+    # these tests require network access
+    "remote ref"
+    "definitions"
+  ];
+
+  meta = with lib; {
+    description = "Fast 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/fastpair/default.nix b/nixpkgs/pkgs/development/python-modules/fastpair/default.nix
new file mode 100644
index 000000000000..82964070d03b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fastpair/default.nix
@@ -0,0 +1,35 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub, pytestrunner, pytest, scipy }:
+
+buildPythonPackage {
+  pname = "fastpair";
+  version = "2016-07-05";
+
+  src = fetchFromGitHub {
+    owner = "carsonfarmer";
+    repo = "fastpair";
+    rev = "92364962f6b695661f35a117bf11f96584128a8d";
+    sha256 = "1pv9sxycxdk567s5gs947rhlqngrb9nn9yh4dhdvg1ix1i8dca71";
+  };
+
+  nativeBuildInputs = [ pytestrunner ];
+
+  checkInputs = [ pytest ];
+
+  propagatedBuildInputs = [
+    scipy
+  ];
+
+  # Does not support pytest 4 https://github.com/carsonfarmer/fastpair/issues/14
+  doCheck = false;
+
+  checkPhase = ''
+    pytest fastpair
+  '';
+
+  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 ];
+  };
+}
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..07922ee19efa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fastparquet/default.nix
@@ -0,0 +1,31 @@
+{ lib, buildPythonPackage, fetchFromGitHub, numba, numpy, pandas, pytestrunner,
+thrift, pytest, python-snappy, lz4, zstd }:
+
+buildPythonPackage rec {
+  pname = "fastparquet";
+  version = "0.5.0";
+
+  src = fetchFromGitHub {
+    owner = "dask";
+    repo = pname;
+    rev = version;
+    sha256 = "17i091kky34m2xivk29fqsyxxxa7v4352n79w01n7ni93za6wana";
+  };
+
+  postPatch = ''
+    # FIXME: package zstandard
+    # removing the test dependency for now
+    substituteInPlace setup.py --replace "'zstandard'," ""
+  '';
+
+  nativeBuildInputs = [ pytestrunner ];
+  propagatedBuildInputs = [ numba numpy pandas thrift ];
+  checkInputs = [ pytest python-snappy lz4 zstd ];
+
+  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..e033dc42d457
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fastpbkdf2/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv, 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 ];
+
+  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..25cc2b8792f7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fastprogress/default.nix
@@ -0,0 +1,32 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, numpy
+, pytest
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "fastprogress";
+  version = "1.0.0";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1zhv37q6jkqd1pfhlkd4yzrc3dg83vyksgzf32mjlhd5sb0qmql9";
+  };
+
+  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..7aedbbdd8f7c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fastrlock/default.nix
@@ -0,0 +1,18 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "fastrlock";
+  version = "0.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "9ae1a31f6e069b5f0f28ba63c594d0c952065de0a375f7b491d21ebaccc5166f";
+  };
+
+  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..bf3bd987564a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fasttext/default.nix
@@ -0,0 +1,22 @@
+{lib, stdenv, buildPythonPackage, fetchFromGitHub, 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; [ danieldk ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/faulthandler/default.nix b/nixpkgs/pkgs/development/python-modules/faulthandler/default.nix
new file mode 100644
index 000000000000..f1588690a774
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/faulthandler/default.nix
@@ -0,0 +1,27 @@
+{ lib, fetchPypi, buildPythonPackage }:
+
+buildPythonPackage rec {
+  pname = "faulthandler";
+  version = "3.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "08ybjjdrfp01syckksxzivqhn6b0yhmc17kdxh77h0lg6rvgvk8y";
+  };
+
+  # This may be papering over a real failure where the env var activation route
+  # for faulthandler does not appear to work. That said, since all other tests
+  # pass and since this module is python 2 only (it was upstreamed into the
+  # interpreter itself as of python 3.3 and is disabled ) this just disables the
+  # test to fix the build. From inspecting Hydra logs and git bisect, the commit
+  # that broke it is this one:
+  # https://github.com/NixOS/nixpkgs/commit/90be4c2c7875c9487508d95b5c638d97e2903ada
+  patches = [ ./disable-env-test.patch ];
+
+  meta = with lib; {
+    description = "Dump the Python traceback";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ sauyon ];
+    homepage = "https://faulthandler.readthedocs.io/";
+  };
+}
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..5af3be420b02
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/favicon/default.nix
@@ -0,0 +1,27 @@
+{ lib, buildPythonPackage, fetchPypi, requests, beautifulsoup4, pytest, requests-mock,
+  pytestrunner }:
+
+buildPythonPackage rec {
+  pname = "favicon";
+  version = "0.7.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "6d6b5a78de2a0d0084589f687f384b2ecd6a6527093fec564403b1a30605d7a8";
+  };
+
+  buildInputs = [ pytestrunner ];
+  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/fdint/default.nix b/nixpkgs/pkgs/development/python-modules/fdint/default.nix
new file mode 100644
index 000000000000..4de0d18ca8b7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fdint/default.nix
@@ -0,0 +1,36 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, cython
+, numpy
+, python
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  version = "2.0.2";
+  pname = "fdint";
+  disabled = isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "30db139684d362652670e2cd3206b5dd7b3b93b86c3aff37f4b4fd4a3f98aead";
+  };
+
+  buildInputs = [ cython ];
+  propagatedBuildInputs = [ numpy ];
+
+  # tests not included with pypi release
+  doCheck = false;
+
+  checkPhase = ''
+    ${python.interpreter} -m fdint.tests
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/scott-maddox/fdint";
+    description = "A free, open-source python package for quickly and precisely approximating Fermi-Dirac integrals";
+    license = licenses.mit;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..509ffaed9d71
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/feedgen/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, dateutil, lxml }:
+
+buildPythonPackage rec {
+  pname = "feedgen";
+  version = "0.9.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0jl0b87l7v6c0f1nx6k81skjhdj5i11kmchdjls00mynpvdip0cf";
+  };
+
+  propagatedBuildInputs = [ 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..8508cc637f22
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/feedgenerator/default.nix
@@ -0,0 +1,23 @@
+{ lib, stdenv, buildPythonPackage, glibcLocales, fetchPypi, six, pytz }:
+
+buildPythonPackage rec {
+  pname = "feedgenerator";
+  version = "1.9.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0m6fjnrx3sd0bm6pnbhxxx5ywlwqh8bx0lka386kj28mg3fmm2m2";
+  };
+
+  buildInputs = [ glibcLocales ];
+
+  LC_ALL="en_US.UTF-8";
+
+  propagatedBuildInputs = [ six pytz ];
+
+  meta = with lib; {
+    description = "Standalone version of django.utils.feedgenerator, compatible with Py3k";
+    homepage = "https://github.com/dmdm/feedgenerator-py3k.git";
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/feedparser/5.nix b/nixpkgs/pkgs/development/python-modules/feedparser/5.nix
new file mode 100644
index 000000000000..a79048c55254
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/feedparser/5.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "feedparser";
+  version = "5.2.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1ycva69bqssalhqg45rbrfipz3l6hmycszy26k0351fhq990c0xx";
+  };
+
+  # lots of networking failures
+  doCheck = false;
+
+  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/feedparser/default.nix b/nixpkgs/pkgs/development/python-modules/feedparser/default.nix
new file mode 100644
index 000000000000..7b48fe6f73e5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/feedparser/default.nix
@@ -0,0 +1,31 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, sgmllib3k
+}:
+
+buildPythonPackage rec {
+  pname = "feedparser";
+  version = "6.0.2";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1b00a105425f492f3954fd346e5b524ca9cef3a4bbf95b8809470e9857aa1074";
+  };
+
+  propagatedBuildInputs = [ sgmllib3k ];
+
+  checkPhase = ''
+    python -Wd tests/runtests.py
+  '';
+
+  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/ffmpeg-python/default.nix b/nixpkgs/pkgs/development/python-modules/ffmpeg-python/default.nix
new file mode 100644
index 000000000000..51b0060cb2d6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ffmpeg-python/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, substituteAll
+, ffmpeg_3
+, future
+, pytest
+, pytestrunner
+, pytest-mock
+}:
+
+buildPythonPackage rec {
+  pname = "ffmpeg-python";
+  version = "0.2.0";
+
+  src = fetchFromGitHub {
+    owner = "kkroening";
+    repo = "ffmpeg-python";
+    rev = version;
+    sha256 = "0mmydmfz3yiclbgi4lqrv9fh2nalafg4bkm92y2qi50mwqgffk8f";
+  };
+
+  patches = [
+    (
+      substituteAll {
+        src = ./ffmpeg-location.patch;
+        ffmpeg = ffmpeg_3;
+      }
+    )
+  ];
+
+  buildInputs = [ pytestrunner ];
+  propagatedBuildInputs = [ future ];
+  checkInputs = [ pytest pytest-mock ];
+
+  meta = with lib; {
+    description = "Python bindings for FFmpeg - with complex filtering support";
+    homepage = "https://github.com/kkroening/ffmpeg-python";
+    license = licenses.asl20;
+    maintainers = [ maintainers.AluisioASG ];
+    platforms = platforms.all;
+  };
+}
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/fido2/default.nix b/nixpkgs/pkgs/development/python-modules/fido2/default.nix
new file mode 100644
index 000000000000..96019f61cac0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fido2/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, six
+, cryptography
+, mock
+, pyfakefs
+}:
+
+buildPythonPackage rec {
+  pname = "fido2";
+  version = "0.8.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1hzprnd407g2xh9kyv8j8pq949hwr1snmg3fp65pqfbghzv6i424";
+  };
+
+  propagatedBuildInputs = [ six cryptography ];
+
+  checkInputs = [ mock pyfakefs ];
+
+  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/filebrowser_safe/default.nix b/nixpkgs/pkgs/development/python-modules/filebrowser_safe/default.nix
new file mode 100644
index 000000000000..df132211d4f9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/filebrowser_safe/default.nix
@@ -0,0 +1,40 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, django
+}:
+
+buildPythonPackage rec {
+  version = "0.5.0";
+  pname = "filebrowser_safe";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "5dcd31dd79684025139b43841f6515af1da5a4bb0de15bc4d88003db1970648e";
+  };
+
+  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.
+
+      At the time of filebrowser_safe's creation, FileBrowser was
+      incorrectly packaged on PyPI, and had also dropped compatibility
+      with Django 1.1 - filebrowser_safe was therefore created to
+      address these specific issues.
+    '';
+    homepage = "https://github.com/stephenmcd/filebrowser-safe";
+    downloadPage = "https://pypi.python.org/pypi/filebrowser_safe/";
+    license = licenses.free;
+    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..bfac6a0e6b23
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/filebytes/default.nix
@@ -0,0 +1,22 @@
+{ lib, stdenv
+, 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/filelock/default.nix b/nixpkgs/pkgs/development/python-modules/filelock/default.nix
new file mode 100644
index 000000000000..77ddec306fc2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/filelock/default.nix
@@ -0,0 +1,18 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "filelock";
+  version = "3.0.12";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "18d82244ee114f543149c66a6e0c14e9c4f8a1044b5cdaadd0f82159d6a6ff59";
+  };
+
+  meta = with lib; {
+    homepage = "https://github.com/benediktschmitt/py-filelock";
+    description = "A platform independent file lock for Python";
+    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..ef8f6933e8fe
--- /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; [ earvstedt ];
+  };
+}
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..4bbb6c41f543
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/filetype/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "filetype";
+  version = "1.0.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "19vav4w8vvcnrps1mirjkrv4pr1khwn5ma6m5pgpxd4qip73wffs";
+  };
+
+  checkPhase = ''
+    ${python.interpreter} -m unittest discover
+  '';
+
+  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..53059ce43d05
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/filterpy/default.nix
@@ -0,0 +1,37 @@
+{ lib, stdenv
+, 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..62287487e3b7
--- /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; [ danieldk ];
+    platforms = platforms.all;
+    license = licenses.blueOak100;
+  };
+}
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..8e02dac58508
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fints/default.nix
@@ -0,0 +1,36 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub, isPy27
+, bleach
+, mt-940
+, pytest
+, requests
+, sepaxml
+}:
+
+buildPythonPackage rec {
+  version = "3.0.0";
+  pname = "fints";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "raphaelm";
+    repo = "python-fints";
+    rev = "v${version}";
+    sha256 = "00fqgnmv7z6d792ga4cyzn9lrfjf79jplkssm2jbyb0akfggfj7h";
+  };
+
+  propagatedBuildInputs = [ requests mt-940 sepaxml bleach ];
+
+  checkInputs = [ pytest ];
+
+  # ignore network calls and broken fixture
+  checkPhase = ''
+    pytest . --ignore=tests/test_client.py -k 'not robust_mode'
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/raphaelm/python-fints/";
+    description = "Pure-python FinTS (formerly known as HBCI) implementation";
+    license = licenses.lgpl3;
+    maintainers = with maintainers; [ elohmeier ];
+  };
+}
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..665bb0c8df0e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fiona/default.nix
@@ -0,0 +1,53 @@
+{ stdenv, lib, buildPythonPackage, fetchPypi, isPy3k, pythonOlder
+, attrs, click, cligj, click-plugins, six, munch, enum34
+, pytest, boto3, mock, giflib, pytz
+, gdal_2 # can't bump to 3 yet, https://github.com/Toblerity/Fiona/issues/745
+}:
+
+buildPythonPackage rec {
+  pname = "Fiona";
+  version = "1.8.18";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b732ece0ff8886a29c439723a3e1fc382718804bb057519d537a81308854967a";
+  };
+
+  CXXFLAGS = lib.optionalString stdenv.cc.isClang "-std=c++11";
+
+  nativeBuildInputs = [
+    gdal_2 # for gdal-config
+  ];
+
+  buildInputs = [
+    gdal_2
+  ] ++ lib.optionals stdenv.cc.isClang [ giflib ];
+
+  propagatedBuildInputs = [
+    attrs
+    click
+    cligj
+    click-plugins
+    six
+    munch
+    pytz
+  ] ++ lib.optional (!isPy3k) enum34;
+
+  checkInputs = [
+    pytest
+    boto3
+  ] ++ lib.optional (pythonOlder "3.4") mock;
+
+  checkPhase = ''
+    rm -r fiona # prevent importing local fiona
+    # Some tests access network, others test packaging
+    pytest -k "not (http or https or 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..d54379d0683e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fipy/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, numpy
+, scipy
+, pyamg
+, pysparse
+, future
+, matplotlib
+, tkinter
+, mpi4py
+, scikit-fmm
+, isPy27
+, gmsh
+, python
+, stdenv
+, openssh
+, fetchurl
+}:
+
+let
+  not_darwin_inputs = lib.optionals (! stdenv.isDarwin) [ gmsh ];
+in
+  buildPythonPackage rec {
+    pname = "fipy";
+    version = "3.4.1";
+
+    src = fetchurl {
+      url = "https://github.com/usnistgov/fipy/releases/download/${version}/FiPy-${version}.tar.gz";
+      sha256 = "0078yg96fknqhywn1v26ryc5z47c0j0c1qwz6p8wsjn0wmzggaqk";
+    };
+
+    propagatedBuildInputs = [
+      numpy
+      scipy
+      pyamg
+      matplotlib
+      tkinter
+      mpi4py
+      future
+      scikit-fmm
+      openssh
+    ] ++ lib.optionals isPy27 [ pysparse ] ++ not_darwin_inputs;
+
+    checkInputs = not_darwin_inputs;
+
+    checkPhase = ''
+      export OMPI_MCA_plm_rsh_agent=${openssh}/bin/ssh
+      ${python.interpreter} setup.py test --modules
+    '';
+
+    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..6a2cc594360d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fire/default.nix
@@ -0,0 +1,48 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub, fetchpatch, six, hypothesis, mock
+, python-Levenshtein, pytest, termcolor, isPy27, enum34 }:
+
+buildPythonPackage rec {
+  pname = "fire";
+  version = "0.3.1";
+
+  src = fetchFromGitHub {
+    owner = "google";
+    repo = "python-fire";
+    rev = "v${version}";
+    sha256 = "0s5r6l39ck2scks54hmwwdf4lcihqqnqzjfx9lz2b67vxkajpwmc";
+  };
+
+  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..a5bdf847eff2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/first/default.nix
@@ -0,0 +1,20 @@
+{ lib, stdenv, 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..46c6ac78a6c4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fitbit/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, coverage
+, dateutil
+, freezegun
+, mock
+, requests-mock
+, requests_oauthlib
+, sphinx
+}:
+
+buildPythonPackage rec {
+  pname = "fitbit";
+  version = "0.3.1";
+
+  checkInputs = [ coverage freezegun mock requests-mock sphinx ];
+  propagatedBuildInputs = [ dateutil requests_oauthlib ];
+
+  # The source package on PyPi is missing files required for unit testing.
+  # https://github.com/orcasgit/python-fitbit/issues/148
+  src = fetchFromGitHub {
+    rev = version;
+    owner = "orcasgit";
+    repo = "python-fitbit";
+    sha256 = "1w2lpgf6bs5nbnmslppaf4lbhr9cj6grg0a525xv41jip7iy3vfn";
+  };
+
+  postPatch = ''
+    substituteInPlace requirements/test.txt \
+      --replace 'Sphinx>=1.2,<1.4' 'Sphinx' \
+      --replace 'coverage>=3.7,<4.0' 'coverage'
+  '';
+
+  meta = with lib; {
+    description = "Fitbit API Python Client Implementation";
+    license = licenses.asl20;
+    homepage = "https://github.com/orcasgit/python-fitbit";
+    maintainers = with maintainers; [ delroth ];
+  };
+}
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..786681df1c83
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fixerio/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, requests
+, pytestCheckHook
+, httpretty
+}:
+
+buildPythonPackage rec {
+  pname = "fixerio";
+  version = "0.1.1";
+
+  src = fetchFromGitHub {
+    owner = "amatellanes";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1k9ss5jc7sbpkjd2774vbmvljny0wm2lrc8155ha8yk2048jsaxk";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py --replace "requests==2.10.0" "requests"
+  '';
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  checkInputs = [
+    httpretty
+    pytestCheckHook
+  ];
+
+  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..9f1549e98f9f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fixtures/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pbr
+, testtools
+, mock
+, python
+, isPy39
+}:
+
+buildPythonPackage rec {
+  pname = "fixtures";
+  version = "3.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "fcf0d60234f1544da717a9738325812de1f42c2fa085e2d9252d8fff5712b2ef";
+  };
+
+  propagatedBuildInputs = [ pbr testtools 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;
+    broken = isPy39; # see https://github.com/testing-cabal/fixtures/issues/44
+  };
+}
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..c3974d0e007b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flake8-blind-except/default.nix
@@ -0,0 +1,16 @@
+{ lib, fetchPypi, buildPythonPackage }:
+
+buildPythonPackage rec {
+  pname = "flake8-blind-except";
+  version = "0.2.0";
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "02a860a1a19cb602c006a3fe0778035b0d14d3f57929b4b798bc7d6684f204e5";
+  };
+  meta = {
+    homepage = "https://github.com/elijahandrews/flake8-blind-except";
+    description = "A flake8 extension that checks for blind except: statements";
+    maintainers = with lib.maintainers; [ johbo ];
+    license = lib.licenses.mit;
+  };
+}
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..46c63ec00085
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flake8-debugger/default.nix
@@ -0,0 +1,32 @@
+{ lib, fetchPypi, buildPythonPackage, pythonOlder, pythonAtLeast, isPy27
+, flake8
+, pycodestyle
+, six
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "flake8-debugger";
+  version = "4.0.0";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "e43dc777f7db1481db473210101ec2df2bd39a45b149d7218a618e954177eda6";
+  };
+
+  propagatedBuildInputs = [ flake8 pycodestyle six ];
+
+  checkInputs = [ pytestCheckHook ];
+
+  # Tests not included in PyPI tarball
+  # FIXME: Remove when https://github.com/JBKahn/flake8-debugger/pull/15 is merged
+  doCheck = false;
+
+  meta = {
+    homepage = "https://github.com/jbkahn/flake8-debugger";
+    description = "ipdb/pdb statement checker plugin for flake8";
+    maintainers = with lib.maintainers; [ johbo ];
+    license = lib.licenses.mit;
+  };
+}
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..661b7c71c33d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flake8-future-import/default.nix
@@ -0,0 +1,31 @@
+{ lib, isPy27, isPy38, fetchFromGitHub, buildPythonPackage, pythonOlder, fetchpatch, flake8, importlib-metadata, six }:
+
+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";
+  };
+
+  propagatedBuildInputs = [ flake8 six ]
+    ++ lib.optionals (pythonOlder "3.8") [
+      importlib-metadata
+    ];
+
+  # 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.
+  patches = lib.optionals isPy38 [ ./fix-annotations-version.patch ]
+    ++ lib.optionals isPy27 [ ./skip-test.patch ];
+
+  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.patch b/nixpkgs/pkgs/development/python-modules/flake8-future-import/fix-annotations-version.patch
new file mode 100644
index 000000000000..2e3062c8ac43
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flake8-future-import/fix-annotations-version.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/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-polyfill/default.nix b/nixpkgs/pkgs/development/python-modules/flake8-polyfill/default.nix
new file mode 100644
index 000000000000..050a6d4f9c8a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flake8-polyfill/default.nix
@@ -0,0 +1,40 @@
+{ lib, fetchPypi, buildPythonPackage
+, flake8
+, mock, pep8, pytest }:
+
+buildPythonPackage rec {
+  pname = "flake8-polyfill";
+  version = "1.0.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1nlf1mkqw856vi6782qcglqhaacb23khk9wkcgn55npnjxshhjz4";
+  };
+
+  postPatch = ''
+    # Failed: [pytest] section in setup.cfg files is no longer supported, change to [tool:pytest] instead.
+    substituteInPlace setup.cfg \
+      --replace pytest 'tool:pytest'
+  '';
+
+  propagatedBuildInputs = [
+    flake8
+  ];
+
+  checkInputs = [
+    mock
+    pep8
+    pytest
+  ];
+
+  checkPhase = ''
+    pytest tests
+  '';
+
+  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..9e53ed28ff34
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flake8/default.nix
@@ -0,0 +1,33 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, pythonOlder
+, mock, pytest, pytestrunner
+, configparser, enum34, mccabe, pycodestyle, pyflakes, functools32, typing, importlib-metadata
+}:
+
+buildPythonPackage rec {
+  pname = "flake8";
+  version = "3.8.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "aadae8761ec651813c24be05c6f7b4680857ef6afaae4651a4eccaef97ce6c3b";
+  };
+
+  checkInputs = [ pytest mock pytestrunner ];
+  propagatedBuildInputs = [ pyflakes pycodestyle mccabe ]
+    ++ lib.optionals (pythonOlder "3.2") [ configparser functools32 ]
+    ++ lib.optionals (pythonOlder "3.4") [ enum34 ]
+    ++ lib.optionals (pythonOlder "3.5") [ typing ]
+    ++ lib.optionals (pythonOlder "3.8") [ importlib-metadata ];
+
+  # fixtures fail to initialize correctly
+  checkPhase = ''
+    py.test tests --ignore=tests/integration/test_checker.py
+  '';
+
+  meta = with lib; {
+    description = "Code checking using pep8 and pyflakes";
+    homepage = "https://pypi.python.org/pypi/flake8";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
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..02b0641a34e2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flaky/default.nix
@@ -0,0 +1,35 @@
+{ lib, stdenv
+, 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..d4cba69afcb0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flametree/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "flametree";
+  version = "0.1.11";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "c8eb81dea8c7f8261a2aa03d2bac98b1d21ebceec9c67efaac423f7c1b4fe061";
+  };
+
+  # no tests in tarball
+  doCheck = false;
+
+  pythonImportsCheck = [ "flametree" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/Edinburgh-Genome-Foundry/Flametree";
+    description = "Python file and zip operations made easy";
+    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..a5525d97f604
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flammkuchen/default.nix
@@ -0,0 +1,36 @@
+{ lib, pkgs, buildPythonPackage, fetchPypi, isPy27
+, numpy
+, scipy
+, tables
+, pandas
+, nose
+, configparser
+}:
+
+buildPythonPackage rec {
+  pname = "flammkuchen";
+  version = "0.9.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f249fe5bf85f717d3836e0db6fa9443a8a43101ce07704715b42251c44fc968e";
+  };
+
+  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/flask-admin/default.nix b/nixpkgs/pkgs/development/python-modules/flask-admin/default.nix
new file mode 100644
index 000000000000..dc1e795054fe
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-admin/default.nix
@@ -0,0 +1,80 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, nose
+, pillow
+, mongoengine
+, pymongo
+, wtf-peewee
+, sqlalchemy
+, sqlalchemy-citext
+, sqlalchemy-utils
+, flask-mongoengine
+, flask_sqlalchemy
+, flask-babelex
+, shapely
+, geoalchemy2
+, psycopg2
+, arrow
+, colour
+, email_validator
+, flask
+, wtforms
+, isPy27
+, enum34
+}:
+
+buildPythonPackage rec {
+  pname = "flask-admin";
+  version = "1.5.6";
+
+  src = fetchPypi {
+    pname = "Flask-Admin";
+    inherit version;
+    sha256 = "1f31vzc0p2xni5mh1wvjk9jxf4ddlx2fj4r0f3vv2n9db3c63iv8";
+  };
+
+  checkInputs = [
+    nose
+    pillow
+    mongoengine
+    pymongo
+    wtf-peewee
+    sqlalchemy
+    sqlalchemy-citext
+    sqlalchemy-utils
+    flask-mongoengine
+    flask_sqlalchemy
+    flask-babelex
+    shapely
+    geoalchemy2
+    psycopg2
+    arrow
+    colour
+    email_validator
+  ];
+
+  propagatedBuildInputs = [
+    flask
+    wtforms
+  ] ++ lib.optionals isPy27 [ enum34 ];
+
+  checkPhase = ''
+    # disable tests that require mongodb, postresql, or network
+    nosetests \
+     -e "mongoengine" \
+     -e "pymongo" \
+     -e "test_form_upload" \
+     -e "test_postgres" \
+     -e "geoa" \
+     -e "test_ajax_fk" \
+     flask_admin/tests
+  '';
+
+  meta = with lib; {
+    description = "Simple and extensible admin interface framework for Flask";
+    homepage = "https://github.com/flask-admin/flask-admin/";
+    license = licenses.bsd3;
+    maintainers = [ 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..3bc3061b3b5f
--- /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 = "2.0";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "6986642e5b25b7def710ca9489ed2b88c94006bfc06eca01c78da7cf447e66e5";
+  };
+
+  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..60dc18a98779
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-appbuilder/default.nix
@@ -0,0 +1,83 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, nose
+, apispec
+, colorama
+, click
+, 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
+}:
+
+buildPythonPackage rec {
+  pname = "flask-appbuilder";
+  version = "2.3.0";
+
+  src = fetchPypi {
+    pname = "Flask-AppBuilder";
+    inherit version;
+    sha256 = "04bsswi7daaqda01a83rd1f2gq6asii520f9arjf7bsy24pmbprc";
+  };
+
+  checkInputs = [
+    nose
+  ];
+
+  propagatedBuildInputs = [
+    apispec
+    colorama
+    click
+    flask
+    flask-babel
+    flask_login
+    flask-openid
+    flask_sqlalchemy
+    flask_wtf
+    flask-jwt-extended
+    jsonschema
+    marshmallow
+    marshmallow-enum
+    marshmallow-sqlalchemy
+    python-dateutil
+    prison
+    pyjwt
+    sqlalchemy-utils
+    pyyaml
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "apispec[yaml]>=1.1.1, <2" "apispec" \
+      --replace "jsonschema>=3.0.1, <4" "jsonschema" \
+      --replace "marshmallow>=2.18.0, <4.0.0" "marshmallow" \
+      --replace "PyJWT>=1.7.1" "PyJWT" \
+      --replace "Flask-SQLAlchemy>=2.4, <3" "Flask-SQLAlchemy" \
+      --replace "Flask-JWT-Extended>=3.18, <4" "Flask-JWT-Extended" \
+      --replace "Flask-Login>=0.3, <0.5" "Flask-Login" \
+      --replace "Flask-Babel>=1, <2" "Flask-Babel"
+  '';
+
+  # majority of tests require network access or mongo
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Simple and rapid 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-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..da6176e6781f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-babel/default.nix
@@ -0,0 +1,44 @@
+{ lib, stdenv
+, 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..cdcb400983b1
--- /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..fd0e63d26f30
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-bcrypt/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, flask
+, bcrypt
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "flask-bcrypt";
+  version = "0.7.1";
+
+  src = fetchFromGitHub {
+    owner = "maxcountryman";
+    repo = pname;
+    rev = version;
+    sha256 = "0036gag3nj7fzib23lbbpwhlrn1s0kkrfwk5pd90y4cjcfqh8z9x";
+  };
+
+  propagatedBuildInputs = [
+    flask
+    bcrypt
+  ];
+
+  checkPhase = ''
+    ${python.interpreter} test_bcrypt.py
+  '';
+
+  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..57c95cf8800a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-caching/default.nix
@@ -0,0 +1,27 @@
+{ lib, buildPythonPackage, fetchPypi, isPy27, flask, pytest, pytestcov, pytest-xprocess, pytestcache }:
+
+buildPythonPackage rec {
+  pname = "Flask-Caching";
+  version = "1.9.0";
+  disabled = isPy27; # invalid python2 syntax
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a0356ad868b1d8ec2d0e675a6fe891c41303128f8904d5d79e180d8b3f952aff";
+  };
+
+  propagatedBuildInputs = [ flask ];
+
+  checkInputs = [ pytest pytestcov pytest-xprocess pytestcache ];
+
+  # backend_cache relies on pytest-cache, which is a stale package from 2013
+  checkPhase = ''
+    pytest -k 'not backend_cache'
+  '';
+
+  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..7dbf507f2205
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-common/default.nix
@@ -0,0 +1,20 @@
+{ lib, stdenv, 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..9491ca8be779
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-compress/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv, fetchPypi, buildPythonPackage, flask
+, brotli
+}:
+
+buildPythonPackage rec {
+  version = "1.8.0";
+  pname = "Flask-Compress";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "c132590e7c948877a96d675c13cbfa64edec0faafa2381678dea6f36aa49a552";
+  };
+
+  propagatedBuildInputs = [ flask brotli ];
+
+  meta = with lib; {
+    description = "Compress responses in your Flask app with gzip";
+    homepage = "https://libwilliam.github.io/flask-compress/";
+    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..731e8b106ab7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-cors/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv, 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..6986cd75be69
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-elastic/default.nix
@@ -0,0 +1,22 @@
+{ lib, stdenv, 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-httpauth/default.nix b/nixpkgs/pkgs/development/python-modules/flask-httpauth/default.nix
new file mode 100644
index 000000000000..e5d55a2b9b5f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-httpauth/default.nix
@@ -0,0 +1,20 @@
+{ lib, buildPythonPackage, fetchPypi, flask }:
+
+buildPythonPackage rec {
+  pname = "Flask-HTTPAuth";
+  version = "4.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "8c7e49e53ce7dc14e66fe39b9334e4b7ceb8d0b99a6ba1c3562bb528ef9da84a";
+  };
+
+  propagatedBuildInputs = [ flask ];
+
+  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..cf8a70b05330
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-jwt-extended/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, dateutil, flask, pyjwt, werkzeug, pytest }:
+
+buildPythonPackage rec {
+  pname = "Flask-JWT-Extended";
+  version = "3.25.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b2e4dba91661e4697b30269106386c2b29e416a00d9ff66b26c462edddc10078";
+  };
+
+  propagatedBuildInputs = [ dateutil flask pyjwt werkzeug ];
+  checkInputs = [ pytest ];
+
+  checkPhase = ''
+    pytest tests/
+  '';
+
+  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-ldap-login/default.nix b/nixpkgs/pkgs/development/python-modules/flask-ldap-login/default.nix
new file mode 100644
index 000000000000..1673ca24e6e0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-ldap-login/default.nix
@@ -0,0 +1,37 @@
+{ lib, stdenv, buildPythonPackage, isPy3k, fetchFromGitHub, fetchpatch
+, flask, flask_wtf, flask_testing, ldap
+, mock, nose }:
+
+buildPythonPackage rec {
+  pname = "flask-ldap-login";
+  version = "0.3.4";
+  disabled = isPy3k;
+
+  src = fetchFromGitHub {
+    owner = "ContinuumIO";
+    repo = "flask-ldap-login";
+    rev = version;
+    sha256 = "1l6zahqhwn5g9fmhlvjv80288b5h2fk5mssp7amdkw5ysk570wzp";
+  };
+
+  patches = [
+    # Fix flask_wtf>=0.9.0 incompatibility. See https://github.com/ContinuumIO/flask-ldap-login/issues/41
+    (fetchpatch {
+      url = "https://github.com/ContinuumIO/flask-ldap-login/commit/ed08c03c818dc63b97b01e2e7c56862eaa6daa43.patch";
+      sha256 = "19pkhbldk8jq6m10kdylvjf1c8m84fvvj04v5qda4cjyks15aq48";
+    })
+  ];
+
+  checkInputs = [ nose mock flask_testing ];
+  propagatedBuildInputs = [ flask flask_wtf ldap ];
+
+  checkPhase = "nosetests -d";
+
+  meta = with lib; {
+    homepage = "https://github.com/ContinuumIO/flask-ldap-login";
+    description = "User session management for Flask";
+    license = licenses.mit;
+    platforms = platforms.all;
+    maintainers = with maintainers; [ mic92 ];
+  };
+}
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..38d42da1c8a7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-limiter/default.nix
@@ -0,0 +1,19 @@
+{ lib, stdenv, fetchPypi, buildPythonPackage, flask, limits }:
+
+buildPythonPackage rec {
+  pname = "Flask-Limiter";
+  version = "1.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "021279c905a1e24f181377ab3be711be7541734b494f4e6db2b8edeba7601e48";
+  };
+
+  propagatedBuildInputs = [ flask limits ];
+
+  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..919e353eb8e0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-login/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, pythonAtLeast
+, flask, blinker, nose, mock, semantic-version }:
+
+buildPythonPackage rec {
+  pname = "Flask-Login";
+  version = "0.5.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "6d33aef15b5bcead780acc339464aae8a6e28f13c90d8b1cf9de8b549d1c0b4b";
+  };
+
+  checkInputs = [ nose mock semantic-version ];
+  propagatedBuildInputs = [ flask blinker ];
+
+  checkPhase = "nosetests -d";
+
+  doCheck = pythonAtLeast "3.3";
+
+  meta = with lib; {
+    homepage = "https://github.com/maxcountryman/flask-login";
+    description = "User session management for Flask";
+    license = licenses.mit;
+    platforms = platforms.all;
+    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..4d50ade30e1c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-migrate/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, fetchPypi, isPy3k, glibcLocales, flask, flask_sqlalchemy, flask_script, alembic }:
+
+buildPythonPackage rec {
+  pname = "Flask-Migrate";
+  version = "2.5.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a69d508c2e09d289f6e55a417b3b8c7bfe70e640f53d2d9deb0d056a384f37ee";
+  };
+
+  checkInputs = [ flask_script ] ++ lib.optional isPy3k glibcLocales;
+  propagatedBuildInputs = [ flask flask_sqlalchemy alembic ];
+
+  # tests invoke the flask cli which uses click and therefore has py3k encoding troubles
+  preCheck = lib.optionalString isPy3k ''
+    export LANG="en_US.UTF-8"
+  '';
+
+  meta = with lib; {
+    description = "SQLAlchemy database migrations for Flask applications using Alembic";
+    license = licenses.mit;
+    homepage = "https://github.com/miguelgrinberg/Flask-Migrate";
+  };
+}
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..ad4353312369
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-mongoengine/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, flask
+, flask_wtf
+, mongoengine
+, six
+, nose
+, rednose
+, coverage
+}:
+
+buildPythonPackage rec {
+  pname = "flask-mongoengine";
+  version = "0.9.5";
+
+  src = fetchFromGitHub {
+    owner = "MongoEngine";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "05hfddf1dm594wnjyqhj0zmjfsf1kpmx1frjwhypgzx4hf62qcmr";
+  };
+
+  propagatedBuildInputs = [
+    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..a9a5ec9acc8b
--- /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.2.5";
+  disable = !isPy3k;
+
+  src = fetchPypi {
+    pname = "Flask-OpenID";
+    inherit version;
+    sha256 = "5a8ffe1c8c0ad1cc1f5030e1223ea27f8861ee0215a2a58a528cc61379e5ccab";
+  };
+
+  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..0d618e2b55df
--- /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 = "0.7.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "949b93d0535d1223b91ac0048586bd878aaebf4044c54c1dc3068acc9bdf441f";
+  };
+
+  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-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..d5b48fd0428a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-restful/default.nix
@@ -0,0 +1,30 @@
+{ lib, buildPythonPackage, fetchPypi, fetchpatch, isPy3k
+, nose, mock, blinker, pytest
+, flask, six, pytz, aniso8601, pycrypto
+}:
+
+buildPythonPackage rec {
+  pname = "Flask-RESTful";
+  version = "0.3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "05b9lzx5yc3wgml2bcq50lq35h66m8zpj6dc9advcb5z3acsbaay";
+  };
+
+  propagatedBuildInputs = [ flask six pytz aniso8601 pycrypto ];
+
+  checkInputs = [ pytest nose mock blinker ];
+
+  # test_reqparse.py: werkzeug move Multidict location (only imported in tests)
+  # handle_non_api_error isn't updated for addition encoding argument
+  checkPhase = ''
+    pytest --ignore=tests/test_reqparse.py -k 'not handle_non_api_error'
+  '';
+
+  meta = with lib; {
+    homepage = "https://flask-restful.readthedocs.io/";
+    description = "REST API building blocks for Flask";
+    license = licenses.bsd3;
+  };
+}
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..f2b7222c3d06
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-restx/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, aniso8601
+, jsonschema
+, flask
+, werkzeug
+, pytz
+, faker
+, six
+, enum34
+, isPy27
+, mock
+, blinker
+, pytest-flask
+, pytest-mock
+, pytest-benchmark
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "flask-restx";
+  version = "0.2.0";
+
+  # Tests not included in PyPI tarball
+  src = fetchFromGitHub {
+    owner = "python-restx";
+    repo = pname;
+    rev = version;
+    sha256 = "0xf2vkmdngp9cv9klznizai4byxjcf0iqh1pr4b83nann0jxqwy7";
+  };
+
+  propagatedBuildInputs = [ aniso8601 jsonschema flask werkzeug pytz six ]
+    ++ lib.optionals isPy27 [ enum34 ];
+
+  checkInputs = [ pytestCheckHook faker mock pytest-flask pytest-mock pytest-benchmark blinker ];
+
+  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"
+  ];
+
+  meta = with lib; {
+    homepage = "https://flask-restx.readthedocs.io/en/${version}/";
+    description = "Fully featured framework for fast, easy and documented API development with Flask";
+    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..550f6520e7db
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-reverse-proxy-fix/default.nix
@@ -0,0 +1,43 @@
+{ lib, stdenv
+, 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-silk/default.nix b/nixpkgs/pkgs/development/python-modules/flask-silk/default.nix
new file mode 100644
index 000000000000..92d2f90848cb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-silk/default.nix
@@ -0,0 +1,30 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, flask
+}:
+
+buildPythonPackage {
+  pname = "Flask-Silk";
+  version = "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..496676600fc9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-socketio/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, coverage
+, fetchFromGitHub
+, flask
+, pytestCheckHook
+, python-socketio
+}:
+
+buildPythonPackage rec {
+  pname = "Flask-SocketIO";
+  version = "5.0.1";
+
+  src = fetchFromGitHub {
+    owner = "miguelgrinberg";
+    repo = "Flask-SocketIO";
+    rev = "v${version}";
+    sha256 = "01zf6cy95pgc4flgn0740z2my90l7rxwliahp6rb2xbp7rh32cng";
+  };
+
+  propagatedBuildInputs = [
+    flask
+    python-socketio
+  ];
+
+  checkInputs = [
+    coverage
+    pytestCheckHook
+  ];
+
+  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..16b8c9c7fc79
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-sqlalchemy/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, flask, mock, sqlalchemy, pytest }:
+
+buildPythonPackage rec {
+  pname = "Flask-SQLAlchemy";
+  version = "2.4.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1rgsj49gnx361hnb3vn6c1h17497qh22yc3r70l1r6w0mw71bixz";
+  };
+
+  propagatedBuildInputs = [ flask sqlalchemy ];
+  checkInputs = [ mock pytest ];
+
+  checkPhase = ''
+    pytest
+  '';
+
+  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-swagger-ui/default.nix b/nixpkgs/pkgs/development/python-modules/flask-swagger-ui/default.nix
new file mode 100644
index 000000000000..79650e7c1755
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-swagger-ui/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, flask }:
+
+buildPythonPackage rec {
+  pname = "flask-swagger-ui";
+  version = "3.36.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f329752a65b2940ada8eeb57bce613f7c0a12856a9c31063bb9e33798554c9ed";
+  };
+
+  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..20624c318620
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-swagger/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv, 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-testing/default.nix b/nixpkgs/pkgs/development/python-modules/flask-testing/default.nix
new file mode 100644
index 000000000000..6cfcffdb7be8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-testing/default.nix
@@ -0,0 +1,32 @@
+{ lib, stdenv, fetchPypi, buildPythonPackage, isPy3k, flask, blinker, twill }:
+
+buildPythonPackage rec {
+  pname = "Flask-Testing";
+  version = "0.8.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0a734d7b68e63a9410b413cd7b1f96456f9a858bd09a6222d465650cc782eb01";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py --replace "twill==0.9.1" "twill"
+  '';
+
+  propagatedBuildInputs = [ flask ];
+
+  checkInputs = [ blinker ] ++ lib.optionals (!isPy3k) [ twill ];
+
+  # twill integration is outdated in Python 2, hence it the tests fails.
+  # Some of the tests use localhost networking on darwin.
+  doCheck = isPy3k && !stdenv.isDarwin;
+
+  pythonImportsCheck = [ "flask_testing" ];
+
+  meta = with lib; {
+    description = "Flask unittest integration.";
+    homepage = "https://pythonhosted.org/Flask-Testing/";
+    license = licenses.bsd3;
+    maintainers = [ 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..15e7b2c1875d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-versioned/default.nix
@@ -0,0 +1,23 @@
+{ lib, stdenv, 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..eadc7842a013
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-wtf/default.nix
@@ -0,0 +1,22 @@
+{ lib, stdenv, fetchPypi, buildPythonPackage, flask, wtforms, nose }:
+
+buildPythonPackage rec {
+  pname = "Flask-WTF";
+  version = "0.14.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "086pvg2x69n0nczcq7frknfjd8am1zdy8qqpva1sanwb02hf65yl";
+  };
+
+  propagatedBuildInputs = [ flask wtforms nose ];
+
+  doCheck = false; # requires external service
+
+  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..d121b4e32c8b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi
+, itsdangerous, click, werkzeug, jinja2, pytest }:
+
+buildPythonPackage rec {
+  version = "1.1.2";
+  pname = "Flask";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "4efa1ae2d7c9865af48986de8aeb8504bf32c7f3d6fdc9353d34b21f4b127060";
+  };
+
+  checkInputs = [ pytest ];
+  propagatedBuildInputs = [ itsdangerous click werkzeug jinja2 ];
+
+  checkPhase = ''
+    py.test
+  '';
+
+  # Tests require extra dependencies
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "http://flask.pocoo.org/";
+    description = "A microframework based on Werkzeug, Jinja 2, and good intentions";
+    license = licenses.bsd3;
+  };
+}
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..eef31359f504
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flaskbabel/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv
+, 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..f697f7b8ae09
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flatbuffers/default.nix
@@ -0,0 +1,21 @@
+{ 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 ];
+  };
+}
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..74c3418b54b0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flexmock/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "flexmock";
+  version = "0.10.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0b6qw3grhgx58kxlkj7mdma7xdvlj02zabvcf7w2qifnfjwwwcsh";
+  };
+
+  checkInputs = [ pytest ];
+  checkPhase = ''
+    py.test
+  '';
+
+  meta = with lib; {
+    description = "flexmock is a testing library for Python that makes it easy to create mocks,stubs and fakes.";
+    homepage = "https://flexmock.readthedocs.org";
+    license = licenses.bsdOriginal;
+  };
+}
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..cfcc4d362997
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flickrapi/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, requests
+, requests_toolbelt
+, requests_oauthlib
+, pytest
+, pytestrunner
+, pytestcov
+, responses
+}:
+
+buildPythonPackage rec {
+  pname   = "flickrapi";
+  version = "2.4.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "03g2z21k6nhxgwysjrgnxj9m1yg25mnnkr10gpyfhfkd9w77pcpz";
+  };
+
+  propagatedBuildInputs = [ requests requests_toolbelt requests_oauthlib ];
+
+  checkInputs = [ pytest pytestrunner pytestcov responses ];
+  doCheck = false; # Otherwise:
+  # ========================= no tests ran in 0.01 seconds =========================
+  # builder for '/nix/store/c8a58v6aa18zci08q2l53s12ywn8jqhq-python3.6-flickrapi-2.4.0.drv' failed with exit code 5
+
+  meta = {
+    description = "A Python interface to the Flickr API";
+    homepage    = "https://stuvel.eu/flickrapi";
+    license     = lib.licenses.psfl;
+    maintainers = with lib.maintainers; [ obadz ];
+  };
+}
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..53a1e0651f36
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flit-core/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, flit
+, isPy3k
+, toml
+}:
+
+buildPythonPackage rec {
+  pname = "flit-core";
+  version = "2.3.0";
+  disabled = !isPy3k;
+  format = "pyproject";
+
+  inherit (flit) src patches;
+
+  preConfigure = ''
+    cd flit_core
+  '';
+
+  propagatedBuildInputs = [
+    toml
+  ];
+
+  passthru.tests = {
+    inherit flit;
+  };
+
+  meta = {
+    description = "Distribution-building parts of Flit. See flit package for more information";
+    homepage = "https://github.com/takluyver/flit";
+    license = lib.licenses.bsd3;
+    maintainers = [ lib.maintainers.fridh ];
+  };
+}
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..c63fd1edeaf9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flit/default.nix
@@ -0,0 +1,71 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, isPy3k
+, docutils
+, requests
+, requests_download
+, zipfile36
+, pythonOlder
+, pytest
+, testpath
+, responses
+, flit-core
+}:
+
+# 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.0.0";
+  disabled = !isPy3k;
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "takluyver";
+    repo = "flit";
+    rev = version;
+    sha256 = "zk6mozS3Q9U43PQe/DxgwwsBRJ6Qwb+rSUVGXHijD+g=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  # Use toml instead of pytoml
+  # Resolves infinite recursion since packaging started using flit.
+  patches = [
+    (fetchpatch {
+      url = "https://github.com/takluyver/flit/commit/b81b1da55ef0f2768413669725d2874fcb0c29fb.patch";
+      sha256 = "11oNaYsm00/j2046V9C0idpSeG7TpY3JtLuxX3ZL/OI=";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    docutils
+    requests
+    requests_download
+    flit-core
+  ] ++ lib.optionals (pythonOlder "3.6") [
+    zipfile36
+  ];
+
+  checkInputs = [ pytest testpath responses ];
+
+  # Disable test that needs some ini file.
+  # Disable test that wants hg
+  checkPhase = ''
+    HOME=$(mktemp -d) pytest -k "not test_invalid_classifier and not test_build_sdist"
+  '';
+
+  meta = with lib; {
+    description = "A simple packaging tool for simple packages";
+    homepage = "https://github.com/takluyver/flit";
+    license = licenses.bsd3;
+    maintainers = [ maintainers.fridh ];
+  };
+}
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..605d08d1258e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flower/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, celery
+, humanize
+, mock
+, pytz
+, tornado
+, prometheus_client
+}:
+
+buildPythonPackage rec {
+  pname = "flower";
+  version = "0.9.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "171zckhk9ni14f1d82wf62hhciy0gx13fd02sr9m9qlj50fnv4an";
+  };
+
+  postPatch = ''
+    # rely on using example programs (flowers/examples/tasks.py) which
+    # are not part of the distribution
+    rm tests/load.py
+    substituteInPlace  requirements/default.txt --replace "prometheus_client==0.8.0" "prometheus_client>=0.8.0"
+  '';
+
+  propagatedBuildInputs = [
+    celery
+    pytz
+    tornado
+    humanize
+    prometheus_client
+  ];
+
+  checkInputs = [ mock ];
+
+  meta = with lib; {
+    description = "Celery Flower";
+    homepage = "https://github.com/mher/flower";
+    license = licenses.bsdOriginal;
+    maintainers = [ maintainers.arnoldfarkas ];
+    broken = (celery.version == "5.0.2"); # currently broken with celery>=5.0 by https://github.com/mher/flower/pull/1021
+  };
+}
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..1a6591040a2e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flowlogs_reader/default.nix
@@ -0,0 +1,32 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, botocore
+, boto3
+, docutils
+, unittest2
+, mock
+}:
+
+buildPythonPackage rec {
+  pname = "flowlogs_reader";
+  version = "2.3.0";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "19118ff77925c66a6782152066d86bc8d5c6ed60189b642263fb0c6eb7cb22ef";
+  };
+
+  propagatedBuildInputs = [ botocore boto3 docutils ];
+  buildInputs = [ unittest2 mock ];
+
+  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";
+    maintainers = with maintainers; [ cransom ];
+    license = licenses.asl20;
+  };
+
+}
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..70c9173f4d50
--- /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.9.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a7d47eae4d2a11c8cb0df10ae3d034d95b0b8cef9d060e59e7519ad1f82ffa73";
+  };
+
+  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..deb92ea9ce85
--- /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 = "3.0.1";
+
+  buildInputs = [ nose2 ];
+  propagatedBuildInputs = [ atpublic zope_interface ];
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "e432fa1ca25ddbf23e2716b177d4d1c6ab6c078e357df56b0106b92bc10a8f06";
+  };
+}
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..8b0c98635507
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flufl/i18n.nix
@@ -0,0 +1,17 @@
+{ buildPythonPackage, fetchPypi, atpublic }:
+
+buildPythonPackage rec {
+  pname = "flufl.i18n";
+  version = "3.1.4";
+
+  propagatedBuildInputs = [ atpublic ];
+
+  doCheck = false;
+
+  pythonImportsCheck = [ "flufl.i18n" ];
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "e19036292a825a69f0e0a87566d1628830c69eecd3b0295d22f582039477a6bb";
+  };
+}
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..1be5d9a7c4c2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flufl/lock.nix
@@ -0,0 +1,13 @@
+{ buildPythonPackage, fetchPypi, atpublic }:
+
+buildPythonPackage rec {
+  pname = "flufl.lock";
+  version = "3.2";
+
+  propagatedBuildInputs = [ atpublic ];
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0nzzd6l30ff6cwsrlrb94xzfja4wkyrqv3ydc6cz0hdbr766mmm8";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flup/default.nix b/nixpkgs/pkgs/development/python-modules/flup/default.nix
new file mode 100644
index 000000000000..52ac5da27aa1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flup/default.nix
@@ -0,0 +1,23 @@
+{ lib, stdenv
+, buildPythonPackage
+, isPy3k
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "flup";
+  version = "1.0.3";
+  disabled = isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "5eb09f26eb0751f8380d8ac43d1dfb20e1d42eca0fa45ea9289fa532a79cd159";
+  };
+
+  meta = with lib; {
+    homepage = "https://www.saddi.com/software/flup/";
+    description = "FastCGI Python module set";
+    license = licenses.bsd0;
+  };
+
+}
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..ddec811e21ce
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flux-led/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub
+, aiohttp, zigpy
+, pytest, isPy27 }:
+
+buildPythonPackage rec {
+  pname = "flux_led";
+  version = "0.22";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "Danielhiversen";
+    repo = "flux_led";
+    rev = version;
+    sha256 = "1zgajlkhclyrqhkmivna4ha2lyvfpk5929s042gy59p7mzpkvjx7";
+  };
+
+  meta = with lib; {
+    description = "A Python library to communicate with the flux_led smart bulbs";
+    homepage = "https://github.com/Danielhiversen/flux_led";
+    license = licenses.lgpl3;
+    maintainers = with maintainers; [ colemickens ];
+    platforms = platforms.linux;
+  };
+}
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..f64d1a3d122d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fn/default.nix
@@ -0,0 +1,20 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "fn";
+  version = "0.4.3";
+
+  meta = {
+    description = ''
+      Functional programming in Python: implementation of missing
+      features to enjoy FP
+    '';
+    homepage = "https://github.com/kachayev/fn.py";
+    license = lib.licenses.asl20;
+  };
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1nmsjmn8jb4gp22ksx0j0hhdf4y0zm8rjykyy2i6flzimg6q1kgq";
+  };
+}
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..c0adaeaa5589
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/folium/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, pytest
+, numpy
+, nbconvert
+, pandas
+, mock
+, jinja2
+, branca
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "folium";
+  version = "0.12.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d45ace0a813ae65f202ce0356eb29c40a5e8fde071e4d6b5be0a89587ebaeab2";
+  };
+
+  disabled = pythonOlder "3.5";
+
+  checkInputs = [ pytest nbconvert pandas mock ];
+  propagatedBuildInputs = [ jinja2 branca requests numpy ];
+
+  # No tests in archive
+  doCheck = false;
+
+  checkPhase = ''
+    py.test
+  '';
+
+  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/fontmath/default.nix b/nixpkgs/pkgs/development/python-modules/fontmath/default.nix
new file mode 100644
index 000000000000..7a23abdd0374
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fontmath/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, fetchPypi
+, fonttools
+, pytest, pytestrunner
+}:
+
+buildPythonPackage rec {
+  pname = "fontMath";
+  version = "0.6.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "09xdqdjyjlx5k9ymi36d7hkgvn55zzjzd65l2yqidkfazlmh14ss";
+    extension = "zip";
+  };
+
+  propagatedBuildInputs = [ fonttools ];
+  checkInputs = [ pytest pytestrunner ];
+
+  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..c694c15f5573
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fontparts/default.nix
@@ -0,0 +1,42 @@
+{ lib, buildPythonPackage, fetchPypi, python
+, fonttools, lxml, fs, unicodedata2
+, defcon, fontpens, fontmath, booleanoperations
+, pytest, setuptools_scm
+}:
+
+buildPythonPackage rec {
+  pname = "fontParts";
+  version = "0.9.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "183y1y11bqd4ky4anyv40qbvsm6i90gnydqzrjg7syspjsqvfqgy";
+    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 = ''
+    ${python.interpreter} Lib/fontParts/fontshell/test.py
+  '';
+  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/v${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..cd91eb08be0e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fonttools/default.nix
@@ -0,0 +1,75 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, brotlipy
+, zopfli
+, fs
+, lxml
+, scipy
+, munkres
+, unicodedata2
+, sympy
+, matplotlib
+, reportlab
+, sphinx
+, pytest
+, pytest-randomly
+, glibcLocales
+}:
+
+buildPythonPackage rec {
+  pname = "fonttools";
+  version = "4.18.2";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner  = pname;
+    repo   = pname;
+    rev    = version;
+    sha256 = "0h750gvwpsp7fpmgfwkx93gkaf0m1s698g6r7n4xlaji563nlkiv";
+  };
+
+  # all dependencies are optional, but
+  # we run the checks with them
+  checkInputs = [
+    pytest
+    pytest-randomly
+    glibcLocales
+    # etree extra
+    lxml
+    # ufo extra
+    fs
+    # woff extra
+    brotlipy
+    zopfli
+    # unicode extra
+    unicodedata2
+    # interpolatable extra
+    scipy
+    munkres
+    # symfont
+    sympy
+    # varLib
+    matplotlib
+    # pens
+    reportlab
+    sphinx
+  ];
+
+  preCheck = ''
+    export LC_ALL="en_US.UTF-8"
+  '';
+
+  # avoid timing issues with timestamps in subset_test.py and ttx_test.py
+  checkPhase = ''
+    pytest Tests fontTools \
+      -k 'not ttcompile_timestamp_calcs and not recalc_timestamp'
+  '';
+
+  meta = {
+    homepage = "https://github.com/fonttools/fonttools";
+    description = "A library to manipulate font files from Python";
+    license = lib.licenses.mit;
+  };
+}
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..396bef6d009e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/foolscap/default.nix
@@ -0,0 +1,40 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, mock
+, twisted
+, pyopenssl
+, service-identity
+}:
+
+buildPythonPackage rec {
+  pname = "foolscap";
+  version = "20.4.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0rbw9makjmawkcxnkkngybj3n14s0dnzn9gkqqq2krcm514kmlb9";
+  };
+
+  propagatedBuildInputs = [ mock twisted pyopenssl service-identity ];
+
+  checkPhase = ''
+    # Either uncomment this, or remove this custom check phase entirely, if
+    # you wish to do battle with the foolscap tests. ~ C.
+    # trial foolscap
+  '';
+
+  meta = with lib; {
+    homepage = "http://foolscap.lothar.com/";
+    description = "Foolscap, an 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.
+    '';
+    # See http://foolscap.lothar.com/trac/browser/LICENSE.
+    license = licenses.mit;
+  };
+
+}
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..64713d96adea
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/forbiddenfruit/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, nose
+}:
+
+buildPythonPackage rec {
+  version = "0.1.3";
+  pname = "forbiddenfruit";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1188a07cc24a9bd2c529dad06490b80a6fc88cde968af4d7861da81686b2cc8c";
+  };
+
+  checkInputs = [ nose ];
+
+  checkPhase = ''
+    find ./build -name '*.so' -exec mv {} tests/unit \;
+    nosetests
+  '';
+
+  meta = with lib; {
+    description = "Patch python built-in objects";
+    homepage = "https://pypi.python.org/pypi/forbiddenfruit";
+    license = licenses.mit;
+  };
+
+}
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/foxdot/default.nix b/nixpkgs/pkgs/development/python-modules/foxdot/default.nix
new file mode 100644
index 000000000000..d60c1e89900a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/foxdot/default.nix
@@ -0,0 +1,23 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, tkinter, supercollider }:
+
+buildPythonPackage rec {
+  pname = "FoxDot";
+  version = "0.8.11";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "00yqpkv7cxwk301cyiwjzr9yfq8hpnhqyspw3z874ydrl3cmssdb";
+  };
+
+  propagatedBuildInputs = [ tkinter 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..da246966c932
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fpylll/default.nix
@@ -0,0 +1,77 @@
+{ lib
+, fetchFromGitHub
+, fetchpatch
+, buildPythonPackage
+, pkgconfig
+, gmp
+, pari
+, mpfr
+, fplll
+, cython
+, cysignals
+, numpy
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "fpylll";
+  version = "0.5.1dev";
+
+  src = fetchFromGitHub {
+    owner = "fplll";
+    repo = "fpylll";
+    rev = version;
+    sha256 = "15vdfgx448mr1nf054h7lr2j3dd35fsfhikqzrh9zsng8n12hxa5";
+  };
+
+  patches = [
+    # two patches to fix the testsuite on aarch64 (https://github.com/fplll/fpylll/issues/162)
+    (fetchpatch {
+      url = "https://github.com/fplll/fpylll/commit/d5809a8fdb86b2693b1fa94e655bbbe4ad80e286.patch";
+      name = "less-precision-in-tests.patch";
+      sha256 = "0vkvi25nwwvk5r4a4xmkbf060di4hjq32bys75l2hsaysxmk93nz";
+    })
+    (fetchpatch {
+      url = "https://github.com/fplll/fpylll/commit/b5b146a010d50da219a313adc4b6f7deddcc146b.patch";
+      name = "dont-hardcode-precision.patch";
+      sha256 = "1rsbwh90i1j5p2rp6jd5n25v1jzw1n8728fzz1lhb91zmk0hlxc9";
+    })
+  ];
+
+  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/freetype-py/default.nix b/nixpkgs/pkgs/development/python-modules/freetype-py/default.nix
new file mode 100644
index 000000000000..a1259b85673a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/freetype-py/default.nix
@@ -0,0 +1,31 @@
+{ lib, buildPythonPackage, fetchPypi, substituteAll, stdenv, setuptools_scm, freetype }:
+
+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 ];
+
+  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/0.3.nix b/nixpkgs/pkgs/development/python-modules/freezegun/0.3.nix
new file mode 100644
index 000000000000..9dc88596f267
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/freezegun/0.3.nix
@@ -0,0 +1,32 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, dateutil
+, six
+, mock
+, nose
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "freezegun";
+  version = "0.3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "02ly89wwn0plcw8clkkzvxaw6zlpm8qyqpm9x2mfw4a0vppb4ngf";
+  };
+
+  propagatedBuildInputs = [ dateutil six ];
+  checkInputs = [ mock nose pytest ];
+  # contains python3 specific code
+  doCheck = !isPy27;
+
+  meta = with lib; {
+    description = "FreezeGun: Let your Python tests travel through time";
+    homepage = "https://github.com/spulec/freezegun";
+    license = licenses.asl20;
+  };
+
+}
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..f1b1d9738d72
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/freezegun/default.nix
@@ -0,0 +1,34 @@
+{ lib, stdenv
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, isPy27
+, dateutil
+, six
+, mock
+, nose
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "freezegun";
+  version = "1.0.0";
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1cf08e441f913ff5e59b19cc065a8faa9dd1ddc442eaf0375294f344581a0643";
+  };
+
+  propagatedBuildInputs = [ dateutil six ];
+  checkInputs = [ mock nose pytest ];
+  # contains python3 specific code
+  doCheck = !isPy27;
+
+  meta = with lib; {
+    description = "FreezeGun: Let your Python tests travel through time";
+    homepage = "https://github.com/spulec/freezegun";
+    license = licenses.asl20;
+  };
+
+}
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..571fba1a8acd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fritzconnection/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv, buildPythonPackage, pythonOlder, fetchFromGitHub, pytestCheckHook, requests }:
+
+buildPythonPackage rec {
+  pname = "fritzconnection";
+  version = "1.4.0";
+
+  # no tests on PyPI
+  src = fetchFromGitHub {
+    owner = "kbr";
+    repo = pname;
+    rev = version;
+    sha256 = "1p8dqcc75xfhyvc9izjzz8c7qfrdkjkrkj36j7ms5fimn5bwk70q";
+  };
+
+  disabled = pythonOlder "3.6";
+
+  propagatedBuildInputs = [ requests ];
+
+  checkInputs = [ pytestCheckHook ];
+
+  meta = with lib; {
+    description = "Python-Tool to communicate with the AVM FritzBox using the TR-064 protocol";
+    homepage = "https://github.com/kbr/fritzconnection";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda valodim ];
+  };
+}
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..dd0c99298265
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/frozendict/default.nix
@@ -0,0 +1,20 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "frozendict";
+  version = "1.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0ibf1wipidz57giy53dh7mh68f2hz38x8f4wdq88mvxj5pr7jhbp";
+  };
+
+  # frozendict does not come with tests
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/slezica/python-frozendict";
+    description = "An immutable dictionary";
+    license = licenses.mit;
+  };
+}
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..18434f530cbf
--- /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; [ ma27 ];
+  };
+}
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..1f784a06e2ea
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fs/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, glibcLocales
+, buildPythonPackage
+, fetchPypi
+, six
+, appdirs
+, scandir
+, backports_os
+, typing
+, pytz
+, enum34
+, pyftpdlib
+, psutil
+, mock
+, pythonAtLeast
+, isPy3k
+, pytestCheckHook
+, stdenv
+}:
+
+buildPythonPackage rec {
+  pname = "fs";
+  version = "2.4.11";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "cc99d476b500f993df8ef697b96dc70928ca2946a455c396a566efe021126767";
+  };
+
+  buildInputs = [ glibcLocales ];
+  checkInputs = [ pyftpdlib mock psutil pytestCheckHook ];
+  propagatedBuildInputs = [ six appdirs pytz ]
+    ++ 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..1734ad2f507c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fsspec/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytestCheckHook
+, numpy
+, stdenv
+}:
+
+buildPythonPackage rec {
+  pname = "fsspec";
+  version = "0.8.3";
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "intake";
+    repo = "filesystem_spec";
+    rev = version;
+    sha256 = "0mfy0wxjfwwnp5q2afhhfbampf0fk71wsv512pi9yvrkzzfi1hga";
+  };
+
+  checkInputs = [
+    pytestCheckHook
+    numpy
+  ];
+
+  disabledTests = [
+    # Test assumes user name is part of $HOME
+    # AssertionError: assert 'nixbld' in '/homeless-shelter/foo/bar'
+    "test_strip_protocol_expanduser"
+    # flaky: works locally but fails on hydra
+    # as it uses the install dir for tests instead of a temp dir
+    # resolved in https://github.com/intake/filesystem_spec/issues/432 and
+    # can be enabled again from version 0.8.4
+    "test_pathobject"
+  ] ++ 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"
+  ];
+
+  meta = with lib; {
+    description = "A specification that python filesystems should adhere to";
+    homepage = "https://github.com/intake/filesystem_spec";
+    license = licenses.bsd3;
+    maintainers = [ 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..63342c7045d0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ftfy/default.nix
@@ -0,0 +1,43 @@
+{ lib, stdenv
+, buildPythonPackage
+, isPy3k
+, fetchPypi
+, html5lib
+, wcwidth
+, setuptools
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "ftfy";
+  version = "5.8";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "081p5z20dirrf1i3nshylc31qd5mbxibjc7gzj8x4isbiizpdisi";
+  };
+
+  propagatedBuildInputs = [
+    html5lib
+    wcwidth
+    setuptools
+  ];
+
+  checkInputs = [
+    pytest
+  ];
+
+  # We suffix PATH like this because the tests want the ftfy executable
+  checkPhase = ''
+    PATH=$out/bin:$PATH pytest
+  '';
+
+  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; [ sdll 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..883ff69c6d68
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ftputil/default.nix
@@ -0,0 +1,32 @@
+{ stdenv, lib, buildPythonPackage, fetchPypi, pythonOlder, pytest, freezegun }:
+
+buildPythonPackage rec {
+  version = "4.0.0";
+  pname = "ftputil";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d494c47f24fd3f8fbe92d40d90e0902c0e04288f200688af2b16d6b46fe441e1";
+  };
+
+  checkInputs = [ pytest freezegun ];
+
+  checkPhase = ''
+    touch Makefile
+    # Disable tests that require network access or access /home or assume execution before year 2020
+    py.test test \
+      -k "not test_public_servers and not test_real_ftp \
+          and not test_set_parser and not test_repr \
+          and not test_conditional_upload and not test_conditional_download_with_older_target \
+  ''
+  # need until https://ftputil.sschwarzer.net/trac/ticket/140#ticket is fixed
+  + lib.optionalString stdenv.isDarwin "and not test_error_message_reuse"
+  + ''"'';
+
+  meta = with lib; {
+    description = "High-level FTP client library (virtual file system and more)";
+    homepage = "http://ftputil.sschwarzer.net/";
+    license = licenses.bsd2; # "Modified BSD license, says pypi"
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fudge/default.nix b/nixpkgs/pkgs/development/python-modules/fudge/default.nix
new file mode 100644
index 000000000000..3f53b66d1efa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fudge/default.nix
@@ -0,0 +1,31 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, nose
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "fudge";
+  version = "1.1.1";
+  disabled = isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1p7g6hv9qxscbzjv2n5pczpkkp55mp3s56adfc912w9qpf3rv4nr";
+  };
+
+  checkInputs = [ nose ];
+
+  checkPhase = ''
+    nosetests -v
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/fudge-py/fudge";
+    description = "Replace real objects with fakes (mocks, stubs, etc) while testing";
+    license = licenses.mit;
+    maintainers = [ maintainers.costrouc ];
+  };
+
+}
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..773ed1dccd67
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/funcparserlib/default.nix
@@ -0,0 +1,31 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, python
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "funcparserlib";
+  version = "0.3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b7992eac1a3eb97b3d91faa342bfda0729e990bd8a43774c1592c091e563c91d";
+  };
+
+  checkPhase = ''
+    ${python.interpreter} -m unittest discover
+  '';
+
+  # Tests are Python 2.x only judging from SyntaxError
+  doCheck = !(isPy3k);
+
+  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..1464baa57df2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/funcsigs/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi
+, isPyPy, isPy3k, unittest2
+}:
+
+buildPythonPackage rec {
+  pname = "funcsigs";
+  version = "1.0.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0l4g5818ffyfmfs1a924811azhjj8ax9xd1cffr1mzd3ycn0zfx7";
+  };
+
+  buildInputs = [ unittest2 ];
+
+  # https://github.com/testing-cabal/funcsigs/issues/10
+  patches = lib.optional (isPyPy && isPy3k) [ ./fix-pypy3-tests.patch ];
+
+  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..cec9da423958
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/functools32/default.nix
@@ -0,0 +1,22 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+}:
+
+if isPy3k then null else buildPythonPackage rec {
+  pname = "functools32";
+  version = "3.2.3-2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0v8ya0b58x47wp216n1zamimv4iw57cxz3xxhzix52jkw3xks9gn";
+  };
+
+  meta = with lib; {
+    description = "This is a backport of the functools standard library module from";
+    homepage = "https://github.com/MiCHiLU/python-functools32";
+    license = licenses.psfl;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/funcy/default.nix b/nixpkgs/pkgs/development/python-modules/funcy/default.nix
new file mode 100644
index 000000000000..3db08cf22bbd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/funcy/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "funcy";
+  version = "1.15";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "65b746fed572b392d886810a98d56939c6e0d545abb750527a717c21ced21008";
+  };
+
+  # 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..b7592885007e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/furl/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, flake8, six, orderedmultidict, pytest }:
+
+buildPythonPackage rec {
+  pname = "furl";
+  version = "2.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "08dnw3bs1mk0f1ccn466a5a7fi1ivwrp0jspav9arqpf3wd27q60";
+  };
+
+  checkInputs = [ flake8 pytest ];
+
+  propagatedBuildInputs = [ six orderedmultidict ];
+
+  # see https://github.com/gruns/furl/issues/121
+  checkPhase = ''
+    pytest -k 'not join'
+  '';
+
+  meta = with lib; {
+    description = "furl is a small 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/fuse-python/default.nix b/nixpkgs/pkgs/development/python-modules/fuse-python/default.nix
new file mode 100644
index 000000000000..a130fab0d7eb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fuse-python/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, pkg-config, fuse }:
+
+buildPythonPackage rec {
+  pname = "fuse-python";
+  version = "1.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "da42d4f596a2e91602bcdf46cc51747df31c074a3ceb78bccc253c483a8a75fb";
+  };
+
+  buildInputs = [ fuse ];
+  nativeBuildInputs = [ pkg-config ];
+
+  # no tests implemented
+  doCheck = false;
+
+  pythonImportsCheck = [ "fuse" ];
+
+  meta = with lib; {
+    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..858d3e13ea0c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fusepy/default.nix
@@ -0,0 +1,37 @@
+{ 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;
+
+  patchPhase = ''
+    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..ffb798e6487f
--- /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.0.0";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "future_fstrings";
+    sha256 = "1pra33in6rinrcs5wvdb1rbxmx223j93ahdwhzwgf7wyfsnjda98";
+  };
+
+  # 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/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/futures/default.nix b/nixpkgs/pkgs/development/python-modules/futures/default.nix
new file mode 100644
index 000000000000..bc19a31927af
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/futures/default.nix
@@ -0,0 +1,27 @@
+{ lib, buildPythonPackage, fetchPypi, isPy3k, python, stdenv }:
+
+buildPythonPackage rec {
+  pname = "futures";
+  version = "3.3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "7e033af76a5e35f58e56da7a91e687706faf4e7bdfb2cbc3f2cca6b9bcda9794";
+  };
+
+  # This module is for backporting functionality to Python 2.x, it's builtin in py3k
+  disabled = isPy3k;
+
+  checkPhase = ''
+    ${python.interpreter} test_futures.py
+  '';
+
+  doCheck = !stdenv.isDarwin;
+
+  meta = with lib; {
+    description = "Backport of the concurrent.futures package from Python 3.2";
+    homepage = "https://github.com/agronholm/pythonfutures";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [  ];
+  };
+}
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..c2d16a559842
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fuzzywuzzy/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv, 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; [ earvstedt ];
+  };
+}
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..bcc7a4b5c988
--- /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 = 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/gast/default.nix b/nixpkgs/pkgs/development/python-modules/gast/default.nix
new file mode 100644
index 000000000000..e4dbe43ef8d7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gast/default.nix
@@ -0,0 +1,16 @@
+{ lib, stdenv, fetchPypi, buildPythonPackage, astunparse }:
+
+buildPythonPackage rec {
+  pname = "gast";
+  version =  "0.4.0";
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "40feb7b8b8434785585ab224d1568b857edb18297e5a3047f1ba012bc83b42c1";
+  };
+  checkInputs = [ astunparse ] ;
+  meta = with lib; {
+    description = "GAST provides a compatibility layer between the AST of various Python versions, as produced by ast.parse from the standard ast module.";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ jyp ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gateone/default.nix b/nixpkgs/pkgs/development/python-modules/gateone/default.nix
new file mode 100644
index 000000000000..981cbbb7e8c3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gateone/default.nix
@@ -0,0 +1,35 @@
+{ lib, stdenv
+, buildPythonPackage
+, tornado
+, futures
+, html5lib
+, pkgs
+, isPy3k
+}:
+
+buildPythonPackage {
+  pname = "gateone";
+  version = "1.2-0d57c3";
+  disabled = isPy3k;
+
+  src = pkgs.fetchFromGitHub {
+    rev = "1d0e8037fbfb7c270f3710ce24154e24b7031bea";
+    owner= "liftoff";
+    repo = "GateOne";
+    sha256 = "1ghrawlqwv7wnck6alqpbwy9mpv0y21cw2jirrvsxaracmvgk6vv";
+  };
+
+  propagatedBuildInputs = [tornado futures html5lib pkgs.openssl pkgs.cacert pkgs.openssh];
+
+  postInstall=''
+    cp -R "$out/gateone/"* $out/lib/python2.7/site-packages/gateone
+  '';
+
+  meta = with lib; {
+    homepage = "http://liftoffsoftware.com/";
+    description = "GateOne is a web-based terminal emulator and SSH client";
+    maintainers = with maintainers; [ tomberek ];
+    license = licenses.gpl3;
+  };
+
+}
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..bedb7f3a3755
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gcovr/default.nix
@@ -0,0 +1,39 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, jinja2
+, lxml
+}:
+
+buildPythonPackage rec {
+  pname = "gcovr";
+  version = "4.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0gyady7x3v3l9fm1zan0idaggqqcm31y7g5vxk7h05p5h7f39bjs";
+  };
+
+  propagatedBuildInputs = [
+    jinja2
+    lxml
+  ];
+
+  # 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 = "A Python script for summarizing gcov data";
+    license = licenses.bsd0;
+    homepage = "https://www.gcovr.com/";
+  };
+
+}
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..bf9c01c250ab
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gdata/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv
+, 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..9af107272854
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gdown/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonApplication
+, fetchPypi
+, filelock
+, requests
+, tqdm
+, setuptools
+}:
+
+buildPythonApplication rec {
+  pname = "gdown";
+  version = "3.12.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "4b3a1301e57bfd8dce939bf25ef8fbb4b23967fd0f878eede328bdcc41386bac";
+  };
+
+  propagatedBuildInputs = [ filelock requests tqdm setuptools ];
+
+  checkPhase = ''
+    $out/bin/gdown --help > /dev/null
+  '';
+
+  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/gdrivefs/default.nix b/nixpkgs/pkgs/development/python-modules/gdrivefs/default.nix
new file mode 100644
index 000000000000..aab5efea97de
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gdrivefs/default.nix
@@ -0,0 +1,48 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchurl
+, isPy3k
+, gipc
+, greenlet
+, httplib2
+, six
+, dateutil
+, fusepy
+, google_api_python_client
+}:
+
+buildPythonPackage rec {
+  version = "0.14.12";
+  pname = "gdrivefs";
+  disabled = isPy3k;
+
+  src = fetchurl {
+    url = "https://github.com/dsoprea/GDriveFS/archive/${version}.tar.gz";
+    sha256 = "0m45z77idy0bs5fqlz0y534fy28ikamrd321hmqsc3q7d39kqzv0";
+  };
+
+  buildInputs = [ gipc greenlet httplib2 six ];
+  propagatedBuildInputs = [ dateutil fusepy google_api_python_client ];
+
+  patchPhase = ''
+    substituteInPlace gdrivefs/resources/requirements.txt \
+      --replace "==" ">="
+  '';
+
+  meta = with lib; {
+    description = "Mount Google Drive as a local file system";
+    longDescription = ''
+      GDriveFS is a FUSE wrapper for Google Drive developed. Design goals:
+      - Thread for monitoring changes via "changes" functionality of API.
+      - Complete stat() implementation.
+      - Seamlessly work around duplicate-file allowances in Google Drive.
+      - Seamlessly manage file-type versatility in Google Drive
+        (Google Doc files do not have a particular format).
+      - Allow for the same file at multiple paths.
+    '';
+    homepage = "https://github.com/dsoprea/GDriveFS";
+    license = licenses.gpl2;
+    platforms = platforms.unix;
+  };
+
+}
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..4eb209a8af7f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/geeknote/default.nix
@@ -0,0 +1,38 @@
+{ lib, stdenv
+, 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/genanki/default.nix b/nixpkgs/pkgs/development/python-modules/genanki/default.nix
new file mode 100644
index 000000000000..f43fdabf09e5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/genanki/default.nix
@@ -0,0 +1,38 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, isPy3k
+, cached-property, frozendict, pystache, pyyaml, pytest, pytestrunner
+}:
+
+buildPythonPackage rec {
+  pname = "genanki";
+  version = "0.10.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ced1ddcaecc37289c65c26affb20027705e3821e692327e354e0d5b9b0fd8446";
+  };
+
+  propagatedBuildInputs = [
+    pytestrunner
+    cached-property
+    frozendict
+    pystache
+    pyyaml
+  ];
+
+  checkInputs = [ pytest ];
+
+  disabled = !isPy3k;
+
+  # relies on upstream anki
+  doCheck = false;
+  checkPhase = ''
+    py.test
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/kerrickstaley/genanki";
+    description = "Generate Anki decks programmatically";
+    license = licenses.mit;
+    maintainers = with maintainers; [ teto ];
+  };
+}
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..d5e82332c30b
--- /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 = "2021.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "9bc062fa98c5c466ff464d8974be81a6bf67af9247b5e5176215ad1e81a6cdac";
+  };
+
+  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..9a6e4508e30e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/genshi/default.nix
@@ -0,0 +1,35 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, setuptools
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "Genshi";
+  version = "0.7.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "c12d6c2abf7df0ec661d9ff2e197522eae846e43dc58abd5a36443d05bc41135";
+  };
+
+  # 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..be6321f86ca7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gensim/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, numpy
+, six
+, scipy
+, smart_open
+, scikitlearn, testfixtures, unittest2
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "gensim";
+  version = "3.8.3";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0rx37vnjspjl45v7bj123xwsjfgbwv91v8zpqpli8lgpf42xnskq";
+  };
+
+  propagatedBuildInputs = [ smart_open numpy six scipy ];
+
+  checkInputs = [ scikitlearn testfixtures unittest2 ];
+
+  # Two tests fail.
+  #
+  # ERROR: testAddMorphemesToEmbeddings (gensim.test.test_varembed_wrapper.TestVarembed)
+  # ImportError: Could not import morfessor.
+  # This package is not in nix
+  #
+  # ERROR: testWmdistance (gensim.test.test_fasttext_wrapper.TestFastText)
+  # ImportError: Please install pyemd Python package to compute WMD.
+  # This package is not in nix
+  doCheck = false;
+
+  meta = {
+    description = "Topic-modelling library";
+    homepage = "https://radimrehurek.com/gensim/";
+    license = lib.licenses.lgpl21;
+    maintainers = with lib.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..129eaae340a1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gentools/default.nix
@@ -0,0 +1,31 @@
+{ buildPythonPackage, lib, fetchFromGitHub, pytest
+, typing, funcsigs, 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..8f486cc29efb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/genzshcomp/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv
+, 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..56f9346668f6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/geoalchemy2/default.nix
@@ -0,0 +1,31 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, sqlalchemy
+, shapely
+, setuptools_scm
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "GeoAlchemy2";
+  version = "0.8.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "02jbad9vbnjx8bmfvxg77z18nymrry6li8hy9pwi0yiyvwbnycyr";
+  };
+
+  nativeBuildInputs = [ setuptools_scm ];
+  propagatedBuildInputs = [ sqlalchemy shapely ];
+
+  # https://github.com/geoalchemy/geoalchemy2/blob/e05a676350b11f0e73609379dae5625c5de2e868/TEST.rst
+  doCheck = false;
+
+  meta = with lib; {
+    homepage =  "http://geoalchemy.org/";
+    license = licenses.mit;
+    description = "Toolkit for working with spatial databases";
+  };
+
+}
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..98c1ee417e43
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/geographiclib/default.nix
@@ -0,0 +1,22 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "geographiclib";
+  version = "1.50";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0cn6ap5fkh3mkfa57l5b44z3gvz7j6lpmc9rl4g2jny2gvp4dg8j";
+  };
+
+  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; [ va1entin ];
+  };
+
+}
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..69b5d2f97fbe
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/geoip2/default.nix
@@ -0,0 +1,34 @@
+{ buildPythonPackage, lib, fetchPypi, isPy27
+, aiohttp
+, maxminddb
+, mock
+, mocket
+, requests
+, requests-mock
+}:
+
+buildPythonPackage rec {
+  version = "4.1.0";
+  pname = "geoip2";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "57d8d15de2527e0697bbef44fc16812bba709f03a07ef99297bd56c1df3b1efd";
+  };
+
+  patchPhase = ''
+    substituteInPlace requirements.txt --replace "requests>=2.24.0,<3.0.0" "requests"
+  '';
+
+  propagatedBuildInputs = [ aiohttp requests maxminddb ];
+
+  checkInputs = [ mocket requests-mock ];
+
+  meta = with lib; {
+    description = "MaxMind GeoIP2 API";
+    homepage = "https://www.maxmind.com/en/home";
+    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..7e683e204834
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/geojson-client/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, geojson
+, haversine
+, pytz
+, requests
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "geojson-client";
+  version = "0.5";
+
+  src = fetchFromGitHub {
+    owner = "exxamalte";
+    repo = "python-geojson-client";
+    rev = "v${version}";
+    sha256 = "1cc6ymbn45dv7xdl1r8bbizlmsdbxjmsfza442yxmmm19nxnnqjv";
+  };
+
+  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/geopandas/default.nix b/nixpkgs/pkgs/development/python-modules/geopandas/default.nix
new file mode 100644
index 000000000000..70963a85d41d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/geopandas/default.nix
@@ -0,0 +1,51 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub, isPy27
+, pandas, shapely, fiona, descartes, pyproj
+, pytestCheckHook, Rtree, fetchpatch }:
+
+buildPythonPackage rec {
+  pname = "geopandas";
+  version = "0.8.1";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "geopandas";
+    repo = "geopandas";
+    rev = "v${version}";
+    sha256 = "0618p0s0biisxk2s0h43hkc3bs1nwjk84rxbfyd6brfvs9yx4vq7";
+  };
+
+  patches = [
+    # Fix for test test_numerical_operations: https://github.com/geopandas/geopandas/issues/1541
+    (fetchpatch {
+      url = "https://github.com/geopandas/geopandas/pull/1544/commits/6ce868a33a2f483b071089d51e178030fa4414d0.patch";
+      sha256 = "1sjgxrqgbhz5krx51hrv230ywszcdl6z8q3bj6830kfad8n8b5dq";
+    })
+    # Fix GeoJSON for Fiona>=1.8.16 (Sep. 7, 2020).
+    # https://github.com/geopandas/geopandas/issues/1606
+    # Will be included in next upstream release after 0.8.1
+    (fetchpatch {
+      url = "https://github.com/geopandas/geopandas/commit/72427d3d8c128039bfce1d54a76c0b652887b276.patch";
+      sha256 = "1726mrpddgmba0ngff73a5bsb6ywpsg63a2pdd2grp9339bgvi4a";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    pandas
+    shapely
+    fiona
+    descartes
+    pyproj
+  ];
+
+  doCheck = !stdenv.isDarwin;
+  checkInputs = [ pytestCheckHook Rtree ];
+  disabledTests = [ "web" ];
+  pytestFlagsArray = [ "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/2.nix b/nixpkgs/pkgs/development/python-modules/geopy/2.nix
new file mode 100644
index 000000000000..ae4e07e25479
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/geopy/2.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, geographiclib
+}:
+
+buildPythonPackage rec {
+  pname = "geopy";
+  version = "1.22.0";
+
+  disabled = !isPy27; # only Python 2.7
+  doCheck = false; # Needs network access
+
+  propagatedBuildInputs = [ geographiclib ];
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0jypkaqlbyr8icqypwm23lzsvq7flakp3a3nqr8ib5fmd0fzsq7q";
+  };
+
+  meta = with lib; {
+    homepage = "https://github.com/geopy/geopy";
+    description = "Python Geocoding Toolbox";
+    license = licenses.mit;
+    maintainers = with maintainers; [GuillaumeDesforges];
+  };
+}
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..693a4221ee09
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/geopy/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, async_generator
+, buildPythonPackage
+, fetchFromGitHub
+, geographiclib
+, isPy3k
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "geopy";
+  version = "2.1.0";
+  disabled = !isPy3k; # only Python 3
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = version;
+    sha256 = "0239a4achk49ngagb6aqy6cgzfwgbxir07vwi13ysbpx78y0l4g9";
+  };
+
+  propagatedBuildInputs = [ geographiclib ];
+
+  checkInputs = [
+    async_generator
+    pytestCheckHook
+  ];
+
+  # Exclude tests which perform API calls
+  pytestFlagsArray = [ "--ignore test/geocoders/" ];
+  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/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..51ce0ef05031
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/getmac/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, fetchFromGitHub
+, pytest, pytest-benchmark, pytest-mock }:
+
+buildPythonPackage rec {
+  pname = "getmac";
+  version = "0.8.2";
+
+  src = fetchFromGitHub {
+    owner = "GhostofGoes";
+    repo = "getmac";
+    rev = version;
+    sha256 = "08d4iv5bjl1s4i9qhzf3pzjgj1rgbwi0x26qypf3ycgdj0a6gvh2";
+  };
+
+  checkInputs = [ pytest pytest-benchmark pytest-mock ];
+  checkPhase = ''
+    pytest --ignore tests/test_cli.py
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/GhostofGoes/getmac";
+    description = "Pure-Python package to get the MAC address of network interfaces and hosts on the local network.";
+    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..88d1089d5a31
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gevent-socketio/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, versiontools
+, gevent-websocket
+, mock
+, pytest
+, gevent
+}:
+
+buildPythonPackage rec {
+  pname = "gevent-socketio";
+  version = "0.3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1zra86hg2l1jcpl9nsnqagy3nl3akws8bvrbpgdxk15x7ywllfak";
+  };
+
+  buildInputs = [ versiontools gevent-websocket mock pytest ];
+  propagatedBuildInputs = [ gevent ];
+
+  meta = with lib; {
+    homepage = "https://github.com/abourget/gevent-socketio";
+    description = "SocketIO server based on the Gevent pywsgi server, a Python network library";
+    license = licenses.bsd0;
+  };
+
+}
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..431a0c09a30c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gevent-websocket/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+, gevent
+, gunicorn
+}:
+
+buildPythonPackage rec {
+  pname = "gevent-websocket";
+  version = "0.10.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1c2zv2rahp1gil3cj66hfsqgy0n35hz9fny3ywhr2319d0lz7bky";
+  };
+
+  propagatedBuildInputs = [ gevent gunicorn ];
+
+  meta = with lib; {
+    homepage = "https://www.gitlab.com/noppo/gevent-websocket";
+    description = "Websocket handler for the gevent pywsgi server, a Python network library";
+    license = licenses.asl20;
+  };
+
+}
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..0fcf6cdfaaa9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gevent/default.nix
@@ -0,0 +1,35 @@
+{ lib, stdenv, fetchPypi, buildPythonPackage, isPyPy, python, libev, greenlet
+, zope_interface
+}:
+
+buildPythonPackage rec {
+  pname = "gevent";
+  version = "20.9.0";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "13aw9x6imsy3b369kfjblqiwfni69pp32m4r13n62r9k3l2lhvaz";
+  };
+
+  buildInputs = [ libev ];
+  propagatedBuildInputs = [
+    zope_interface
+  ] ++ lib.optionals (!isPyPy) [ greenlet ];
+
+  checkPhase = ''
+    cd greentest
+    ${python.interpreter} testrunner.py
+  '';
+
+  # Bunch of failures.
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Coroutine-based networking library";
+    homepage = "http://www.gevent.org/";
+    license = licenses.mit;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ bjornfor ];
+  };
+}
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..fafbef12bd3a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/geventhttpclient/default.nix
@@ -0,0 +1,36 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, pytest
+, gevent
+, certifi
+, six
+, backports_ssl_match_hostname
+}:
+
+buildPythonPackage rec {
+  pname = "geventhttpclient";
+  version = "1.4.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f59e5153f22e4a0be27b48aece8e45e19c1da294f8c49442b1c9e4d152c5c4c3";
+  };
+
+  buildInputs = [ pytest ];
+  propagatedBuildInputs = [ gevent certifi six backports_ssl_match_hostname ];
+
+  # Several tests fail that require network
+  doCheck = false;
+  checkPhase = ''
+    py.test $out
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/gwik/geventhttpclient";
+    description = "HTTP client library for 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/ghdiff/default.nix b/nixpkgs/pkgs/development/python-modules/ghdiff/default.nix
new file mode 100644
index 000000000000..a9582648117a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ghdiff/default.nix
@@ -0,0 +1,22 @@
+{ lib, stdenv, 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/gidgethub/default.nix b/nixpkgs/pkgs/development/python-modules/gidgethub/default.nix
new file mode 100644
index 000000000000..a28bcfb0ec1b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gidgethub/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, setuptools
+, pytestrunner
+, pytest
+, pytest-asyncio
+, twisted
+, treq
+, tornado
+, aiohttp
+, uritemplate
+, pyjwt
+}:
+
+buildPythonPackage rec {
+  pname = "gidgethub";
+  version = "4.2.0";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "5526cc2a06bfad707d10ec118393e0d33c2aa524605255d96958c22c93e8e7aa";
+  };
+
+  nativeBuildInputs = [ setuptools pytestrunner ];
+  checkInputs = [ pytest pytest-asyncio twisted treq tornado aiohttp ];
+  propagatedBuildInputs = [
+    uritemplate
+    pyjwt
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "extras_require=extras_require," "extras_require=None,"
+  '';
+
+  # requires network (reqests github.com)
+  doCheck = false;
+
+  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/gin-config/default.nix b/nixpkgs/pkgs/development/python-modules/gin-config/default.nix
new file mode 100644
index 000000000000..14842541d6ce
--- /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.4.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "9499c060e1faa340959fc4ada7fe53f643d6f8996a80262b28a082c1ef6849de";
+
+  };
+
+  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/gipc/default.nix b/nixpkgs/pkgs/development/python-modules/gipc/default.nix
new file mode 100644
index 000000000000..a48547f29099
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gipc/default.nix
@@ -0,0 +1,34 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, gevent
+}:
+
+buildPythonPackage rec {
+  pname = "gipc";
+  version = "1.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "06116628e9cb7b2c34c8f248d0e4859fa5943e1e07381ad2b234ae9c7ed6f4cc";
+  };
+
+  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;
+    # gipc only has support for older versions of gevent
+    broken = versionOlder "1.6" gevent.version;
+  };
+
+}
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..5922377ab3a1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/git-annex-adapter/default.nix
@@ -0,0 +1,49 @@
+{ lib, stdenv, 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";
+    })
+    (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-revise/default.nix b/nixpkgs/pkgs/development/python-modules/git-revise/default.nix
new file mode 100644
index 000000000000..a6dd3ecb7c80
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/git-revise/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, git
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "git-revise";
+  version = "0.6.0";
+
+  # Missing tests on PyPI
+  src = fetchFromGitHub {
+    owner = "mystor";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "03v791yhips9cxz9hr07rhsgxfhwyqq17rzi7ayjhwvy65s4hzs9";
+  };
+
+  disabled = pythonOlder "3.6";
+
+  checkInputs = [ git 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..adb9de4dbc0d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/git-sweep/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, GitPython
+}:
+
+buildPythonPackage rec {
+  pname = "git-sweep";
+  version = "0.1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1csp0zd049d643d409rfivbswwzrayb4i6gkypp5mc27fb1z2afd";
+  };
+
+  propagatedBuildInputs = [ GitPython ];
+
+  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..5c3bd4ac43fc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gitdb/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, smmap
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "gitdb";
+  version = "4.0.5";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "c9e1f2d0db7ddb9a704c2a0217be31214e91a4fe1dea1efad19ae42ba0c285c9";
+  };
+
+  propagatedBuildInputs = [ smmap ];
+
+  # 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-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..6b1ea305d4a6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/github3_py/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, pythonOlder
+, buildPythonPackage
+, fetchPypi
+, betamax
+, pytest
+, betamax-matchers
+, unittest2
+, mock
+, requests
+, uritemplate
+, dateutil
+, jwcrypto
+, pyopenssl
+, ndg-httpsclient
+, pyasn1
+}:
+
+buildPythonPackage rec {
+  pname = "github3.py";
+  version = "1.3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "15a115c18f7bfcf934dfef7ab103844eb9f620c586bad65967708926da47cbda";
+  };
+
+  checkInputs = [ betamax pytest betamax-matchers ]
+    ++ lib.optional (pythonOlder "3") unittest2
+    ++ lib.optional (pythonOlder "3.3") mock;
+  propagatedBuildInputs = [ requests uritemplate dateutil jwcrypto pyopenssl ndg-httpsclient pyasn1 ];
+
+  postPatch = ''
+    sed -i -e 's/unittest2 ==0.5.1/unittest2>=0.5.1/' setup.py
+  '';
+
+  # TODO: only disable the tests that require network
+  doCheck = false;
+
+  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/glances-api/default.nix b/nixpkgs/pkgs/development/python-modules/glances-api/default.nix
new file mode 100644
index 000000000000..2f5a1416e41c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/glances-api/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, aiohttp
+, async-timeout
+}:
+
+buildPythonPackage rec {
+  pname = "glances-api";
+  version = "0.2.0";
+
+  src = fetchFromGitHub {
+    owner = "home-assistant-ecosystem";
+    repo = "python-glances-api";
+    rev = version;
+    sha256 = "0rgv77n0lvr7d3vk4qc8svipxafmm6s4lfxrl976hsygrhaqidch";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    async-timeout
+  ];
+
+  # no tests are present
+  doCheck = false;
+  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..8a63f78728e2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/glasgow/default.nix
@@ -0,0 +1,75 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, setuptools_scm
+, sdcc
+, nmigen
+, fx2
+, libusb1
+, aiohttp
+, pyvcd
+, bitarray
+, crcmod
+, yosys
+, icestorm
+, nextpnr
+}:
+
+buildPythonPackage rec {
+  pname = "glasgow";
+  version = "unstable-2020-06-29";
+  # python software/setup.py --version
+  realVersion = "0.1.dev1352+g${lib.substring 0 7 src.rev}";
+
+  src = fetchFromGitHub {
+    owner = "GlasgowEmbedded";
+    repo = "glasgow";
+    rev = "f885790d7927b893e631c33744622d6ebc18b5e3";
+    sha256 = "sha256-fSorSEa5K09aPEOk4XPWOFRxYl1KGVy29jOBqIvs2hk=";
+  };
+
+  nativeBuildInputs = [ setuptools_scm sdcc ];
+
+  propagatedBuildInputs = [
+    setuptools
+    nmigen
+    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 ];
+  };
+}
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..21d2983ab015
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/globre/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv
+, 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..20d47dfe7e94
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/globus-sdk/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, flake8
+, nose2
+, mock
+, requests
+, pyjwt
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "globus-sdk";
+  version = "1.10.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b33021b58edacc16bf2ba8453efbb26a8b04242ee3f4d62dcdaa3c6e199f136f";
+  };
+
+  checkPhase = ''
+    py.test tests
+  '';
+
+  # No tests in archive
+  doCheck = false;
+
+  checkInputs = [ flake8 nose2 mock ];
+
+  propagatedBuildInputs = [ requests pyjwt  ];
+
+  meta = with lib; {
+    description = "A convenient Pythonic 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..2acc87a17ac4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/glom/default.nix
@@ -0,0 +1,37 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, boltons
+, attrs
+, face
+, pytest
+, pyyaml
+, isPy37
+}:
+
+buildPythonPackage rec {
+  pname = "glom";
+  version = "20.11.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "54051072bccc9cdb3ebbd8af0559195137a61d308f04bff19678e4b61350eb12";
+  };
+
+  propagatedBuildInputs = [ boltons attrs face ];
+
+  checkInputs = [ pytest pyyaml ];
+  # test_cli.py checks the output of running "glom"
+  checkPhase = "PATH=$out/bin:$PATH pytest glom/test";
+
+  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..50ed257f57e0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/glymur/default.nix
@@ -0,0 +1,51 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, numpy
+, setuptools
+, python
+, scikitimage
+, openjpeg
+, procps
+, contextlib2
+, mock
+, importlib-resources
+, isPy27
+}:
+
+buildPythonPackage rec {
+  pname = "glymur";
+  version = "0.8.18";
+
+  src = fetchFromGitHub {
+    owner = "quintusdias";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1zbghzw1q4fljb019lsrhka9xrnn4425qnxrjbmbv7dssgkkywd7";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+  ] ++ lib.optional isPy27 [ contextlib2 mock importlib-resources ];
+
+  checkInputs = [
+    scikitimage
+    procps
+  ];
+
+  postConfigure = ''
+    substituteInPlace glymur/config.py \
+    --replace "path = read_config_file(libname)" "path = '${openjpeg}/lib' + libname + ${if stdenv.isDarwin then "'.dylib'" else "'.so'"}"
+  '';
+
+  checkPhase = ''
+    ${python.interpreter} -m unittest discover
+  '';
+
+  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/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..808b918681bb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gmpy2/default.nix
@@ -0,0 +1,35 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, isPyPy
+, gmp
+, mpfr
+, libmpc
+}:
+
+let
+  pname = "gmpy2";
+  version = "2.1.0b5";
+in
+
+buildPythonPackage {
+  inherit pname version;
+
+  disabled = isPyPy;
+
+  src = fetchFromGitHub {
+    owner = "aleaxit";
+    repo = "gmpy";
+    rev = "gmpy2-${version}";
+    sha256 = "1mqzyp7qwqqyk6jbicgx22svdy2106xwhmhfvdf0vpnmwswcxclb";
+  };
+
+  buildInputs = [ gmp mpfr libmpc ];
+
+  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/gmusicapi/default.nix b/nixpkgs/pkgs/development/python-modules/gmusicapi/default.nix
new file mode 100644
index 000000000000..821e0ba0afa9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gmusicapi/default.nix
@@ -0,0 +1,37 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, validictory
+, decorator
+, mutagen
+, protobuf
+, setuptools
+, requests
+, dateutil
+, proboscis
+, mock
+, appdirs
+, oauth2client
+, pyopenssl
+, gpsoauth
+, MechanicalSoup
+, future
+}:
+
+buildPythonPackage rec {
+  pname = "gmusicapi";
+  version = "13.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "14dqs64nhy84dykyyrdjmsirc7m169zsvwa8abh4v0xcm658lm5k";
+  };
+
+  propagatedBuildInputs = [ validictory decorator mutagen protobuf setuptools requests dateutil proboscis mock appdirs oauth2client pyopenssl gpsoauth MechanicalSoup future ];
+
+  meta = with lib; {
+    description = "An unofficial API for Google Play Music";
+    homepage = "https://pypi.python.org/pypi/gmusicapi/";
+    license = licenses.bsd3;
+  };
+}
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..cde1f9bb8ca6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gntp/default.nix
@@ -0,0 +1,23 @@
+{ lib, buildPythonPackage, fetchPypi, nose }:
+
+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..71116c37041b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gnureadline/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPyPy
+, pkgs
+}:
+
+buildPythonPackage rec {
+  version = "8.0.0";
+  pname = "gnureadline";
+  disabled = isPyPy;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0xllr43dizvybmb68i0ybk1xhaqx5abjwxa9vrg43b9ds0pggvk1";
+  };
+
+  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/gnutls/default.nix b/nixpkgs/pkgs/development/python-modules/gnutls/default.nix
new file mode 100644
index 000000000000..addbee81bd3f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gnutls/default.nix
@@ -0,0 +1,31 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+, pkgs
+}:
+
+buildPythonPackage rec {
+  pname = "python-gnutls";
+  version = "3.1.3";
+
+  # https://github.com/AGProjects/python-gnutls/issues/2
+  disabled = isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "79f94017e6472ac665c85bc16d68aa2e6681f53b6a9e74516557b49b6fc6a651";
+  };
+
+  propagatedBuildInputs = [ pkgs.gnutls ];
+  patchPhase = ''
+    substituteInPlace gnutls/library/__init__.py --replace "/usr/local/lib" "${pkgs.gnutls.out}/lib"
+  '';
+
+  meta = with lib; {
+    description = "Python wrapper for the GnuTLS library";
+    homepage = "https://github.com/AGProjects/python-gnutls";
+    license = licenses.lgpl2;
+  };
+
+}
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..c587c928e7e7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/goobook/default.nix
@@ -0,0 +1,43 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, isPy3k
+, docutils, installShellFiles
+, google_api_python_client, simplejson, oauth2client, setuptools, xdg
+}:
+
+buildPythonPackage rec {
+  pname = "goobook";
+  version = "3.5.1";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "6e69aeaf69112d116302f0c42ca1904f3b6efd17f15cefc12c866206160293be";
+  };
+
+  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..b0eea600384e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/goocalendar/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, pkg-config
+, gtk3
+, gobject-introspection
+, pygtk
+, pygobject3
+, goocanvas2
+, isPy3k
+ }:
+
+buildPythonPackage rec {
+  pname = "GooCalendar";
+  version = "0.7.1";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1ccvw1w7xinl574h16hqs6dh3fkpm5n1jrqwjqz3ignxvli5sr38";
+  };
+
+  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/google-api-core/default.nix b/nixpkgs/pkgs/development/python-modules/google-api-core/default.nix
new file mode 100644
index 000000000000..6715590dc329
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-api-core/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, google-auth
+, googleapis_common_protos
+, grpcio
+, protobuf
+, pytz
+, requests
+, mock
+, pytest
+, pytest-asyncio
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "google-api-core";
+  version = "1.24.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0sflnpgsvk2h1cr1m3mgxx6pzz55xw7sk4y4qdimhs5jdm2fw78g";
+  };
+
+  propagatedBuildInputs = [
+    googleapis_common_protos
+    google-auth
+    grpcio
+    protobuf
+    pytz
+    requests
+  ];
+
+  checkInputs = [ mock pytest-asyncio pytestCheckHook ];
+
+  # prevent google directory from shadowing google imports
+  preCheck = ''
+    rm -r google
+  '';
+
+  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..854ec37a1e4a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-api-python-client/default.nix
@@ -0,0 +1,39 @@
+{ lib, buildPythonPackage, fetchPypi
+, google-auth, google-auth-httplib2, google-api-core
+, httplib2, six, uritemplate, oauth2client, setuptools }:
+
+buildPythonPackage rec {
+  pname = "google-api-python-client";
+  version = "1.12.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f3b9684442eec2cfe9f9bb48e796ef919456b82142c7528c5fd527e5224f08bb";
+  };
+
+  # No tests included in archive
+  doCheck = false;
+
+  propagatedBuildInputs = [
+    google-auth google-auth-httplib2 google-api-core
+    httplib2 six uritemplate oauth2client setuptools
+  ];
+
+  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; [ primeos ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/google-apputils/default.nix b/nixpkgs/pkgs/development/python-modules/google-apputils/default.nix
new file mode 100644
index 000000000000..7cc7f4858826
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-apputils/default.nix
@@ -0,0 +1,41 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+, pytz
+, gflags
+, dateutil
+, mox
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "google-apputils";
+  version = "0.4.2";
+  disabled = isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0afw0gxmh0yw5g7xsmw49gs8bbp0zyhbh6fr1b0h48f3a439v5a7";
+  };
+
+  preConfigure = ''
+    sed -i '/ez_setup/d' setup.py
+  '';
+
+  propagatedBuildInputs = [ pytz gflags dateutil mox ];
+
+  checkPhase = ''
+    ${python.executable} setup.py google_test
+  '';
+
+  # ERROR:root:Trying to access flag test_tmpdir before flags were parsed.
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Google Application Utilities for Python";
+    homepage = "https://github.com/google/google-apputils";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..bb7836ef85d1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-auth-httplib2/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, isPy3k
+, buildPythonPackage
+, fetchPypi
+, flask
+, google-auth
+, httplib2
+, mock
+, pytestCheckHook
+, pytest-localserver
+}:
+
+buildPythonPackage rec {
+  pname = "google-auth-httplib2";
+  version = "0.0.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0fdwnx2yd65f5vhnmn39f4xnxac5j6x0pv2p42qifrdi1z32q2cd";
+  };
+
+  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..7fa7200fbbe5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-auth-oauthlib/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, click
+, mock
+, pytestCheckHook
+, google-auth
+, requests_oauthlib
+}:
+
+buildPythonPackage rec {
+  pname = "google-auth-oauthlib";
+  version = "0.4.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1nai9k86g7g7w1pxk105dllncgax8nc5hpmk758b3jnqkb1mpdk5";
+  };
+
+  propagatedBuildInputs = [
+    google-auth
+    requests_oauthlib
+  ];
+
+  checkInputs = [
+    click
+    mock
+    pytestCheckHook
+  ];
+
+  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..9120f93a3bdd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-auth/default.nix
@@ -0,0 +1,54 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchpatch
+, fetchPypi
+, pytestCheckHook
+, cachetools
+, flask
+, freezegun
+, mock
+, oauth2client
+, pyasn1-modules
+, pytest-localserver
+, responses
+, rsa
+}:
+
+buildPythonPackage rec {
+  pname = "google-auth";
+  version = "1.24.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0bmdqkyv8k8n6s8dss4zpbcq1cdxwicpb42kwybd02ia85mh43hb";
+  };
+
+  propagatedBuildInputs = [ pyasn1-modules cachetools rsa ];
+
+  checkInputs = [
+    flask
+    freezegun
+    mock
+    oauth2client
+    pytestCheckHook
+    pytest-localserver
+    responses
+  ];
+
+  pythonImportsCheck = [
+    "google.auth"
+    "google.oauth2"
+  ];
+
+  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..3f614258a8fb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-access-context-manager/default.nix
@@ -0,0 +1,27 @@
+{ lib, buildPythonPackage, fetchPypi, pythonOlder, google-api-core }:
+
+buildPythonPackage rec {
+  pname = "google-cloud-access-context-manager";
+  version = "0.1.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1qy7wv1xn7g3x5z0vvv0pwmxhin4hw2m9fs9iklnghy00vg37v0b";
+  };
+
+  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-asset/default.nix b/nixpkgs/pkgs/development/python-modules/google-cloud-asset/default.nix
new file mode 100644
index 000000000000..8f04fb7451d2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-asset/default.nix
@@ -0,0 +1,54 @@
+{ lib, stdenv
+, 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
+, pytest-asyncio
+, pytestCheckHook
+, mock
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-asset";
+  version = "2.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "05q0yaw6b553qmzylr45zin17h8mvi8yyyxhbv3cxa7f0ahviw8w";
+  };
+
+  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-automl/default.nix b/nixpkgs/pkgs/development/python-modules/google-cloud-automl/default.nix
new file mode 100644
index 000000000000..302ce8ceaed3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-automl/default.nix
@@ -0,0 +1,59 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, libcst
+, google-api-core
+, google-cloud-storage
+, google-cloud-testutils
+, pandas
+, proto-plus
+, pytest-asyncio
+, mock
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-automl";
+  version = "2.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "520dfe2ee04d28f3088c9c582fa2a534fc272647d5e2e59acc903c0152e61696";
+  };
+
+  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
+    # requires credentials
+    rm 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..4ec12a8fa2fb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-bigquery-datatransfer/default.nix
@@ -0,0 +1,35 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, google-api-core
+, libcst
+, proto-plus
+, pytestCheckHook
+, pytest-asyncio
+, mock
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-bigquery-datatransfer";
+  version = "3.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0hmsqvs2srmqcwmli48vd5vw829zax3pwj63fsxig6sdhjlf6j7j";
+  };
+
+  propagatedBuildInputs = [ google-api-core libcst proto-plus ];
+  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/default.nix b/nixpkgs/pkgs/development/python-modules/google-cloud-bigquery/default.nix
new file mode 100644
index 000000000000..5eab2c730f7d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-bigquery/default.nix
@@ -0,0 +1,58 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, freezegun
+, google-cloud-core
+, google-cloud-testutils
+, google-resumable-media
+, grpcio
+, ipython
+, mock
+, pandas
+, proto-plus
+, pyarrow
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-bigquery";
+  version = "2.6.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1c940bf190a681d80b6f6cd7541924ad411de5f0585b2c8c5e420ab750e2024d";
+  };
+
+  propagatedBuildInputs = [
+    google-resumable-media
+    google-cloud-core
+    proto-plus
+    pyarrow
+  ];
+
+  checkInputs = [
+    freezegun
+    google-cloud-testutils
+    ipython
+    mock
+    pandas
+    pytestCheckHook
+  ];
+
+  # prevent google directory from shadowing google imports
+  preCheck = ''
+    rm -r google
+  '';
+
+  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..9632dc902d15
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-bigtable/default.nix
@@ -0,0 +1,34 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, grpc_google_iam_v1
+, google-api-core
+, google-cloud-core
+, pytest
+, mock
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-bigtable";
+  version = "1.6.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ace4ff7c6e00fb7d86963503615db85336b6484339f5774bd8c589df224772a8";
+  };
+
+  checkInputs = [ pytest mock ];
+  propagatedBuildInputs = [ grpc_google_iam_v1 google-api-core google-cloud-core ];
+
+  checkPhase = ''
+    rm -r google
+    pytest tests/unit -k 'not policy'
+  '';
+
+  meta = with lib; {
+    description = "Google Cloud Bigtable API client library";
+    homepage = "https://github.com/GoogleCloudPlatform/google-cloud-python";
+    license = licenses.asl20;
+    maintainers = [ 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..6d91bed83ae7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-container/default.nix
@@ -0,0 +1,43 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, google-api-core
+, grpc_google_iam_v1
+, libcst
+, mock
+, proto-plus
+, pytestCheckHook
+, pytest-asyncio
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-container";
+  version = "2.3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "04f9mx1wxy3l9dvzvvr579fnjp1fdqhgplv5y2gl7h2mvn281k8d";
+  };
+
+  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..72709c62ceca
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-core/default.nix
@@ -0,0 +1,38 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, pytestCheckHook
+, python
+, google-api-core
+, grpcio
+, mock
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-core";
+  version = "1.5.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "01liq4nrd2g3ingg8v0ly4c86db8agnr9h1fiz219c7fz0as0xqj";
+  };
+
+  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-dataproc/default.nix b/nixpkgs/pkgs/development/python-modules/google-cloud-dataproc/default.nix
new file mode 100644
index 000000000000..1b7a570fed21
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-dataproc/default.nix
@@ -0,0 +1,42 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, google-api-core
+, mock
+, libcst
+, proto-plus
+, pytestCheckHook
+, pytest-asyncio
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-dataproc";
+  version = "2.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "07rv2kgbaqkbd71k5i2zn9kcxasfzkkyai8jnbszhkf92k0lmi41";
+  };
+
+  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"
+    "google.cloud.dataproc_v1beta2"
+  ];
+
+  meta = with lib; {
+    description = "Google Cloud Dataproc API client library";
+    homepage = "https://github.com/GoogleCloudPlatform/google-cloud-python";
+    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..84f98550b9a3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-datastore/default.nix
@@ -0,0 +1,46 @@
+{ lib, stdenv
+, 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.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1yyk9ix1jms5q4kk76cfxzy42wzzyl5qladdswjy5l0pg6iypr8i";
+  };
+
+  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
+    # requires credentials
+    rm tests/system/test_system.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..9076c1298040
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-dlp/default.nix
@@ -0,0 +1,42 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, google-api-core
+, google-cloud-testutils
+, libcst
+, proto-plus
+, pytestCheckHook
+, pytest-asyncio
+, mock
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-dlp";
+  version = "3.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "09rnzpdlycr1wv8agcfx05v1prn35ylphsbr07486zqdkh5wjk8p";
+  };
+
+  propagatedBuildInputs = [ google-api-core libcst proto-plus ];
+
+  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..0636da60e9af
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-dns/default.nix
@@ -0,0 +1,41 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, google-api-core
+, google-cloud-core
+, pytestCheckHook
+, mock
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-dns";
+  version = "0.32.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "01l6pvfic0vxcvd97ckbxyc7ccr9vb9ln4lyhpp3amdmcy0far3j";
+  };
+
+  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..b3181f8fcded
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-error-reporting/default.nix
@@ -0,0 +1,43 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, google-cloud-logging
+, google-cloud-testutils
+, libcst
+, mock
+, proto-plus
+, pytest-asyncio
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-error-reporting";
+  version = "1.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "2fd6fe25343f7017c22e2733a0358c64b3171edc1669d0c8a1e1f07f86a048c4";
+  };
+
+  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"
+  ];
+
+  # prevent google directory from shadowing google imports
+  preCheck = ''
+    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..f0c235ca0c98
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-firestore/default.nix
@@ -0,0 +1,64 @@
+{ lib, stdenv
+, 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.0.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1q5s2gpkibnjxal9zrz02jfnazf7rxk0bi0ln5a3di6i47kjnga9";
+  };
+
+  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
+  '';
+
+  pytestFlagsArray = [
+    # tests are broken
+    "--ignore=tests/system/test_system.py"
+    "--ignore=tests/system/test_system_async.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/default.nix b/nixpkgs/pkgs/development/python-modules/google-cloud-iam/default.nix
new file mode 100644
index 000000000000..f96940f4e67f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-iam/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+, google-api-core
+, libcst
+, mock
+, proto-plus
+, pytest-asyncio
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-iam";
+  version = "2.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1zxsx5avs8njiyw32zvsx2yblmmiwxy771x334hbgmy0aqms4lak";
+  };
+
+  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..2b28f84a3158
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-iot/default.nix
@@ -0,0 +1,42 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, grpc_google_iam_v1
+, google-api-core
+, libcst
+, proto-plus
+, pytestCheckHook
+, pytest-asyncio
+, mock
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-iot";
+  version = "2.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "08spn5g0s386x21dgwb46na8aknbwq5d1sn8bh6kayk9fjfbxwla";
+  };
+
+  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..6675767a2445
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-kms/default.nix
@@ -0,0 +1,40 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, grpc_google_iam_v1
+, google-api-core
+, libcst
+, mock
+, proto-plus
+, pytest-asyncio
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-kms";
+  version = "2.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0f3k2ixp1zsgydpvkj75bs2mb805389snyw30hn41c38qq5ksdga";
+  };
+
+  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..7186ecd6f355
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-language/default.nix
@@ -0,0 +1,37 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, google-api-core
+, libcst
+, mock
+, proto-plus
+, pytestCheckHook
+, pytest-asyncio
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-language";
+  version = "2.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "123vqfrn7pyn3ia7cmhx8bgafd4gxxlmhf33s3vgspyjck6sprxb";
+  };
+
+  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..58d03f206fc7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-logging/default.nix
@@ -0,0 +1,59 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, django
+, flask
+, google-api-core
+, google-cloud-core
+, google-cloud-testutils
+, mock
+, proto-plus
+, pytestCheckHook
+, pytest-asyncio
+, webapp2
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-logging";
+  version = "2.0.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0s09vs4rnq4637j8zw7grv3f4j7njqprm744b1knzldj91rg0vmi";
+  };
+
+  propagatedBuildInputs = [ google-api-core 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
+  '';
+
+  pythonImortsCheck = [
+    "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..8dc665fe2103
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-monitoring/default.nix
@@ -0,0 +1,42 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, google-api-core
+, google-cloud-testutils
+, libcst
+, proto-plus
+, pytestCheckHook
+, pytest-asyncio
+, mock
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-monitoring";
+  version = "2.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "07r0y995fin6cbnqlhmd38fv3pfhhqyw04l7nr38sldrd82gmsqx";
+  };
+
+  propagatedBuildInputs = [ libcst google-api-core proto-plus ];
+
+  checkInputs = [ google-cloud-testutils mock 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/GoogleCloudPlatform/google-cloud-python";
+    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..10ee559b8f0b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-org-policy/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, fetchPypi, pythonOlder, google-api-core }:
+
+buildPythonPackage rec {
+  pname = "google-cloud-org-policy";
+  version = "0.1.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0ncgcnbvmgqph54yh2pjx2hh82gnkhsrw5yirp4wlf7jclh6j9xh";
+  };
+
+  propagatedBuildInputs = [ google-api-core ];
+
+  # No tests in repo
+  doCheck = false;
+
+  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..94d8d4738f5c
--- /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.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "07zvagy9hwaccwvg1xad5nkalgkria0maa5yxiwqf1yk9f7gbyq1";
+  };
+
+  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..46a28b1ffd1d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-pubsub/default.nix
@@ -0,0 +1,42 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, google-api-core
+, google-cloud-testutils
+, grpc_google_iam_v1
+, libcst
+, mock
+, proto-plus
+, pytest-asyncio
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-pubsub";
+  version = "2.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1rfdbkxbndi00wx9dx733ihp3hmcsk6k23pcjni0ki7m0c4acl5w";
+  };
+
+  propagatedBuildInputs = [ grpc_google_iam_v1 google-api-core libcst proto-plus ];
+
+  checkInputs = [ google-cloud-testutils mock pytestCheckHook pytest-asyncio ];
+
+  preCheck = ''
+    # prevent google directory from shadowing google imports
+    rm -r google
+    # Tests in pubsub_v1 attempt to contact pubsub.googleapis.com
+    rm -r 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..4dcf7fd3d318
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-redis/default.nix
@@ -0,0 +1,37 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, google-api-core
+, libcst
+, mock
+, proto-plus
+, pytestCheckHook
+, pytest-asyncio
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-redis";
+  version = "2.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1f67mr473vzv0qgjm4hycfnrjgiqrsv47vqrynwjy9yrca2130y7";
+  };
+
+  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..11baf3d73f3d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-resource-manager/default.nix
@@ -0,0 +1,36 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, google-cloud-core
+, google-api-core
+, mock
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-resource-manager";
+  version = "0.30.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1la643vkf6fm2gapz57cm92xzvmhzgpzv3bb6112yz1cizrvnxrm";
+  };
+
+  propagatedBuildInputs = [ google-api-core google-cloud-core ];
+
+  checkInputs = [ mock pytestCheckHook ];
+
+  # prevent google directory from shadowing google imports
+  preCheck = ''
+    rm -r google
+  '';
+
+  pythonImportsCheck = [ "google.cloud.resource_manager" ];
+
+  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..81fa97f152bb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-runtimeconfig/default.nix
@@ -0,0 +1,39 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, google-api-core
+, google-cloud-core
+, mock
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-runtimeconfig";
+  version = "0.32.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1bd8hlp0ssi20ds4gknbxai8mih6xiz8b60ab7p0ngpdqp1kw52p";
+  };
+
+  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..a143a418c222
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-secret-manager/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, google-api-core
+, grpc_google_iam_v1
+, libcst
+, mock
+, proto-plus
+, pytestCheckHook
+, pytest-asyncio
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-secret-manager";
+  version = "2.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "97a46d2318f00c1c6ae1a4ab587e338677c5cc1651d7c6304982d74fa364dd9d";
+  };
+
+  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..242198a21971
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-securitycenter/default.nix
@@ -0,0 +1,39 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, grpc_google_iam_v1
+, google-api-core
+, libcst
+, mock
+, proto-plus
+, pytestCheckHook
+, pytest-asyncio
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-securitycenter";
+  version = "1.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1lgz6qpsfv4b7p5ff4sdpjpaddxpbazdvlcrqr1i0c0qil2lkm2i";
+  };
+
+  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..382476af0ca3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-spanner/default.nix
@@ -0,0 +1,54 @@
+{ lib, stdenv
+, 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.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "060c53bc6f541660a2fe868fd83a695207d4e7b050e04fe103d1e77634b813c7";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace '"proto-plus == 1.11.0"' '"proto-plus"'
+  '';
+
+  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
+    # disable tests which require credentials
+    rm tests/system/test_{system,system_dbapi}.py
+    rm tests/unit/spanner_dbapi/test_{connect,connection,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..3359cfdd743a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-speech/default.nix
@@ -0,0 +1,43 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, google-api-core
+, libcst
+, mock
+, proto-plus
+, pytestCheckHook
+, pytest-asyncio
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-speech";
+  version = "2.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0ch85h5xrb15fcml5v0f30s0niw02k4v8gi7i8a40161yj882hm7";
+  };
+
+  propagatedBuildInputs = [ libcst google-api-core proto-plus ];
+
+  checkInputs = [ mock pytestCheckHook pytest-asyncio ];
+
+  pytestFlagsArray = [
+    # requrire credentials
+    "--ignore=tests/system/gapic/v1/test_system_speech_v1.py"
+    "--ignore=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..cf869d5c8eff
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-storage/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, google-auth
+, google-cloud-iam
+, google-cloud-core
+, google-cloud-kms
+, google-cloud-testutils
+, google-resumable-media
+, mock
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-storage";
+  version = "1.35.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "17kal75wmyjpva7g04cb9yg7qbyrgwfn575z4gqijd4gz2r0sp2m";
+  };
+
+  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"
+    "test_build_api_url"
+  ];
+
+  pytestFlagsArray = [
+    "--ignore=tests/unit/test_bucket.py"
+    "--ignore=tests/system/test_system.py"
+  ];
+
+  # prevent google directory from shadowing google imports
+  preCheck = ''
+    rm -r google
+  '';
+
+  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..e30986af6106
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-tasks/default.nix
@@ -0,0 +1,44 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, google-api-core
+, grpc_google_iam_v1
+, libcst
+, mock
+, proto-plus
+, pytestCheckHook
+, pytest-asyncio
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-tasks";
+  version = "2.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1jsf7y88lvln9r08pmx673ibmgw397qmir5drrcfvlmgqvszp7qx";
+  };
+
+  propagatedBuildInputs = [ google-api-core grpc_google_iam_v1 libcst proto-plus ];
+
+  checkInputs = [ mock pytestCheckHook pytest-asyncio ];
+
+  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..3f6792fa77b7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-testutils/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, google-auth, six }:
+
+buildPythonPackage rec {
+  pname = "google-cloud-testutils";
+  version = "0.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1bn1pz00lxym3vkl6l45b3nydpmfdvmylwggh2lspldrxwx39a0k";
+  };
+
+  propagatedBuildInputs = [ google-auth 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..a7228a42999b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-texttospeech/default.nix
@@ -0,0 +1,43 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, google-api-core
+, libcst
+, mock
+, proto-plus
+, pytest-asyncio
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-texttospeech";
+  version = "2.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "17igfwh34369gkvsbrm46j1ii61i6268wg2g2dl9c65nf9z3kgfb";
+  };
+
+  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..1252c99bf486
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-trace/default.nix
@@ -0,0 +1,44 @@
+{ lib, stdenv
+, 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.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1lvcm4w1l7hiqg64kdscch3f3bq19q9ii49xj4lljn2a4xffxl8v";
+  };
+
+  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..32d402e1cf03
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-translate/default.nix
@@ -0,0 +1,46 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, google-api-core
+, google-cloud-core
+, google-cloud-testutils
+, grpcio
+, libcst
+, mock
+, proto-plus
+, pytest-asyncio
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-translate";
+  version = "3.0.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1s2gvlzfqd2gsrzaz7yl9q8s1k03dlsjahgg95s017vlcn21d0v1";
+  };
+
+  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..43fed1fe27fa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-videointelligence/default.nix
@@ -0,0 +1,45 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, mock
+, google-api-core
+, google-cloud-testutils
+, proto-plus
+, pytestCheckHook
+, pytest-asyncio
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-videointelligence";
+  version = "2.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1yhmizig41ymr2dz0i6ccrwszp0ivyykmq11vqxp82l9ncjima82";
+  };
+
+  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..57a51f96e65e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-vision/default.nix
@@ -0,0 +1,41 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, google-api-core
+, libcst
+, mock
+, proto-plus
+, pytestCheckHook
+, pytest-asyncio
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-vision";
+  version = "2.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0qbwhapmn5ia853c4nfnz1qiksngvr8j0xxjasrykwhxcsd7s1ka";
+  };
+
+  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..20614f5b5d86
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-websecurityscanner/default.nix
@@ -0,0 +1,36 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, google-api-core
+, libcst
+, mock
+, proto-plus
+, pytest-asyncio
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-websecurityscanner";
+  version = "1.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "14sky9bkl00n65ksig3f6psm31pkmkvlcprlk6s9if470j40zrhx";
+  };
+
+  propagatedBuildInputs = [ google-api-core libcst 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..b36635654a9d
--- /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.1.2";
+
+  src = fetchFromGitHub {
+    owner = "googleapis";
+    repo = "python-crc32c";
+    rev = "v${version}";
+    sha256 = "058g69yp7x41mv0d84yp31jv64fpm4r25b86rvvqgc6n74w6jj7k";
+  };
+
+  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..590962590e5f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-i18n-address/default.nix
@@ -0,0 +1,22 @@
+{ buildPythonPackage, fetchPypi, lib, requests, pytestCheckHook, mock }:
+
+buildPythonPackage rec {
+  pname = "google-i18n-address";
+  version = "2.4.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "8454a58f254a29988b8d1ca9ab663fd28a1f392a3d29b844d8824807db6333d7";
+  };
+
+  propagatedBuildInputs = [ requests ];
+
+  checkInputs = [ pytestCheckHook mock ];
+
+  meta = with lib; {
+    description = "Google's i18n address data packaged for Python";
+    homepage = "https://pypi.org/project/google-i18n-address/";
+    maintainers = with maintainers; [ SuperSandro2000 ];
+    license = licenses.bsd3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/google-music-proto/default.nix b/nixpkgs/pkgs/development/python-modules/google-music-proto/default.nix
new file mode 100644
index 000000000000..a883f707bdf1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-music-proto/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, attrs
+, audio-metadata
+, importlib-metadata
+, marshmallow
+, pendulum
+, protobuf
+}:
+
+buildPythonPackage rec {
+  pname = "google-music-proto";
+  version = "2.10.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "91b78c0de4f59b1e5503fd6d49cb3fec029d9199cca0794c87667e643342e987";
+  };
+
+  postPatch = ''
+    sed -i -e "/audio-metadata/c\'audio-metadata'," -e "/marshmallow/c\'marshmallow'," setup.py
+    substituteInPlace setup.py \
+      --replace "'attrs>=18.2,<19.4'" "'attrs'"
+  '';
+
+  propagatedBuildInputs = [
+    attrs
+    audio-metadata
+    marshmallow
+    pendulum
+    protobuf
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  # No tests
+  doCheck = false;
+  pythonImportsCheck = [ "google_music_proto" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/thebigmunch/google-music-proto";
+    description = "Sans-I/O wrapper of Google Music API calls";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jakewaksbaum ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/google-music-utils/default.nix b/nixpkgs/pkgs/development/python-modules/google-music-utils/default.nix
new file mode 100644
index 000000000000..801b4b78a178
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-music-utils/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, audio-metadata
+, multidict
+, poetry
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "google-music-utils";
+  version = "2.5.0";
+
+  # Pypi tarball doesn't contain tests
+  src = fetchFromGitHub {
+    owner = "thebigmunch";
+    repo = "google-music-utils";
+    rev = version;
+    sha256 = "0vwbrgakk23fypjspmscz4gllnb3dksv2njy4j4bm8vyr6fwbi5f";
+  };
+  format = "pyproject";
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'multidict = "^4.0"' 'multidict = ">4.0"'
+  '';
+
+  nativeBuildInputs = [ poetry ];
+
+  propagatedBuildInputs = [ audio-metadata multidict ];
+
+  checkInputs = [ pytestCheckHook ];
+
+  meta = with lib; {
+    homepage = "https://github.com/thebigmunch/google-music-utils";
+    description = "A set of utility functionality for google-music and related projects";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jakewaksbaum ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/google-music/default.nix b/nixpkgs/pkgs/development/python-modules/google-music/default.nix
new file mode 100644
index 000000000000..90978ad2cba7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-music/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, appdirs
+, audio-metadata
+, google-music-proto
+, httpx
+, protobuf
+, requests_oauthlib
+, tenacity
+}:
+
+buildPythonPackage rec {
+  pname = "google-music";
+  version = "3.7.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0fsp491ifsw0i1r98l8xr41m8d00nw9n5bin8k3laqzq1p65d6dp";
+  };
+
+  propagatedBuildInputs = [
+    appdirs
+    audio-metadata
+    google-music-proto
+    httpx
+    protobuf
+    requests_oauthlib
+    tenacity
+  ];
+
+  # No tests
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/thebigmunch/google-music";
+    description = "A Google Music API wrapper";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jakewaksbaum ];
+  };
+}
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-resumable-media/default.nix b/nixpkgs/pkgs/development/python-modules/google-resumable-media/default.nix
new file mode 100644
index 000000000000..531dc1a28603
--- /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 = "1.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0hwxdgsqh6933kp4jkv6hwwdcqs7bgjn9j08ga399njv3s9b367f";
+  };
+
+  propagatedBuildInputs = [ google-auth google-crc32c requests ];
+
+  checkInputs = [ google-auth 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..7e5b786b4fba
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/googleapis_common_protos/default.nix
@@ -0,0 +1,37 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, grpc
+, protobuf
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "googleapis-common-protos";
+  version = "1.52.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0lakcsd35qm5x4visvw6z5f1niasv9a0mjyf2bd98wqi0z41c1sn";
+  };
+
+  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..c971119833e6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/googlemaps/default.nix
@@ -0,0 +1,39 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, requests
+, responses
+, pytestCheckHook
+, pytestcov
+, isPy27
+}:
+
+buildPythonPackage rec {
+  pname = "googlemaps";
+  version = "4.4.2";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "googlemaps";
+    repo = "google-maps-services-python";
+    rev = "v${version}";
+    sha256 = "DYhW1OGce/0gY7Jmwq6iM45PxLyXIYo4Cfg2u6Xuyg4=";
+  };
+
+  propagatedBuildInputs = [ requests ];
+
+  checkInputs = [ pytestCheckHook responses pytestcov ];
+
+  disabledTests = [
+    # touches network
+    "test_elevation_along_path_single"
+    "test_transit_without_time"
+  ];
+
+  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..bf4212edc510
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gorilla/default.nix
@@ -0,0 +1,18 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi}:
+
+buildPythonPackage rec {
+  pname = "gorilla";
+  version = "0.3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "feb2899b923935c25420b94aa8c266ccb5c0315199c685b725303a73195d802c";
+  };
+
+  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/gpapi/default.nix b/nixpkgs/pkgs/development/python-modules/gpapi/default.nix
new file mode 100644
index 000000000000..788473b5ab8f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gpapi/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, pythonOlder
+, requests
+, protobuf
+, pycryptodome
+}:
+
+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";
+  };
+
+  propagatedBuildInputs = [ requests protobuf pycryptodome ];
+
+  meta = with lib; {
+    homepage = "https://github.com/NoMore201/googleplay-api";
+    license = licenses.gpl3;
+    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..0dd68918aed6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gphoto2/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv, fetchPypi, buildPythonPackage
+, pkg-config
+, libgphoto2 }:
+
+buildPythonPackage rec {
+  pname = "gphoto2";
+  version = "2.2.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "48b4c4ab70826d3ddaaf7440564d513c02d78680fa690994b0640d383ffb8a7d";
+  };
+
+  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/gplaycli/default.nix b/nixpkgs/pkgs/development/python-modules/gplaycli/default.nix
new file mode 100644
index 000000000000..ecd52ad848c9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gplaycli/default.nix
@@ -0,0 +1,26 @@
+{ buildPythonPackage, lib, stdenv, libffi, isPy3k, pyasn1, clint, ndg-httpsclient
+, protobuf, requests, args, gpapi, pyaxmlparser, fetchFromGitHub
+}:
+
+buildPythonPackage rec {
+  pname = "gplaycli";
+  version = "3.26";
+
+  src = fetchFromGitHub {
+    owner = "matlink";
+    repo = "gplaycli";
+    rev = version;
+    sha256 = "188237d40q35dp5xs7hg4ybhvsyxi0bsqx5dk4ws9007n596in5f";
+  };
+
+  disabled = !isPy3k;
+
+  propagatedBuildInputs = [ libffi pyasn1 clint ndg-httpsclient protobuf requests args gpapi pyaxmlparser ];
+
+  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..28609919098f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gprof2dot/default.nix
@@ -0,0 +1,22 @@
+{ lib, fetchFromGitHub, buildPythonApplication, python, graphviz }:
+
+buildPythonApplication {
+  name = "gprof2dot-2019-11-30";
+
+  src = fetchFromGitHub {
+    owner = "jrfonseca";
+    repo = "gprof2dot";
+    rev = "2019.11.30";
+    sha256 = "1nw4cfwimd0djarw4wc756q095xir78js8flmycg6g7sl3l6p27s";
+  };
+
+  checkInputs = [ graphviz ];
+  checkPhase = "${python.interpreter} tests/test.py";
+
+  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..2c4dfcd81395
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gpsoauth/default.nix
@@ -0,0 +1,36 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, cffi
+, cryptography
+, enum34
+, idna
+, ipaddress
+, ndg-httpsclient
+, pyopenssl
+, pyasn1
+, pycparser
+, pycryptodomex
+, requests
+, six
+}:
+
+buildPythonPackage rec {
+  version = "0.4.1";
+  pname = "gpsoauth";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1c3f45824d45ac3d06b9d9a0c0eccafe1052505d31ac9a698aef8b00fb0dfc37";
+  };
+
+  propagatedBuildInputs = [ cffi cryptography enum34 idna ipaddress ndg-httpsclient pyopenssl pyasn1 pycparser pycryptodomex requests six ];
+
+  meta = with lib; {
+    description = "A python client 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/gpxpy/default.nix b/nixpkgs/pkgs/development/python-modules/gpxpy/default.nix
new file mode 100644
index 000000000000..4cd03103d850
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gpxpy/default.nix
@@ -0,0 +1,28 @@
+{ lib, fetchFromGitHub, buildPythonPackage, python, lxml, isPy3k }:
+
+buildPythonPackage rec {
+  pname = "gpxpy";
+  version = "1.4.2";
+  disabled = !isPy3k;
+
+  src = fetchFromGitHub {
+    owner = "tkrajina";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1r5gb660nrkrdbw5m5h1n5k10npcfv9bxqv92z55ds8r7rw2saz6";
+  };
+
+  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..9c444f465f30
--- /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.9.9";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "04faf0c24eacc4dea60727c50a48a07ddf9b5751a3b73c382105e2a31657c7ed";
+  };
+
+  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..22e6743582c2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gpyopt/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub, setuptools
+, numpy, scipy, gpy, emcee, nose }:
+
+buildPythonPackage rec {
+  pname = "GPyOpt";
+  version = "unstable-2019-09-25";
+
+  src = fetchFromGitHub {
+    repo   = pname;
+    owner  = "SheffieldML";
+    rev    = "249b8ff29c52c12ed867f145a627d529372022d8";
+    sha256 = "1ywaw1kpdr7dv4s4cr7afmci86sw7w61178gs45b0lq08652zdlb";
+  };
+
+  doCheck = false;  # requires several packages not available in Nix
+
+  checkInputs = [ nose ];
+
+  checkPhase = "nosetests -v GPyOpt/testing";
+
+  propagatedBuildInputs = [ setuptools numpy scipy gpy emcee ];
+
+  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/gradient_sdk/default.nix b/nixpkgs/pkgs/development/python-modules/gradient_sdk/default.nix
new file mode 100644
index 000000000000..adaafd8eadbe
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gradient_sdk/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv, fetchPypi, buildPythonPackage
+, hyperopt
+}:
+
+buildPythonPackage rec {
+  pname = "gradient_sdk";
+  version = "0.0.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "Q9oeYjjgJf2lhxW1ypsweQAPpMglmW9PxgzMsgTqJkY=";
+  };
+
+  propagatedBuildInputs = [ hyperopt ];
+
+  pythonImportsCheck = [ "gradient_sdk" ];
+
+  meta = with lib; {
+    description = "Gradient ML SDK";
+    homepage    = "https://github.com/Paperspace/gradient-sdk";
+    license     = licenses.mit;
+    platforms   = platforms.unix;
+    maintainers = with maintainers; [ freezeboy ];
+  };
+}
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..607737d99ae0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gradient_statsd/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv, fetchPypi, buildPythonPackage
+, boto3, requests, datadog, configparser, python
+}:
+
+buildPythonPackage rec {
+  pname = "gradient_statsd";
+  version = "1.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "iWlNX43ZtvU73wz4+8DgDulQNOnssJGxTBkvAaLj530=";
+  };
+
+  propagatedBuildInputs = [ requests datadog ]
+    ++ 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..c6fcca9434d2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/grammalecte/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchurl
+, bottle
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "grammalecte";
+  version = "0.6.5";
+
+  src = fetchurl {
+    url = "http://www.dicollecte.org/grammalecte/zip/Grammalecte-fr-v${version}.zip";
+    sha256 = "11byjs3ggdhia5f4vyfqfvbbczsfqimll98h98g7hlsrm7vrifb0";
+  };
+
+  propagatedBuildInputs = [ bottle ];
+
+  preBuild = "cd ..";
+
+  disabled = !isPy3k;
+
+  meta = {
+    description = "Grammalecte is an open source grammar checker for the French language";
+    homepage = "https://grammalecte.net";
+    license = with lib.licenses; [ gpl3 ];
+    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..2d2658e00f84
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/grandalf/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pyparsing
+, future
+, pytest
+, pytestrunner
+}:
+
+buildPythonPackage rec {
+  pname = "grandalf";
+  version = "0.6";
+
+  # fetch from github to acquire tests
+  src = fetchFromGitHub {
+    owner = "bdcht";
+    repo = "grandalf";
+    rev = "v${version}";
+    sha256 = "1f1l288sqna0bca7dwwvyw7wzg9b2613g6vc0g0vfngm7k75b2jg";
+  };
+
+  propagatedBuildInputs = [
+    pyparsing
+    future
+  ];
+
+  checkInputs = [ pytest pytestrunner ];
+
+  patches = [ ./no-setup-requires-pytestrunner.patch ];
+
+  checkPhase = ''
+    pytest tests
+  '';
+
+  meta = with lib; {
+    description = "A python package made for experimentations with graphs and drawing algorithms";
+    homepage = "https://github.com/bdcht/grandalf";
+    license = licenses.gpl2;
+    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/2.x.x.nix b/nixpkgs/pkgs/development/python-modules/graph-tool/2.x.x.nix
new file mode 100644
index 000000000000..50d5f0f966b6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/graph-tool/2.x.x.nix
@@ -0,0 +1,58 @@
+{ fetchurl, python, cairomm, sparsehash, pycairo, autoreconfHook
+, pkg-config, boost, expat, scipy, cgal, gmp, mpfr
+, gobject-introspection, pygobject3, gtk3, matplotlib, ncurses
+, buildPythonPackage
+, fetchpatch
+, pythonAtLeast
+, lib
+}:
+
+buildPythonPackage rec {
+  pname = "graph-tool";
+  format = "other";
+  version = "2.32";
+
+  src = fetchurl {
+    url = "https://downloads.skewed.de/graph-tool/graph-tool-${version}.tar.bz2";
+    sha256 = "0jir6fhi09lf8xf56dcsdk2knx32vq8wrzh0d0zdp22n7baavq70";
+  };
+
+  configureFlags = [
+    "--with-python-module-path=$(out)/${python.sitePackages}"
+    "--with-boost-libdir=${boost}/lib"
+    "--with-expat=${expat}"
+    "--with-cgal=${cgal}"
+    "--enable-openmp"
+  ];
+
+  nativeBuildInputs = [ autoreconfHook pkg-config ];
+  buildInputs = [ ncurses ];
+
+  propagatedBuildInputs = [
+    boost
+    cgal
+    expat
+    gmp
+    mpfr
+    python
+    scipy
+    # optional
+    sparsehash
+    # drawing
+    cairomm
+    gobject-introspection
+    gtk3
+    pycairo
+    matplotlib
+    pygobject3
+  ];
+
+  enableParallelBuilding = false;
+
+  meta = with lib; {
+    description = "Python module for manipulation and statistical analysis of graphs";
+    homepage    = "https://graph-tool.skewed.de/";
+    license     = licenses.gpl3;
+    maintainers = [ maintainers.joelmo ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/graph_nets/default.nix b/nixpkgs/pkgs/development/python-modules/graph_nets/default.nix
new file mode 100644
index 000000000000..4f7b8c52e9ee
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/graph_nets/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, tensorflow
+, absl-py
+, dm-sonnet
+, networkx
+, numpy
+, setuptools
+, six
+, future
+}:
+
+buildPythonPackage rec {
+  pname = "graph_nets";
+  version = "1.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "278a040674bef295aaf8bb5b0d1b3f207144dc68f0bcfe3f14912b9b85eb0927";
+  };
+
+  postPatch = ''
+    # https://github.com/deepmind/graph_nets/issues/63
+    sed -i 's/dm-sonnet==1.23/dm-sonnet/' setup.py
+  '';
+
+  propagatedBuildInputs = [
+    tensorflow
+    absl-py
+    dm-sonnet
+    networkx
+    numpy
+    setuptools
+    six
+    future
+  ];
+
+  meta = with lib; {
+    description = "Build Graph Nets in Tensorflow";
+    homepage = "https://github.com/deepmind/graph_nets";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ timokau ];
+  };
+}
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..301ffca03477
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/graphene/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, aniso8601
+, iso8601
+, graphql-core
+, graphql-relay
+, pytestCheckHook
+, pytest-asyncio
+, pytest-benchmark
+, pytest-mock
+, pytz
+, snapshottest
+}:
+
+buildPythonPackage rec {
+  pname = "graphene";
+  version = "3.0.0b7";
+
+  src = fetchFromGitHub {
+    owner = "graphql-python";
+    repo = "graphene";
+    rev = "v${version}";
+    sha256 = "sha256-bVCCLPnV5F8PqLMg3GwcpwpGldrxsU+WryL6gj6y338=";
+  };
+
+  propagatedBuildInputs = [
+    aniso8601
+    graphql-core
+    graphql-relay
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    pytest-asyncio
+    pytest-benchmark
+    pytest-mock
+    pytz
+    snapshottest
+  ];
+
+  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-api/default.nix b/nixpkgs/pkgs/development/python-modules/graphite-api/default.nix
new file mode 100644
index 000000000000..51300847bbbc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/graphite-api/default.nix
@@ -0,0 +1,45 @@
+{ buildPythonPackage, fetchFromGitHub, lib, flask, flask-caching, cairocffi, pyparsing, pytz, pyyaml
+, raven, six, structlog, tzlocal, nose, mock, cairo, isPyPy
+}:
+
+buildPythonPackage rec {
+  pname = "graphite-api";
+  version = "1.1.3";
+
+  disabled = isPyPy;
+
+  src = fetchFromGitHub {
+    owner = "brutasse";
+    repo = "graphite-api";
+    rev = version;
+    sha256 = "0sz3kav2024ms2z4q03pigcf080gsr5v774z9bp3zw29k2p47ass";
+  };
+
+  # https://github.com/brutasse/graphite-api/pull/239 rebased onto 1.1.3
+  patches = [ ./flask-caching-rebased.patch ];
+
+  checkPhase = "nosetests";
+
+  propagatedBuildInputs = [
+    flask
+    flask-caching
+    cairocffi
+    pyparsing
+    pytz
+    pyyaml
+    raven
+    six
+    structlog
+    tzlocal
+  ];
+
+  checkInputs = [ nose mock ];
+
+  LD_LIBRARY_PATH = "${cairo.out}/lib";
+
+  meta = with lib; {
+    description = "Graphite-web, without the interface. Just the rendering HTTP API";
+    homepage = "https://github.com/brutasse/graphite-api";
+    license = licenses.asl20;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/graphite-api/flask-caching-rebased.patch b/nixpkgs/pkgs/development/python-modules/graphite-api/flask-caching-rebased.patch
new file mode 100644
index 000000000000..2d4a2f29bc43
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/graphite-api/flask-caching-rebased.patch
@@ -0,0 +1,132 @@
+diff --git a/graphite_api/config.py b/graphite_api/config.py
+index 5e1e382..dc033a8 100644
+--- a/graphite_api/config.py
++++ b/graphite_api/config.py
+@@ -112,11 +112,11 @@ def configure(app):
+     app.cache = None
+     if 'cache' in config:
+         try:
+-            from flask.ext.cache import Cache
++            from flask_caching import Cache
+         except ImportError:
+             warnings.warn("'cache' is provided in the configuration but "
+-                          "Flask-Cache is not installed. Please `pip install "
+-                          "Flask-Cache`.")
++                          "flask-caching is not installed. Please `pip "
++                          "install flask-caching`.")
+         else:
+             cache_conf = {'CACHE_DEFAULT_TIMEOUT': 60,
+                           'CACHE_KEY_PREFIX': 'graphite-api:'}
+diff --git a/requirements.txt b/requirements.txt
+index c68b446..7826b0c 100644
+--- a/requirements.txt
++++ b/requirements.txt
+@@ -1,5 +1,5 @@
+ Flask
+-Flask-Cache
++Flask-Caching
+ cairocffi
+ pyparsing>=1.5.7
+ pytz
+diff --git a/setup.py b/setup.py
+index 0337cbe..df07989 100644
+--- a/setup.py
++++ b/setup.py
+@@ -38,7 +38,7 @@ setup(
+     extras_require={
+         'sentry': ['raven[flask]'],
+         'cyanite': ['cyanite'],
+-        'cache': ['Flask-Cache'],
++        'cache': ['Flask-Caching'],
+         'statsd': ['statsd'],
+     },
+     zip_safe=False,
+diff --git a/tests/test_render.py b/tests/test_render.py
+index be5609d..a0e7190 100644
+--- a/tests/test_render.py
++++ b/tests/test_render.py
+@@ -8,7 +8,7 @@ from graphite_api._vendor import whisper
+ from . import TestCase, WHISPER_DIR
+ 
+ try:
+-    from flask.ext.cache import Cache
++    from flask_caching import Cache
+ except ImportError:
+     Cache = None
+ 
+diff --git a/tox.ini b/tox.ini
+index 85a0abb..c820393 100644
+--- a/tox.ini
++++ b/tox.ini
+@@ -47,7 +47,7 @@ basepython = python2.7
+ deps =
+ 	{[testenv]deps}
+ 	Flask
+-	Flask-Cache
++	Flask-Caching
+ 	pyparsing
+ 	mock
+ 
+@@ -56,7 +56,7 @@ basepython = python3.3
+ deps =
+ 	{[testenv]deps}
+ 	Flask
+-	Flask-Cache
++	Flask-Caching
+ 	pyparsing
+ 
+ [testenv:py34]
+@@ -66,7 +66,7 @@ commands =
+ deps =
+ 	{[testenv]deps}
+ 	Flask
+-	Flask-Cache
++	Flask-Caching
+ 	pyparsing
+ 
+ [testenv:py35]
+@@ -76,7 +76,7 @@ commands =
+ deps =
+ 	{[testenv]deps}
+ 	Flask
+-	Flask-Cache
++	Flask-Caching
+ 	pyparsing
+ 
+ [testenv:pyparsing1]
+@@ -84,7 +84,7 @@ basepython = python2.7
+ deps =
+ 	{[testenv]deps}
+ 	Flask
+-	Flask-Cache
++	Flask-Caching
+ 	pyparsing==1.5.7
+ 	mock
+ 
+@@ -93,7 +93,7 @@ basepython = pypy
+ deps =
+ 	{[testenv]deps}
+ 	Flask
+-	Flask-Cache
++	Flask-Caching
+ 	pyparsing
+ 	mock
+ 
+@@ -102,7 +102,7 @@ basepython = python2.7
+ deps =
+ 	{[testenv]deps}
+ 	Flask<0.9
+-	Flask-Cache
++	Flask-Caching
+ 	pyparsing
+ 	mock
+ 
+@@ -111,7 +111,7 @@ basepython = python2.7
+ deps =
+ 	{[testenv]deps}
+ 	Flask<0.10
+-	Flask-Cache
++	Flask-Caching
+ 	pyparsing
+ 	mock
+ 
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..0bced13cd112
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/graphite-web/default.nix
@@ -0,0 +1,37 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, isPy3k
+, django, django_tagging, whisper, pycairo, cairocffi, ldap, memcached, pytz, urllib3, scandir
+}:
+buildPythonPackage rec {
+  pname = "graphite-web";
+  version = "1.1.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b3cb3b9affe1b9e3777aab046416b3d545390ceea4d35d55c753b1e4732eaad0";
+  };
+
+  patches = [
+    ./update-django-tagging.patch
+  ];
+
+  propagatedBuildInputs = [
+    django django_tagging whisper pycairo cairocffi
+    ldap memcached pytz urllib3 scandir
+  ];
+
+  # 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')"
+  '';
+
+  meta = with lib; {
+    homepage = "http://graphiteapp.org/";
+    description = "Enterprise scalable realtime graphing";
+    maintainers = with maintainers; [ offline basvandijk ];
+    license = licenses.asl20;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/graphite-web/update-django-tagging.patch b/nixpkgs/pkgs/development/python-modules/graphite-web/update-django-tagging.patch
new file mode 100644
index 000000000000..9774f7e70a7f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/graphite-web/update-django-tagging.patch
@@ -0,0 +1,13 @@
+diff --git a/setup.py b/setup.py
+index a1a21f1..f0d1051 100644
+--- a/setup.py
++++ b/setup.py
+@@ -117,7 +117,7 @@ try:
+         ['templates/*', 'local_settings.py.example']},
+       scripts=glob('bin/*'),
+       data_files=list(webapp_content.items()) + storage_dirs + conf_files + examples,
+-      install_requires=['Django>=1.8,<3.1', 'django-tagging==0.4.3', 'pytz',
++      install_requires=['Django>=1.8,<3.1', 'django-tagging==0.5.0', 'pytz',
+                         'pyparsing', 'cairocffi', 'urllib3', 'scandir', 'six'],
+       classifiers=[
+           'Intended Audience :: Developers',
diff --git a/nixpkgs/pkgs/development/python-modules/graphite_beacon/default.nix b/nixpkgs/pkgs/development/python-modules/graphite_beacon/default.nix
new file mode 100644
index 000000000000..06b66ccbc145
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/graphite_beacon/default.nix
@@ -0,0 +1,33 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi
+, tornado_5, pyyaml, funcparserlib
+, nixosTests
+}:
+
+buildPythonPackage rec {
+  pname = "graphite_beacon";
+  version = "0.27.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "03bp4wyfn3xhcqyvs5hnk1n87m4smsmm1p7qp459m7j8hwpbq2ks";
+  };
+
+  propagatedBuildInputs = [ tornado_5 pyyaml funcparserlib ];
+
+  postPatch = ''
+    substituteInPlace requirements.txt --replace "==" ">="
+  '';
+
+  pythonImportsCheck = [ "graphite_beacon" ];
+
+  passthru.tests = {
+    nixos = nixosTests.graphite;
+  };
+
+  meta = with lib; {
+    description = "A simple alerting application for Graphite metrics";
+    homepage = "https://github.com/klen/graphite-beacon";
+    maintainers = [ maintainers.offline ];
+    license = licenses.mit;
+  };
+}
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..9e48f66c13d1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/graphql-core/default.nix
@@ -0,0 +1,54 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, lib
+
+, coveralls
+, promise
+, pytest
+, pytest-benchmark
+, pytest-mock
+, rx
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "graphql-core";
+  version = "3.1.2";
+
+  src = fetchFromGitHub {
+    owner = "graphql-python";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0kvbj9dwpx8mjfj86kqx54dbz9k72ki147ssyj0ca2syvb8jm3wb";
+  };
+
+  propagatedBuildInputs = [
+    promise
+    rx
+    six
+  ];
+
+  checkInputs = [
+    coveralls
+    pytest
+    pytest-benchmark
+    pytest-mock
+  ];
+
+  checkPhase = "pytest";
+
+  configurePhase = ''
+    substituteInPlace setup.py \
+      --replace 'pytest-mock==1.2' 'pytest-mock==1.13.0' \
+      --replace 'pytest-benchmark==3.0.0' 'pytest-benchmark==3.2.2'
+  '';
+
+  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..fa6a9ec60a73
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/graphql-relay/default.nix
@@ -0,0 +1,24 @@
+{ lib, buildPythonPackage, fetchPypi, graphql-core, pytestCheckHook }:
+
+buildPythonPackage rec {
+  pname = "graphql-relay";
+  version = "3.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0mjmpf4abrxfyln0ykxq4xa6lp7xwgqr8631qp011hv0nfl6jgxd";
+  };
+
+  propagatedBuildInputs = [ graphql-core ];
+
+  checkInputs = [ 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/graphviz/default.nix b/nixpkgs/pkgs/development/python-modules/graphviz/default.nix
new file mode 100644
index 000000000000..1a0e6d903a47
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/graphviz/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, substituteAll
+, graphviz
+, makeFontsConf
+, freefont_ttf
+, mock
+, pytestCheckHook
+, pytest-mock
+, pytestcov
+}:
+
+buildPythonPackage rec {
+  pname = "graphviz";
+  version = "0.16";
+
+  # patch does not apply to PyPI tarball due to different line endings
+  src = fetchFromGitHub {
+    owner = "xflr6";
+    repo = "graphviz";
+    rev = version;
+    sha256 = "147vi60mi57z623lhllwwzczzicv2iwj1yrmllj5xx5788i73j6g";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./hardcode-graphviz-path.patch;
+      inherit graphviz;
+    })
+  ];
+
+  # Fontconfig error: Cannot load default config file
+  FONTCONFIG_FILE = makeFontsConf {
+    fontDirectories = [ freefont_ttf ];
+  };
+
+  checkInputs = [ mock pytestCheckHook pytest-mock pytestcov ];
+
+  meta = with lib; {
+    description = "Simple Python interface for Graphviz";
+    homepage = "https://github.com/xflr6/graphviz";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/graphviz/hardcode-graphviz-path.patch b/nixpkgs/pkgs/development/python-modules/graphviz/hardcode-graphviz-path.patch
new file mode 100644
index 000000000000..fa2f634bbc29
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/graphviz/hardcode-graphviz-path.patch
@@ -0,0 +1,98 @@
+diff --git a/graphviz/backend.py b/graphviz/backend.py
+index d2c4b97..f7175cd 100644
+--- a/graphviz/backend.py
++++ b/graphviz/backend.py
+@@ -122,7 +122,7 @@ def command(engine, format_, filepath=None, renderer=None, formatter=None):
+         raise ValueError('unknown formatter: %r' % formatter)
+ 
+     output_format = [f for f in (format_, renderer, formatter) if f is not None]
+-    cmd = ['dot', '-K%s' % engine, '-T%s' % ':'.join(output_format)]
++    cmd = ['@graphviz@/bin/dot', '-K%s' % engine, '-T%s' % ':'.join(output_format)]
+ 
+     if filepath is None:
+         rendered = None
+@@ -275,7 +275,7 @@ def unflatten(source,
+     if fanout and stagger is None:
+         raise RequiredArgumentError('fanout given without stagger')
+ 
+-    cmd = ['unflatten']
++    cmd = ['@graphviz@/bin/unflatten']
+     if stagger is not None:
+         cmd += ['-l', str(stagger)]
+     if fanout:
+@@ -304,7 +304,7 @@ def version():
+         Graphviz Release version entry format
+         https://gitlab.com/graphviz/graphviz/-/blob/f94e91ba819cef51a4b9dcb2d76153684d06a913/gen_version.py#L17-20
+     """
+-    cmd = ['dot', '-V']
++    cmd = ['@graphviz@/bin/dot', '-V']
+     out, _ = run(cmd, check=True, encoding='ascii',
+                  stdout=subprocess.PIPE,
+                  stderr=subprocess.STDOUT)
+diff --git a/tests/test_backend.py b/tests/test_backend.py
+index d10ef1a..e4aba58 100644
+--- a/tests/test_backend.py
++++ b/tests/test_backend.py
+@@ -52,7 +52,7 @@ def test_run_encoding_mocked(mocker, Popen, input=u'sp\xe4m', encoding='utf-8'):
+         m.decode.assert_called_once_with(encoding)
+ 
+ 
+-@pytest.exe
++@pytest.mark.skip(reason='empty $PATH has no effect')
+ @pytest.mark.usefixtures('empty_path')
+ @pytest.mark.parametrize('func, args', [
+     (render, ['dot', 'pdf', 'nonfilepath']),
+@@ -146,7 +146,7 @@ def test_render_mocked(capsys, mocker, Popen, quiet):  # noqa: N803
+ 
+     assert render('dot', 'pdf', 'nonfilepath', quiet=quiet) == 'nonfilepath.pdf'
+ 
+-    Popen.assert_called_once_with(['dot', '-Kdot', '-Tpdf', '-O', 'nonfilepath'],
++    Popen.assert_called_once_with(['@graphviz@/bin/dot', '-Kdot', '-Tpdf', '-O', 'nonfilepath'],
+                                   stdout=subprocess.PIPE,
+                                   stderr=subprocess.PIPE,
+                                   cwd=None, startupinfo=mocker.ANY)
+@@ -208,7 +208,7 @@ def test_pipe_pipe_invalid_data_mocked(mocker, py2, Popen, quiet):  # noqa: N803
+     assert e.value.stdout is mocker.sentinel.out
+     e.value.stdout = mocker.sentinel.new_stdout
+     assert e.value.stdout is mocker.sentinel.new_stdout
+-    Popen.assert_called_once_with(['dot', '-Kdot', '-Tpng'],
++    Popen.assert_called_once_with(['@graphviz@/bin/dot', '-Kdot', '-Tpng'],
+                                   stdin=subprocess.PIPE,
+                                   stdout=subprocess.PIPE,
+                                   stderr=subprocess.PIPE,
+@@ -231,7 +231,7 @@ def test_pipe_mocked(capsys, mocker, Popen, quiet):  # noqa: N803
+ 
+     assert pipe('dot', 'png', b'nongraph', quiet=quiet) is mocker.sentinel.out
+ 
+-    Popen.assert_called_once_with(['dot', '-Kdot', '-Tpng'],
++    Popen.assert_called_once_with(['@graphviz@/bin/dot', '-Kdot', '-Tpng'],
+                                   stdin=subprocess.PIPE,
+                                   stdout=subprocess.PIPE,
+                                   stderr=subprocess.PIPE,
+@@ -259,7 +259,7 @@ def test_unflatten_mocked(capsys, mocker, Popen):
+     proc.communicate.return_value = (b'nonresult', b'')
+ 
+     assert unflatten('nonsource') == 'nonresult'
+-    Popen.assert_called_once_with(['unflatten'],
++    Popen.assert_called_once_with(['@graphviz@/bin/unflatten'],
+                                   stdin=subprocess.PIPE,
+                                   stdout=subprocess.PIPE,
+                                   stderr=subprocess.PIPE,
+@@ -290,7 +290,7 @@ def test_version_parsefail_mocked(mocker, Popen):  # noqa: N803
+     with pytest.raises(RuntimeError, match=r'nonversioninfo'):
+         version()
+ 
+-    Popen.assert_called_once_with(['dot', '-V'],
++    Popen.assert_called_once_with(['@graphviz@/bin/dot', '-V'],
+                                   stdout=subprocess.PIPE,
+                                   stderr=subprocess.STDOUT,
+                                   startupinfo=mocker.ANY)
+@@ -312,7 +312,7 @@ def test_version_mocked(mocker, Popen, stdout, expected):  # noqa: N803
+ 
+     assert version() == expected
+ 
+-    Popen.assert_called_once_with(['dot', '-V'],
++    Popen.assert_called_once_with(['@graphviz@/bin/dot', '-V'],
+                                   stdout=subprocess.PIPE,
+                                   stderr=subprocess.STDOUT,
+                                   startupinfo=mocker.ANY)
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..7b2dd7e3fedd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/grappelli_safe/default.nix
@@ -0,0 +1,34 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  version = "0.5.2";
+  pname = "grappelli_safe";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "35b7ccaf9acc54684c73aeefbeaddc63b8a16143bd981bd5b3ebef253def07df";
+  };
+
+  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..4fd6ccf19c57
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/graspologic/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, isPy27
+, fetchFromGitHub
+, pytestCheckHook
+, pytestcov
+, hyppo
+, matplotlib
+, networkx
+, numpy
+, scikitlearn
+, scipy
+, seaborn
+}:
+
+buildPythonPackage rec {
+  pname = "graspologic";
+  version = "0.3";
+
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "microsoft";
+    repo = "graspologic";
+    rev = "v${version}";
+    sha256 = "0lab76qiryxvwl6zrcikhnxil1xywl0wkkm2vzi4v9mdzpa7w29r";
+  };
+
+  propagatedBuildInputs = [
+    hyppo
+    matplotlib
+    networkx
+    numpy
+    scikitlearn
+    scipy
+    seaborn
+  ];
+
+  checkInputs = [ pytestCheckHook pytestcov ];
+  pytestFlagsArray = [ "tests" "--ignore=docs" ];
+  disabledTests = [ "gridplot_outputs" ];
+
+  meta = with lib; {
+    homepage = "https://graspy.neurodata.io";
+    description = "A package for graph statistical algorithms";
+    license = licenses.asl20;  # changing to `licenses.mit` in next release
+    maintainers = with maintainers; [ bcdarwin ];
+  };
+}
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..b4048c922dae
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/greatfet/default.nix
@@ -0,0 +1,34 @@
+{ lib, fetchFromGitHub, buildPythonPackage, isPy3k, future, pyusb, ipython, pygreat }:
+
+buildPythonPackage {
+  pname = "GreatFET";
+  version = "2019.5.1.dev0";
+
+  src = fetchFromGitHub {
+    owner = "greatscottgadgets";
+    repo = "greatfet";
+    rev = "a927f21d59ccface00635146103a807c1d2b0ad8";
+    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/green/default.nix b/nixpkgs/pkgs/development/python-modules/green/default.nix
new file mode 100644
index 000000000000..8123f188d6e1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/green/default.nix
@@ -0,0 +1,34 @@
+{ lib, buildPythonPackage, fetchPypi, isPy3k
+, colorama
+, coverage
+, termstyle
+, lxml
+, unidecode
+}:
+
+buildPythonPackage rec {
+  pname = "green";
+  version = "3.2.5";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "11d595d98afc3363d79e237141ad862c0574a62f92325d9e541ed1b1a54a72ae";
+  };
+
+  propagatedBuildInputs = [
+    colorama coverage termstyle unidecode lxml
+  ];
+
+  # let green run it's own test suite
+  checkPhase = ''
+    $out/bin/green green
+  '';
+
+  meta = with lib; {
+    description = "Python test runner";
+    homepage = "https://github.com/CleanCut/green";
+    license = licenses.mit;
+  };
+}
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..9d00e93739c3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/greenlet/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, six
+, isPyPy
+}:
+
+
+buildPythonPackage rec {
+  pname = "greenlet";
+  version = "0.4.17";
+  disabled = isPyPy;  # builtin for pypy
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0swdhrcq13bdszv3yz5645gi4ijbzmmhxpb6whcfg3d7d5f87n21";
+  };
+
+  propagatedBuildInputs = [ six ];
+
+  # see https://github.com/python-greenlet/greenlet/issues/85
+  preCheck = ''
+    rm tests/test_leaks.py
+  '';
+
+  meta = {
+    homepage = "https://pypi.python.org/pypi/greenlet";
+    description = "Module for lightweight in-process concurrent programming";
+    license = lib.licenses.lgpl2;
+  };
+}
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..5ce5df8cdea2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/grequests/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv
+, 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/grip/default.nix b/nixpkgs/pkgs/development/python-modules/grip/default.nix
new file mode 100644
index 000000000000..019cd798d640
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/grip/default.nix
@@ -0,0 +1,51 @@
+{ lib, stdenv
+, fetchFromGitHub
+, fetchpatch
+# Python bits:
+, buildPythonPackage
+, pytest
+, responses
+, docopt
+, flask
+, markdown
+, path-and-address
+, pygments
+, requests
+, tabulate
+}:
+
+buildPythonPackage rec {
+  pname = "grip";
+  version = "4.5.2";
+
+  src = fetchFromGitHub {
+    owner = "joeyespo";
+    repo = "grip";
+    rev = "v${version}";
+    sha256 = "0hphplnyi903jx7ghfxplg1qlj2kpcav1frr2js7p45pbh5ib9rm";
+  };
+
+  patches = [
+    # Render "front matter", used in our RFC template and elsewhere
+    (fetchpatch {
+      url = "https://github.com/joeyespo/grip/pull/249.patch";
+      sha256 = "07za5iymfv647dfrvi6hhj54a96hgjyarys51zbi08c51shqyzpg";
+    })
+  ];
+
+  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/grpc_google_iam_v1/default.nix b/nixpkgs/pkgs/development/python-modules/grpc_google_iam_v1/default.nix
new file mode 100644
index 000000000000..dd9527006dad
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/grpc_google_iam_v1/default.nix
@@ -0,0 +1,31 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, grpcio
+, googleapis_common_protos
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "grpc-google-iam-v1";
+  version = "0.12.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0bfb5b56f648f457021a91c0df0db4934b6e0c300bd0f2de2333383fe958aa72";
+  };
+
+  propagatedBuildInputs = [ grpcio googleapis_common_protos ];
+
+  # non-standard test format, and python3 will load local google folder first
+  # but tests cannot be ran if google folder is removed or moved
+  doCheck = false;
+  checkInputs = [ pytest ];
+
+  meta = with lib; {
+    description = "GRPC library for the google-iam-v1 service";
+    homepage = "https://github.com/googleapis/googleapis";
+    license = licenses.asl20;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..1b631c0973ed
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/grpcio-gcp/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv
+, 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-tools/default.nix b/nixpkgs/pkgs/development/python-modules/grpcio-tools/default.nix
new file mode 100644
index 000000000000..629c51071abd
--- /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.34.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b411f36748f4ead33411544d785e37825598bbb8abbe79eca422e395be5a3d08";
+  };
+
+  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..1b1ffb975fb6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/grpcio/default.nix
@@ -0,0 +1,48 @@
+{ lib, stdenv
+, buildPythonPackage
+, darwin
+, grpc
+, six
+, protobuf
+, enum34
+, futures
+, isPy27
+, pkg-config
+, cython
+, c-ares
+, openssl
+, zlib
+}:
+
+buildPythonPackage rec {
+  inherit (grpc) src version;
+  pname = "grpcio";
+
+  outputs = [ "out" "dev" ];
+
+  nativeBuildInputs = [ cython pkg-config ]
+    ++ lib.optional stdenv.isDarwin darwin.cctools;
+
+  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/gsd/1.7.nix b/nixpkgs/pkgs/development/python-modules/gsd/1.7.nix
new file mode 100644
index 000000000000..0512a4906a27
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gsd/1.7.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, numpy
+}:
+
+buildPythonPackage rec {
+  version = "1.7.0";
+  pname = "gsd";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0fpk69wachyydpk9cbs901m7hkwrrvq24ykxsrz62km9ql8lr2vp";
+  };
+
+  propagatedBuildInputs = [ numpy ];
+
+  # tests not packaged with gsd
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://bitbucket.org/glotzer/gsd";
+    description = "General simulation data file format";
+    license = licenses.bsd2;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..8eefb1f4318b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gsd/default.nix
@@ -0,0 +1,31 @@
+{ lib, buildPythonPackage, fetchFromGitHub, isPy27
+, numpy
+, pytest
+}:
+
+buildPythonPackage rec {
+  version = "1.9.3";
+  pname = "gsd";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "glotzerlab";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "07hw29r2inyp493dia4fx3ysfr1wxi2jb3n9cmwdi0l54s2ahqvf";
+  };
+
+  propagatedBuildInputs = [ numpy ];
+
+  checkInputs = [ pytest ];
+  checkPhase = ''
+    pytest
+  '';
+
+  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..7cf2a8c8df11
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gspread/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, requests
+, google-auth
+, google-auth-oauthlib
+}:
+
+buildPythonPackage rec {
+  version = "3.6.0";
+  pname = "gspread";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "e04f1a6267b3929fc1600424c5ec83906d439672cafdd61a9d5b916a139f841c";
+  };
+
+  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..e5149f6025ad
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gssapi/default.nix
@@ -0,0 +1,79 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, six
+, decorator
+, nose
+, krb5Full
+, darwin
+, parameterized
+, shouldbe
+, cython
+, python
+, k5test
+}:
+
+buildPythonPackage rec {
+  pname = "gssapi";
+  version = "1.6.10";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "pythongssapi";
+    repo = "python-${pname}";
+    rev = "v${version}";
+    sha256 = "11w8z9ik6zzv3pw3319mz91cgbfkgx0mffxbapqnhilzij2jad4q";
+  };
+
+  # It's used to locate headers
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "get_output('krb5-config gssapi --prefix')" "'${lib.getDev krb5Full}'"
+  '';
+
+  nativeBuildInputs = [
+    cython
+    krb5Full
+  ];
+
+  propagatedBuildInputs =  [
+    decorator
+    six
+  ];
+
+  buildInputs = lib.optionals stdenv.isDarwin [
+    darwin.apple_sdk.frameworks.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"
+    ${python.interpreter} setup.py 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..9ff8434cc9aa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gst-python/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, buildPythonPackage
+, fetchurl
+, meson
+, ninja
+, stdenv
+, pkg-config
+, python3
+, pygobject3
+, gobject-introspection
+, gst-plugins-base
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "gst-python";
+  version = "1.18.0";
+
+  format = "other";
+
+  outputs = [ "out" "dev" ];
+
+  src = fetchurl {
+    url = "${meta.homepage}/src/gst-python/${pname}-${version}.tar.xz";
+    sha256 = "0ifx2s2j24sj2w5jm7cxyg1kinnhbxiz4x0qp3gnsjlwbawfigvn";
+  };
+
+  # Python 2.x is not supported.
+  disabled = !isPy3k;
+
+  nativeBuildInputs = [
+    meson
+    ninja
+    pkg-config
+    python3
+    gobject-introspection
+    gst-plugins-base
+  ];
+
+  propagatedBuildInputs = [
+    gst-plugins-base
+    pygobject3
+  ];
+
+  mesonFlags = [
+    "-Dpygi-overrides-dir=${placeholder "out"}/${python3.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/gtimelog/default.nix b/nixpkgs/pkgs/development/python-modules/gtimelog/default.nix
new file mode 100644
index 000000000000..3af8e97ba71b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gtimelog/default.nix
@@ -0,0 +1,60 @@
+{ lib, stdenv, 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.gnome3.gnome-keyring.enable = true;
+
+      In addition, the following packages should be added to the environment:
+      - gnome3.adwaita-icon-theme
+      - gnome3.dconf
+    '';
+    homepage = "https://gtimelog.org/";
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ oxzi ];
+    platforms = platforms.unix;
+  };
+}
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..0fc9d43dc2ce
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gtts/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, beautifulsoup4
+, click
+, gtts-token
+, mock
+, pytest
+, requests
+, six
+, testfixtures
+, twine
+, urllib3
+}:
+
+buildPythonPackage rec {
+  pname = "gtts";
+  version = "2.2.1";
+
+  src = fetchFromGitHub {
+    owner = "pndurette";
+    repo = "gTTS";
+    rev = "v${version}";
+    sha256 = "1a984691kfin1n896p5l7y8ggjzx19ynih2cw040smfms0azhp4w";
+  };
+
+  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";
+    license = licenses.mit;
+    maintainers = with maintainers; [ unode ];
+  };
+}
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..d0c1e74ee290
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/guessit/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestrunner
+, dateutil
+, babelfish
+, rebulk
+}:
+
+buildPythonPackage rec {
+  pname = "guessit";
+  version = "3.1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1c530pb0h34z0ziym256qps21b8mh533ia1lcnx9wqwx9rnqriki";
+  };
+
+  # Tests require more packages.
+  doCheck = false;
+  buildInputs = [ pytestrunner ];
+  propagatedBuildInputs = [
+    dateutil babelfish rebulk
+  ];
+
+  meta = {
+    homepage = "https://pypi.python.org/pypi/guessit";
+    license = lib.licenses.lgpl3;
+    description = "A library for guessing information from video files";
+  };
+}
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..23a2545525a3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/guestfs/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv, 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/19.nix b/nixpkgs/pkgs/development/python-modules/gunicorn/19.nix
new file mode 100644
index 000000000000..c1091fa980c9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gunicorn/19.nix
@@ -0,0 +1,39 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi
+, coverage
+, mock
+, pytest
+, pytestcov
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "gunicorn";
+  version = "19.10.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1080jk1ly8j0rc6lv8i33sj94rxjaskd1732cdq5chdqb3ij9ppr";
+  };
+
+  propagatedBuildInputs = [ setuptools ];
+
+  checkInputs = [ pytest mock pytestcov coverage ];
+
+  prePatch = ''
+    substituteInPlace requirements_test.txt --replace "==" ">=" \
+      --replace "coverage>=4.0,<4.4" "coverage"
+  '';
+
+  # better than no tests
+  checkPhase = ''
+    $out/bin/gunicorn --help > /dev/null
+  '';
+
+  pythonImportsCheck = [ "gunicorn" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/benoitc/gunicorn";
+    description = "WSGI HTTP Server for UNIX";
+    license = licenses.mit;
+  };
+}
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..983335f4395b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gunicorn/default.nix
@@ -0,0 +1,40 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, isPy27
+, coverage
+, mock
+, pytest
+, pytestcov
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "gunicorn";
+  version = "20.0.4";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1904bb2b8a43658807108d59c3f3d56c2b6121a701161de0ddf9ad140073c626";
+  };
+
+  propagatedBuildInputs = [ setuptools ];
+
+  checkInputs = [ pytest mock pytestcov coverage ];
+
+  prePatch = ''
+    substituteInPlace requirements_test.txt --replace "==" ">=" \
+      --replace "coverage>=4.0,<4.4" "coverage"
+  '';
+
+  # better than no tests
+  checkPhase = ''
+    $out/bin/gunicorn --help > /dev/null
+  '';
+
+  pythonImportsCheck = [ "gunicorn" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/benoitc/gunicorn";
+    description = "WSGI HTTP Server for UNIX";
+    license = licenses.mit;
+  };
+}
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..d572b10fd625
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gurobipy/linux.nix
@@ -0,0 +1,21 @@
+{ fetchurl, python }:
+assert python.pkgs.isPy27;
+
+python.pkgs.buildPythonPackage
+  { pname = "gurobipy";
+    version = "7.5.2";
+    src = fetchurl
+      { url = "http://packages.gurobi.com/7.5/gurobi7.5.2_linux64.tar.gz";
+        sha256 = "13i1dl22lnmg7z9mb48zl3hy1qnpwdpr0zl2aizda0qnb7my5rnj";
+      };
+    setSourceRoot = "sourceRoot=$(echo gurobi*/*64)";
+    patches = [ ./no-clever-setup.patch ];
+    postInstall = "mv lib/libaes*.so* lib/libgurobi*.so* $out/lib";
+    postFixup =
+      ''
+        patchelf --set-rpath $out/lib \
+          $out/lib/python2.7/site-packages/gurobipy/gurobipy.so
+        patchelf --add-needed libaes75.so \
+          $out/lib/python2.7/site-packages/gurobipy/gurobipy.so
+      '';
+  }
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..c71ac7d68632
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gurobipy/no-clever-setup.patch
@@ -0,0 +1,55 @@
+diff -Naur a/setup.py b/setup.py
+--- a/setup.py	2017-12-22 10:52:43.730264611 -0500
++++ b/setup.py	2017-12-22 10:53:27.660104199 -0500
+@@ -15,30 +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):
+-        assert os.getcwd() == self.cwd, 'Must be run from setup.py directory: %s' % self.cwd
+-        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,
+@@ -79,20 +55,4 @@
+       packages = ['gurobipy'],
+       package_dir={'gurobipy' : srcpath },
+       package_data = {'gurobipy' : [srcfile] },
+-      cmdclass={'install' : GurobiInstall, 
+-                'clean'   : GurobiClean }
+       )
+-
+-if os.name == 'posix' and sys.platform == 'darwin': # update Mac paths
+-  verstr = sys.version[:3]
+-  default = '/Library/Frameworks/Python.framework/Versions/%s/Python' % verstr
+-  default = '/System'+default if verstr == '2.7' else default
+-  modified = sys.prefix + '/Python'
+-  if default != modified:
+-    import subprocess
+-    from distutils.sysconfig import get_python_lib
+-    sitelib = get_python_lib() + '/gurobipy/gurobipy.so'
+-    if not os.path.isfile(modified): # Anaconda
+-      libver = verstr if verstr == '2.7' else verstr+'m'
+-      modified = sys.prefix + '/lib/libpython%s.dylib' % libver # For Anaconda
+-    subprocess.call(('install_name_tool', '-change', default, modified, sitelib))
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..f70625b86fe2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/guzzle_sphinx_theme/default.nix
@@ -0,0 +1,22 @@
+{ lib, stdenv, 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..fabc2d147fca
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gviz-api/default.nix
@@ -0,0 +1,26 @@
+{ lib, fetchPypi, buildPythonPackage
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "gviz_api";
+  version = "1.9.0";
+  format = "wheel";
+
+  src = fetchPypi {
+    inherit pname version;
+    format = "wheel";
+    sha256 = "1yag559lpmwfdxpxn679a6ajifcbpgljr5n6k5b7rrj38k2xq7jg";
+  };
+
+  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/gym/default.nix b/nixpkgs/pkgs/development/python-modules/gym/default.nix
new file mode 100644
index 000000000000..d826fc33324f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gym/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage, fetchPypi
+, numpy, requests, six, pyglet, scipy, cloudpickle
+}:
+
+buildPythonPackage rec {
+  pname = "gym";
+  version = "0.17.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "96a7dd4e9cdb39e30c7a79e5773570fd9408f7fdb58c714c293cfbb314818eb6";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "pyglet>=1.2.0,<=1.3.2" "pyglet" \
+      --replace "cloudpickle>=1.2.0,<1.4.0" "cloudpickle~=1.2"
+  '';
+  # cloudpickle range has been expanded in package but not yet released
+
+  propagatedBuildInputs = [
+    numpy requests six pyglet scipy cloudpickle
+  ];
+
+  # The test needs MuJoCo that is not free library.
+  doCheck = false;
+
+  pythonImportsCheck = [ "gym" ];
+
+  meta = with lib; {
+    description = "A toolkit by OpenAI 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..5be56c81257a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gyp/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchFromGitiles
+, isPy3k
+}:
+
+buildPythonPackage {
+  pname = "gyp";
+  version = "2020-05-12";
+
+  src = fetchFromGitiles {
+    url = "https://chromium.googlesource.com/external/gyp";
+    rev = "caa60026e223fc501e8b337fd5086ece4028b1c6";
+    sha256 = "0r9phq5yrmj968vdvy9vivli35wn1j9a6iwshp69wl7q4p0x8q2b";
+  };
+
+  patches = lib.optionals stdenv.isDarwin [
+    ./no-darwin-cflags.patch
+    ./no-xcode.patch
+  ];
+
+  meta = with lib; {
+    description = "A tool to generate native build files";
+    homepage = "https://chromium.googlesource.com/external/gyp/+/master/README.md";
+    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..f3d37dacfa3c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/h11/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "h11";
+  version = "0.12.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0hk0nll6qazsambp3kl8cxxsbl4gv5y9252qadyk0jky0sv2q8j7";
+  };
+
+  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;
+  };
+}
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..6dad775732c0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/h2/default.nix
@@ -0,0 +1,22 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi
+, enum34, hpack, hyperframe, pytestCheckHook, hypothesis }:
+
+buildPythonPackage rec {
+  pname = "h2";
+  version = "4.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "bb7ac7099dd67a857ed52c815a6192b6b1f5ba6b516237fc24a085341340593d";
+  };
+
+  propagatedBuildInputs = [ enum34 hpack hyperframe ];
+
+  checkInputs = [ pytestCheckHook hypothesis ];
+
+  meta = with lib; {
+    description = "HTTP/2 State-Machine based protocol implementation";
+    homepage = "http://hyper.rtfd.org/";
+    license = licenses.mit;
+  };
+}
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..46b774a25c1e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/h3/default.nix
@@ -0,0 +1,35 @@
+{ lib, stdenv
+, buildPythonPackage
+, cmake
+, fetchPypi
+, h3
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "h3";
+  version = "3.7.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "cd27fc8ecd9183f93934079b7c986401f499030ff2e2171eace9de462fab561d";
+  };
+
+  patches = [
+    ./disable-custom-install.patch
+    ./hardcode-h3-path.patch
+  ];
+
+  preBuild = ''
+    substituteInPlace h3/h3.py \
+      --subst-var-by libh3_path ${h3}/lib/libh3${stdenv.hostPlatform.extensions.sharedLibrary}
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/uber/h3-py";
+    description = "This library provides Python bindings for the H3 Core Library.";
+    license = licenses.asl20;
+    platforms = platforms.unix ++ platforms.darwin;
+    maintainers = [ maintainers.kalbasit ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/h3/disable-custom-install.patch b/nixpkgs/pkgs/development/python-modules/h3/disable-custom-install.patch
new file mode 100644
index 000000000000..981e3b6e2fc6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/h3/disable-custom-install.patch
@@ -0,0 +1,41 @@
+diff --git a/setup.py b/setup.py
+index 8e1c220..45297b6 100644
+--- a/setup.py
++++ b/setup.py
+@@ -25,20 +25,6 @@ class CustomBuildExtCommand(build_ext):
+         install_h3(h3_version)
+
+
+-# Tested with wheel v0.29.0
+-class BinaryDistribution(Distribution):
+-    def __init__(self, attrs=None):
+-        Distribution.__init__(self, attrs)
+-        # The values used for the name and sources in the Extension below are
+-        # not important, because we override the build_ext command above.
+-        # The normal C extension building logic is never invoked, and is
+-        # replaced with our own custom logic. However, ext_modules cannot be
+-        # empty, because this signals to other parts of distutils that our
+-        # package contains C extensions and thus needs to be built for
+-        # different platforms separately.
+-        self.ext_modules = [Extension('h3c', [])]
+-
+-
+ long_description = open('README.rst').read()
+
+ setup(
+@@ -52,14 +38,10 @@ setup(
+     url='https://github.com/uber/h3-py.git',
+     packages=find_packages(exclude=['tests', 'tests.*']),
+     install_requires=[],
+-    cmdclass={
+-        'build_ext': CustomBuildExtCommand,
+-    },
+     package_data={
+         'h-py':
+         ['out/*.dylib' if platform.system() == 'Darwin' else (
+             'out/*.dll' if platform.system() == 'Windows' else
+             'out/*.so.*')]
+     },
+-    license='Apache License 2.0',
+-    distclass=BinaryDistribution)
++    license='Apache License 2.0')
diff --git a/nixpkgs/pkgs/development/python-modules/h3/hardcode-h3-path.patch b/nixpkgs/pkgs/development/python-modules/h3/hardcode-h3-path.patch
new file mode 100644
index 000000000000..87549f298d74
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/h3/hardcode-h3-path.patch
@@ -0,0 +1,19 @@
+diff --git a/h3/h3.py b/h3/h3.py
+index 18cf168..2cc7812 100644
+--- a/h3/h3.py
++++ b/h3/h3.py
+@@ -34,13 +34,7 @@ from ctypes import (
+     POINTER,
+ )
+
+-_dirname = os.path.dirname(__file__)
+-libh3_path = ('{}/{}'.format(_dirname, 'out/libh3.1.dylib')
+-              if platform.system() == 'Darwin' else (
+-              '{}/{}'.format(_dirname, 'out/h3.dll') if platform.system() == 'Windows' else
+-              '{}/{}'.format(_dirname, 'out/libh3.so.1')))
+-
+-libh3 = cdll.LoadLibrary(libh3_path)
++libh3 = cdll.LoadLibrary('@libh3_path@')
+
+ # Type of an H3 index
+ H3Index = c_ulonglong
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..23a8c4ddcb26
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/h5netcdf/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, h5py
+, pytestCheckHook
+, netcdf4
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "h5netcdf";
+  version = "0.8.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "09bbnpsvwksb07wijn7flyyza56h5b2g2cw0hb3slmwxz6cgcjmr";
+  };
+
+  patches = [
+    (fetchpatch{
+      url = "https://patch-diff.githubusercontent.com/raw/h5netcdf/h5netcdf/pull/82.patch";
+    sha256 = "0x9bq9jl4kvw152adkpcyqslhpi7miv80hrnpl2w2y798mmbs0s4";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    h5py
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    netcdf4
+  ];
+
+  disabled = pythonOlder "3.6";
+
+  dontUseSetuptoolsCheck = true;
+
+  meta = {
+    description = "netCDF4 via h5py";
+    homepage = "https://github.com/shoyer/h5netcdf";
+    license = lib.licenses.bsd3;
+  };
+
+}
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..c167e2115c66
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/h5py/default.nix
@@ -0,0 +1,54 @@
+{ lib, fetchPypi, isPy27, python, buildPythonPackage, pythonOlder
+, numpy, hdf5, cython, six, pkgconfig, unittest2, fetchpatch
+, 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.1.0";
+  pname = "h5py";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1e2516f190652beedcb8c7acfa1c6fa92d99b42331cbef5e5c7ec2d65b0fc3c2";
+  };
+
+  # avoid strict pinning of numpy
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "numpy ==" "numpy >="
+  '';
+
+  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.bsd2;
+  };
+}
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..653c4483ce82
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ha-ffmpeg/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, isPy3k
+, ffmpeg_3, async-timeout }:
+
+buildPythonPackage rec {
+  pname = "ha-ffmpeg";
+  version = "3.0.2";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "8d92f2f5790da038d828ac862673e0bb43e8e972e4c70b1714dd9a0fb776c8d1";
+  };
+
+  buildInputs = [ ffmpeg_3 ];
+
+  propagatedBuildInputs = [ async-timeout ];
+
+  # only manual tests
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/pvizeli/ha-ffmpeg";
+    description = "Library for home-assistant to handle ffmpeg";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ peterhoeg ];
+  };
+}
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..a7ec358ffd7b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/habanero/default.nix
@@ -0,0 +1,29 @@
+{ buildPythonPackage, lib, fetchFromGitHub
+, requests
+, nose, vcrpy
+}:
+
+buildPythonPackage rec {
+  pname = "habanero";
+  version = "0.6.0";
+
+  # Install from Pypi is failing because of a missing file (Changelog.rst)
+  src = fetchFromGitHub {
+    owner = "sckott";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1l2cgl6iiq8jff2w2pib6w8dwaj8344crhwsni2zzq0p44dwi13d";
+  };
+
+  propagatedBuildInputs = [ requests ];
+
+  checkInputs = [ nose vcrpy ];
+  checkPhase = "make test";
+
+  meta = {
+    description = "Python interface to Library Genesis";
+    homepage = "https://habanero.readthedocs.io/en/latest/";
+    license = lib.licenses.mit;
+    maintainers = [ lib.maintainers.nico202 ];
+  };
+}
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..b2b7b4b3d142
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/handout/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv, 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/hass-nabucasa/default.nix b/nixpkgs/pkgs/development/python-modules/hass-nabucasa/default.nix
new file mode 100644
index 000000000000..102ab3a2540c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hass-nabucasa/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, acme
+, aiohttp
+, asynctest
+, atomicwrites
+, attrs
+, buildPythonPackage
+, fetchFromGitHub
+, pycognito
+, pytest-aiohttp
+, pytestCheckHook
+, snitun
+, warrant
+}:
+
+buildPythonPackage rec {
+  pname = "hass-nabucasa";
+  version = "0.41.0";
+
+  src = fetchFromGitHub {
+    owner = "nabucasa";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-ewWw3PyJGRHP23J6WBBWs9YGl4vTb9/j/soZ6n5wbLM=";
+  };
+
+  postPatch = ''
+    sed -i 's/"acme.*"/"acme"/' setup.py
+  '';
+
+  propagatedBuildInputs = [
+    acme
+    aiohttp
+    atomicwrites
+    attrs
+    pycognito
+    snitun
+    warrant
+  ];
+
+  checkInputs = [
+    asynctest
+    pytest-aiohttp
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "hass_nabucasa" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/NabuCasa/hass-nabucasa";
+    description = "Home Assistant cloud integration by Nabu Casa, inc.";
+    license = licenses.gpl3;
+    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..d375effd1609
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hatasmota/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, attrs
+, buildPythonPackage
+, fetchFromGitHub
+, voluptuous
+}:
+
+buildPythonPackage rec {
+  pname = "hatasmota";
+  version = "0.2.6";
+
+  src = fetchFromGitHub {
+    owner = "emontnemery";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-kRTgHFRnhjLM2DhKNy9HDKIsRk+w0AKP+o0hy8w+3ys=";
+  };
+
+  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/haversine/default.nix b/nixpkgs/pkgs/development/python-modules/haversine/default.nix
new file mode 100644
index 000000000000..7f5e462d1b3c
--- /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.3.0";
+
+  src = fetchFromGitHub {
+    owner = "mapado";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1c3yf9162b2b7l1lsw3ffd1linnc542qvljpgwxp6y5arrmljqnv";
+  };
+
+  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..a0b7d50b560d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hawkauthlib/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv
+, 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/hbmqtt/default.nix b/nixpkgs/pkgs/development/python-modules/hbmqtt/default.nix
new file mode 100644
index 000000000000..003805f939c6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hbmqtt/default.nix
@@ -0,0 +1,37 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, isPy3k, pythonAtLeast, setuptools
+, transitions, websockets, passlib, docopt, pyyaml, nose }:
+
+buildPythonPackage rec {
+  pname = "hbmqtt";
+  version = "0.9.6";
+
+  # https://github.com/beerfactory/hbmqtt/issues/223
+  disabled = !isPy3k || pythonAtLeast "3.9";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1n9c8yj11npiq9qxivwmfhib1qkjpcyw42a7q0w641bdrz3x6r37";
+  };
+
+  propagatedBuildInputs = [
+    transitions websockets passlib docopt pyyaml setuptools
+  ];
+
+  postPatch = ''
+    # test tries to bind same port multiple times and fails
+    rm tests/test_client.py
+  '';
+
+  checkInputs = [ nose ];
+
+  checkPhase = ''
+    nosetests -e test_connect_tcp
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/beerfactory/hbmqtt";
+    description = "MQTT client/broker using Python asynchronous I/O";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
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..8f9d69a8941d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hcloud/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, future
+, requests
+, python-dateutil
+, flake8
+, isort
+, mock
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "hcloud";
+  version = "1.10.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "11sdyays90lmkbdxhllc8ccx0xhrafb7dknqgjlrfpzq04v67vyy";
+  };
+
+  propagatedBuildInputs = [ future requests python-dateutil ];
+
+  checkInputs = [ flake8 isort mock pytest ];
+
+  # Skip integration tests since they require a separate external fake API endpoint.
+  checkPhase = ''
+    pytest --ignore=tests/integration
+  '';
+
+  meta = with lib; {
+    description = "Official Hetzner Cloud python library";
+    homepage = "https://github.com/hetznercloud/hcloud-python";
+    license = licenses.mit;
+    platforms = platforms.all;
+    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..56e9811396e6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hcs_utils/default.nix
@@ -0,0 +1,31 @@
+{ lib, stdenv, 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/hdbscan/default.nix b/nixpkgs/pkgs/development/python-modules/hdbscan/default.nix
new file mode 100644
index 000000000000..6ee76e5271a7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hdbscan/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, cython
+, numpy
+, nose
+, scipy
+, scikitlearn
+, fetchPypi
+, joblib
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "hdbscan";
+  version = "0.8.26";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0zlj2y42f0hrklviv21j9m895259ad8273dxgh7b44702781r9l1";
+  };
+
+  checkInputs = [ nose ];
+
+  nativeBuildInputs = [ cython ];
+  propagatedBuildInputs = [ numpy scipy scikitlearn joblib six ];
+
+  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/hdlparse/default.nix b/nixpkgs/pkgs/development/python-modules/hdlparse/default.nix
new file mode 100644
index 000000000000..4257f9b2e9a2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hdlparse/default.nix
@@ -0,0 +1,22 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "hdlparse";
+  version = "1.0.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "fb6230ed1e7a04a8f82f8d3fb59791d0751ae35e5b8e58dbbf2cbcf100d0d0f2";
+  };
+
+  #This module does not contain any tests.
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://kevinpt.github.io/hdlparse/";
+    description = "Rudimentary parser for VHDL and Verilog";
+    license = licenses.mit;
+    maintainers = with maintainers; [ elliottvillars ];
+  };
+}
+
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..3b65e10bfcec
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hdmedians/default.nix
@@ -0,0 +1,35 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, nose
+, cython
+, numpy
+}:
+
+buildPythonPackage rec {
+  version = "0.14.1";
+  pname = "hdmedians";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ccefaae26302afd843c941b3b662f1119d5a36dec118077310f811a7a1ed8871";
+  };
+
+  # 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/heapdict/default.nix b/nixpkgs/pkgs/development/python-modules/heapdict/default.nix
new file mode 100644
index 000000000000..4cd695925f28
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/heapdict/default.nix
@@ -0,0 +1,20 @@
+{ lib, stdenv, 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/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..4c7ff0c3878f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/helper/default.nix
@@ -0,0 +1,23 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, pyyaml, mock }:
+
+buildPythonPackage rec {
+  pname = "helper";
+  version = "2.4.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0p56dvjpaz9wnr0ik2wmvgqjf9ji180bhjky7q272l5dan94lgd6";
+  };
+
+  checkInputs = [ mock ];
+  propagatedBuildInputs = [ pyyaml ];
+
+  # No tests in the pypi tarball
+  doCheck = false;
+
+  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/hetzner/default.nix b/nixpkgs/pkgs/development/python-modules/hetzner/default.nix
new file mode 100644
index 000000000000..3b938dfc237c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hetzner/default.nix
@@ -0,0 +1,23 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+}:
+
+buildPythonPackage rec {
+  pname = "hetzner";
+  version = "0.8.2";
+
+  src = fetchFromGitHub {
+    repo = "hetzner";
+    owner = "aszlig";
+    rev = "v${version}";
+    sha256 = "152fklxff08s71v0b78yp5ajwpqyszm3sd7j0qsrwa2x9ik4968h";
+  };
+
+  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..ce2918188241
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/heudiconv/default.nix
@@ -0,0 +1,49 @@
+{ lib, stdenv
+, 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/hg-evolve/default.nix b/nixpkgs/pkgs/development/python-modules/hg-evolve/default.nix
new file mode 100644
index 000000000000..38a770e879fa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hg-evolve/default.nix
@@ -0,0 +1,24 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "hg-evolve";
+  version = "10.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a386e6ee2d9a0e332a49f1cb210c4c11ba9844bcd52808270f48e688314783d8";
+  };
+
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Enables the “changeset evolution” feature of Mercurial core";
+    homepage = "https://www.mercurial-scm.org/doc/evolution/";
+    maintainers = with maintainers; [ xavierzwirtz ];
+    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..1d8e1ec1e29f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hg-git/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, dulwich
+, isPy3k
+, fetchpatch
+}:
+
+buildPythonPackage rec {
+  pname = "hg-git";
+  version = "0.8.12";
+  disabled = isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "13hbm0ki6s88r6p65ibvrbxnskinzdz0m9gsshb8s571p91ymfjn";
+  };
+
+  propagatedBuildInputs = [ dulwich ];
+
+  # Needs patch to work with Mercurial 4.8
+  # https://bitbucket.org/durin42/hg-git/issues/264/unexpected-keyword-argument-createopts-hg
+  patches =
+    fetchpatch {
+      url = "https://bitbucket.org/rsalmaso/hg-git/commits/a778506fd4be0bf1afa75755f6ee9260fa234a0f/raw";
+      sha256 = "12r4qzbc5xcqwv0kvf8g4wjji7n45421zkbf6i75vyi4nl6n4j15";
+    };
+
+  meta = with lib; {
+    description = "Push and pull from a Git server using Mercurial";
+    homepage = "http://hg-git.github.com/";
+    maintainers = with maintainers; [ koral ];
+    license = licenses.gpl2;
+  };
+
+}
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..afac7983584c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hglib/default.nix
@@ -0,0 +1,43 @@
+{ lib, stdenv, 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/hgsvn/default.nix b/nixpkgs/pkgs/development/python-modules/hgsvn/default.nix
new file mode 100644
index 000000000000..2ee6024cd475
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hgsvn/default.nix
@@ -0,0 +1,32 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, nose
+, hglib
+, isPy3k
+, isPyPy
+}:
+
+buildPythonPackage rec {
+  pname = "hgsvn";
+  version = "0.3.15";
+  disabled = isPy3k || isPyPy;
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "036270cc2803f7a7de3842e8c593849631b2293e647aa3444f68f1b1834d1fa1";
+  };
+
+  buildInputs = [ nose ];
+  propagatedBuildInputs = [ hglib ];
+
+  doCheck = false;  # too many assumptions
+
+  meta = with lib; {
+    homepage = "https://pypi.python.org/pypi/hgsvn";
+    description = "A set of scripts to work locally on Subversion checkouts using Mercurial";
+    license = licenses.gpl2;
+  };
+
+}
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..0806573d7bec
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hickle/default.nix
@@ -0,0 +1,50 @@
+{ buildPythonPackage
+, fetchPypi
+, pythonOlder
+, h5py
+, numpy
+, dill
+, astropy
+, scipy
+, pandas
+, codecov
+, pytest
+, pytestcov
+, pytestrunner
+, coveralls
+, twine
+, check-manifest
+, lib
+}:
+
+buildPythonPackage rec {
+  pname   = "hickle";
+  version = "4.0.1";
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "fcf2c4f9e4b7f0d9dae7aa6c59a58473884017875d3b17898d56eaf8a9c1da96";
+  };
+
+  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 pytestcov pytestrunner coveralls scipy pandas astropy twine check-manifest codecov
+  ];
+
+  pythonImportsCheck = [ "hickle" ];
+
+  meta = {
+    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/hidapi/default.nix b/nixpkgs/pkgs/development/python-modules/hidapi/default.nix
new file mode 100644
index 000000000000..790e7aa08fc2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hidapi/default.nix
@@ -0,0 +1,36 @@
+{ lib, stdenv, libusb1, udev, darwin, fetchPypi, buildPythonPackage, cython }:
+
+buildPythonPackage rec {
+  pname = "hidapi";
+  version = "0.10.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a1170b18050bc57fae3840a51084e8252fd319c0fc6043d68c8501deb0e25846";
+  };
+
+  propagatedBuildInputs =
+    lib.optionals stdenv.isLinux [ libusb1 udev ] ++
+    lib.optionals stdenv.isDarwin (with darwin.apple_sdk.frameworks; [ AppKit CoreFoundation IOKit ]) ++
+    [ cython ];
+
+  # 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
+  '' + lib.optionalString stdenv.isDarwin ''
+    substituteInPlace setup.py --replace 'macos_sdk_path =' 'macos_sdk_path = "" #'
+  '';
+
+  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 = licenses.bsd3;
+    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..418059c51658
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hieroglyph/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv, 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/hiredis/default.nix b/nixpkgs/pkgs/development/python-modules/hiredis/default.nix
new file mode 100644
index 000000000000..e9d5677f8beb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hiredis/default.nix
@@ -0,0 +1,31 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, redis
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "hiredis";
+  version = "1.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "996021ef33e0f50b97ff2d6b5f422a0fe5577de21a8873b58a779a5ddd1c3132";
+  };
+  propagatedBuildInputs = [ redis ];
+
+  checkPhase = ''
+    mv hiredis _hiredis
+    ${python.interpreter} test.py
+  '';
+  pythonImportsCheck = [ "hiredis" ];
+
+  meta = with lib; {
+    description = "Wraps protocol parsing code in hiredis, speeds up parsing of multi bulk replies";
+    homepage = "https://github.com/redis/hiredis-py";
+    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..3ff672a22db6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hiro/default.nix
@@ -0,0 +1,19 @@
+{ lib, stdenv, 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..f443c58723e8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hiyapyco/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pyyaml
+, jinja2
+}:
+
+buildPythonPackage rec {
+  pname = "HiYaPyCo";
+  version = "0.4.16";
+
+  src = fetchFromGitHub {
+    owner = "zerwes";
+    repo = pname;
+    rev = "release-${version}";
+    sha256 = "1ams9dp05yhgbg6255wrjgchl2mqg0s34d8b8prvql9lsh59s1fj";
+  };
+
+  propagatedBuildInputs = [ pyyaml jinja2 ];
+
+  checkPhase = ''
+    set -e
+    find test -name 'test_*.py' -exec python {} \;
+  '';
+
+  meta = with lib; {
+    description = "A simple python lib allowing hierarchical overlay of config files in YAML syntax, offering different merge methods and variable interpolation based on jinja2.";
+    homepage = "https://github.com/zerwes/hiyapyco";
+    license = licenses.gpl3;
+    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..3393ad186918
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hjson/default.nix
@@ -0,0 +1,35 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, 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"
+  '';
+
+  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/hkdf/default.nix b/nixpkgs/pkgs/development/python-modules/hkdf/default.nix
new file mode 100644
index 000000000000..966ce7001fbb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hkdf/default.nix
@@ -0,0 +1,31 @@
+{ lib, stdenv
+, 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/hmmlearn/default.nix b/nixpkgs/pkgs/development/python-modules/hmmlearn/default.nix
new file mode 100644
index 000000000000..3f601eacc429
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hmmlearn/default.nix
@@ -0,0 +1,26 @@
+{ lib, fetchurl, buildPythonPackage, numpy, scikitlearn, setuptools_scm, cython, pytest }:
+
+buildPythonPackage rec {
+  pname = "hmmlearn";
+  version = "0.2.4";
+
+  src = fetchurl {
+    url = "mirror://pypi/h/hmmlearn/${pname}-${version}.tar.gz";
+    sha256 = "0f5cb598a7494b9703c6188246dc89e529d46cbb6700eca70cc895085f0b3cc3";
+  };
+
+  buildInputs = [ setuptools_scm cython ];
+  propagatedBuildInputs = [ numpy scikitlearn ];
+  checkInputs = [ pytest ];
+
+  checkPhase = ''
+    pytest --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..79a2e83508aa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hocr-tools/default.nix
@@ -0,0 +1,31 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, lxml
+, pillow
+, reportlab
+, lib, stdenv
+}:
+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..87c63be32e8c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hole/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, aiohttp
+, async-timeout
+}:
+
+buildPythonPackage rec {
+  pname = "hole";
+  version = "0.5.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "065fxc0l16j8xkjd0y0qar9cmqmjyp8jcshakbakldkfscpx3s5m";
+  };
+
+  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..b5e0062d115a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/holidays/default.nix
@@ -0,0 +1,33 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, convertdate
+, dateutil
+, korean-lunar-calendar
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "holidays";
+  version = "0.10.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "839281f2b1ae7ac576da7951472482f6e714818296853107ea861fa60f5013cc";
+  };
+
+  propagatedBuildInputs = [
+    convertdate
+    dateutil
+    korean-lunar-calendar
+    six
+  ];
+  pythonImportsCheck = [ "holidays" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/dr-prodigy/python-holidays";
+    description = "Generate and work with holidays in Python";
+    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..4d9da17bd3a9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/holoviews/default.nix
@@ -0,0 +1,47 @@
+{ buildPythonPackage
+, fetchPypi
+, lib
+, param
+, numpy
+, pyviz-comms
+, ipython
+, notebook
+, pandas
+, matplotlib
+, bokeh
+, scipy
+, panel
+}:
+
+buildPythonPackage rec {
+  pname = "holoviews";
+  version = "1.13.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "3f8a00ce1cc67a388a3a949441accd7e7e9ca9960ba16b49ee96a50305105a01";
+  };
+
+  propagatedBuildInputs = [
+    param
+    numpy
+    pyviz-comms
+    ipython
+    notebook
+    pandas
+    matplotlib
+    bokeh
+    scipy
+    panel
+  ];
+
+  # tests not fully included with pypi release
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Python data analysis and visualization seamless and simple";
+    homepage = "http://www.holoviews.org/";
+    license = licenses.bsd3;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..a4ecb0d7ba3b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/homeassistant-pyozw/default.nix
@@ -0,0 +1,15 @@
+{ python_openzwave, fetchPypi }:
+
+python_openzwave.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/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..cc6003fa952c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/howdoi/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, six
+, pygments
+, pyquery
+, cachelib
+, appdirs
+, keep
+}:
+
+buildPythonPackage rec {
+  pname = "howdoi";
+  version = "2.0.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "9b7cabab87cd614e26b408653bc8937ec27b79ca2fde6b9457da55d2541f75fb";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py --replace 'cachelib==0.1' 'cachelib'
+  '';
+
+  propagatedBuildInputs = [ six pygments pyquery cachelib appdirs keep ];
+
+  # author hasn't included page_cache directory (which allows tests to run without
+  # external requests) in pypi tarball. github repo doesn't have release revisions
+  # clearly tagged. re-enable tests when either is sorted.
+  doCheck = false;
+  preCheck = ''
+    mv howdoi _howdoi
+    export HOME=$(mktemp -d)
+  '';
+  pythonImportsCheck = [ "howdoi" ];
+
+  meta = with lib; {
+    description = "Instant coding answers via the command line";
+    homepage = "https://pypi.python.org/pypi/howdoi";
+    license = licenses.mit;
+    maintainers = [ 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..9b6f724cd318
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hpack/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "hpack";
+  version = "4.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "fc41de0c63e687ebffde81187a948221294896f6bdc0ae2312708df339430095";
+  };
+
+  meta = with lib; {
+    description = "Pure-Python HPACK header compression";
+    homepage = "http://hyper.rtfd.org";
+    license = licenses.mit;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hsaudiotag/default.nix b/nixpkgs/pkgs/development/python-modules/hsaudiotag/default.nix
new file mode 100644
index 000000000000..fba71dc3f109
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hsaudiotag/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "hsaudiotag";
+  version = "1.1.1";
+  disabled = isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "15hgm128p8nysfi0jb127awga3vlj0iw82l50swjpvdh01m7rda8";
+  };
+
+  # 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/hsaudiotag3k/default.nix b/nixpkgs/pkgs/development/python-modules/hsaudiotag3k/default.nix
new file mode 100644
index 000000000000..52919e489837
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hsaudiotag3k/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv
+, 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/hstspreload/default.nix b/nixpkgs/pkgs/development/python-modules/hstspreload/default.nix
new file mode 100644
index 000000000000..7562e36e4d95
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hstspreload/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, isPy27
+}:
+
+buildPythonPackage rec {
+  pname = "hstspreload";
+  version = "2020.12.22";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "sethmlarson";
+    repo = pname;
+    rev = version;
+    sha256 = "1jzcw4clmpbyw67pzskms5rq5b7285iwh42jzc4ly6jz9amggdzc";
+  };
+
+  # 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 = [ maintainers.costrouc ];
+  };
+}
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..17783f38d1f1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/html-sanitizer/default.nix
@@ -0,0 +1,21 @@
+{ lib, buildPythonPackage, fetchFromGitHub, lxml, beautifulsoup4, pytest, pytestrunner }:
+
+buildPythonPackage rec {
+  pname = "html-sanitizer";
+  version = "1.9.1";
+
+  src = fetchFromGitHub {
+    owner = "matthiask";
+    repo = pname;
+    rev = version;
+    sha256 = "0nnv34924r0yn01rwlk749j5ijy7yxyj302s1i57yjrkqr3zlvas";
+  };
+
+  propagatedBuildInputs = [ lxml beautifulsoup4 ];
+
+  meta = with lib; {
+    description = "An  allowlist-based and very opinionated HTML sanitizer that can be used both for untrusted and trusted sources.";
+    homepage = "https://github.com/matthiask/html-sanitizer";
+    license = licenses.bsd3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/html2text/2018.nix b/nixpkgs/pkgs/development/python-modules/html2text/2018.nix
new file mode 100644
index 000000000000..73540359ee1a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/html2text/2018.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "html2text";
+  version = "2018.1.9";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "627514fb30e7566b37be6900df26c2c78a030cc9e6211bda604d8181233bcdd4";
+  };
+
+  meta = with lib; {
+    description = "Turn HTML into equivalent Markdown-structured text";
+    homepage = "https://github.com/Alir3z4/html2text/";
+    license = licenses.gpl3;
+  };
+
+}
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..dd23ad6c619d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/html2text/default.nix
@@ -0,0 +1,28 @@
+{ lib, buildPythonPackage, fetchFromGitHub, pythonOlder
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "html2text";
+  version = "2020.1.16";
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "Alir3z4";
+    repo = pname;
+    rev = version;
+    sha256 = "1y924clp2hiqg3a9437z808p29mqcx537j5fmz71plx8qrcm5jf9";
+  };
+
+  # python setup.py test is broken, use pytest
+  checkInputs = [ pytest ];
+  checkPhase = ''
+    pytest
+  '';
+
+  meta = with lib; {
+    description = "Turn HTML into equivalent Markdown-structured text";
+    homepage = "https://github.com/Alir3z4/html2text/";
+    license = licenses.gpl3;
+  };
+}
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..0ceeda045827
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/html5-parser/default.nix
@@ -0,0 +1,22 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, pkgs, pkg-config, chardet, lxml }:
+
+buildPythonPackage rec {
+  pname = "html5-parser";
+  version = "0.4.9";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "25fe8f6848cbc15187f6748c0695df32bcf1b37df6420b6a01b4ebe1ec1ed48f";
+  };
+
+  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..f0abbcfbecce
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/html5lib/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, flake8
+, pytest_4
+, pytest-expect
+, mock
+, six
+, webencodings
+}:
+
+buildPythonPackage rec {
+  pname = "html5lib";
+  version = "1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b2e5b40261e20f354d198eae92afc10d750afb487ed5e50f9c4eaf07c184146f";
+  };
+
+  checkInputs = [ flake8 pytest_4 pytest-expect mock ];
+  propagatedBuildInputs = [
+    six webencodings
+  ];
+
+  checkPhase = ''
+    # remove test causing error
+    # https://github.com/html5lib/html5lib-python/issues/411
+    rm html5lib/tests/test_stream.py
+    py.test
+  '';
+
+  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..ef660fc0b924
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/htmllaundry/default.nix
@@ -0,0 +1,30 @@
+{ lib, stdenv
+, 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..117c7f5e132f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/httmock/default.nix
@@ -0,0 +1,22 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub, requests }:
+
+buildPythonPackage rec {
+  pname   = "httmock";
+  version = "1.3.0";
+
+  src = fetchFromGitHub {
+    owner = "patrys";
+    repo = "httmock";
+    rev = version;
+    sha256 = "1dy7pjq4gz476jcnbbpzk8w8qxr9l8wwgw9x2c7lf6fzsgnf404q";
+  };
+
+  checkInputs = [ requests ];
+
+  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-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_signature/default.nix b/nixpkgs/pkgs/development/python-modules/http_signature/default.nix
new file mode 100644
index 000000000000..145eea751b9b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/http_signature/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+, pycrypto
+}:
+
+buildPythonPackage rec {
+  pname = "http_signature";
+  version = "0.1.4";
+  disabled = isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "14acc192ef20459d5e11b4e800dd3a4542f6bd2ab191bf5717c696bf30936c62";
+  };
+
+  propagatedBuildInputs = [ pycrypto ];
+
+  meta = with lib; {
+    homepage = "https://github.com/atl/py-http-signature";
+    description = "Simple secure signing for HTTP requests using http-signature";
+    license = licenses.mit;
+  };
+
+}
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..b7867e22f175
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/httpauth/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv
+, 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..cbaf89c3ca61
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/httpbin/default.nix
@@ -0,0 +1,34 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, flask
+, flask-limiter
+, markupsafe
+, decorator
+, itsdangerous
+, raven
+, six
+, brotlipy
+}:
+
+buildPythonPackage rec {
+  pname = "httpbin";
+  version = "0.7.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1yldvf3585zcwj4vxvfm4yr9wwlz3pa2mx2pazqz8x8mr687gcyb";
+  };
+
+  propagatedBuildInputs = [ brotlipy flask flask-limiter markupsafe decorator itsdangerous raven six ];
+
+  # No tests
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/kennethreitz/httpbin";
+    description = "HTTP Request & Response Service";
+    license = licenses.mit;
+  };
+}
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..aa15c2555e67
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/httpcore/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, h11
+, h2
+, pproxy
+, pytestCheckHook
+, pytestcov
+, sniffio
+, uvicorn
+}:
+
+buildPythonPackage rec {
+  pname = "httpcore";
+  version = "0.12.0";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "encode";
+    repo = pname;
+    rev = version;
+    sha256 = "0bwxn7m7r7h6k41swxj0jqj3nzi76wqxwbnry6y7d4qfh4m26g2j";
+  };
+
+  propagatedBuildInputs = [
+    h11
+    h2
+    sniffio
+  ];
+
+  checkInputs = [
+    pproxy
+    pytestCheckHook
+    pytestcov
+    uvicorn
+  ];
+
+  pytestFlagsArray = [
+    # these tests fail during dns lookups: httpcore.ConnectError: [Errno -2] Name or service not known
+    "--ignore=tests/sync_tests/test_interfaces.py"
+  ];
+
+  pythonImportsCheck = [ "httpcore" ];
+
+  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/httplib2/default.nix b/nixpkgs/pkgs/development/python-modules/httplib2/default.nix
new file mode 100644
index 000000000000..b23d501f1e53
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/httplib2/default.nix
@@ -0,0 +1,21 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "httplib2";
+  version = "0.18.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "8af66c1c52c7ffe1aa5dc4bcd7c769885254b0756e6e69f953c7f0ab49a70ba3";
+  };
+
+  # Needs setting up
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/httplib2/httplib2";
+    description = "A comprehensive HTTP client library";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/httpretty/0.nix b/nixpkgs/pkgs/development/python-modules/httpretty/0.nix
new file mode 100644
index 000000000000..92ed5c6616e0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/httpretty/0.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, tornado
+, requests
+, httplib2
+, sure
+, nose
+, nose-exclude
+, coverage
+, rednose
+, nose-randomly
+, six
+, mock
+}:
+
+buildPythonPackage rec {
+  pname = "httpretty";
+  version = "0.9.7";
+
+  # 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 = "66216f26b9d2c52e81808f3e674a6fb65d4bf719721394a1a9be926177e55fbe";
+  };
+
+  propagatedBuildInputs = [ six ];
+
+  checkInputs = [ nose sure coverage mock rednose
+    # Following not declared in setup.py
+    nose-randomly requests tornado httplib2 nose-exclude
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  # Those flaky tests are failing intermittently on all platforms
+  NOSE_EXCLUDE = lib.concatStringsSep "," [
+    "tests.functional.test_httplib2.test_callback_response"
+    "tests.functional.test_requests.test_streaming_responses"
+    "tests.functional.test_httplib2.test_callback_response"
+    "tests.functional.test_requests.test_httpretty_should_allow_adding_and_overwritting_by_kwargs_u2"
+  ];
+
+  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/httpretty/default.nix b/nixpkgs/pkgs/development/python-modules/httpretty/default.nix
new file mode 100644
index 000000000000..8974672d0a93
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/httpretty/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, tornado
+, requests
+, httplib2
+, sure
+, nose
+, nose-exclude
+, coverage
+, rednose
+, nose-randomly
+, six
+, mock
+, eventlet
+, pytest
+, freezegun
+}:
+
+buildPythonPackage rec {
+  pname = "httpretty";
+  version = "1.0.3";
+
+  # 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 = "9335cbd8f38745e0e2dc4755d8932a77d378d93e15804969504b1e6b568d613c";
+  };
+
+  propagatedBuildInputs = [ six ];
+
+  checkInputs = [ nose sure coverage mock rednose pytest
+    # Following not declared in setup.py
+    nose-randomly requests tornado httplib2 nose-exclude freezegun
+  ];
+
+  checkPhase = ''
+    nosetests tests/unit # functional tests cause trouble requiring /etc/protocol
+  '';
+
+  __darwinAllowLocalNetworking = true;
+
+  # Those flaky tests are failing intermittently on all platforms
+  NOSE_EXCLUDE = lib.concatStringsSep "," [
+    "tests.functional.test_httplib2.test_callback_response"
+    "tests.functional.test_requests.test_streaming_responses"
+    "tests.functional.test_httplib2.test_callback_response"
+    "tests.functional.test_requests.test_httpretty_should_allow_adding_and_overwritting_by_kwargs_u2"
+  ];
+
+  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..30c918d86feb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/httpsig/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools_scm
+, pycryptodome
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "httpsig";
+  version = "1.3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1rkc3zwsq53rjsmc47335m4viljiwdbmw3y2zry4z70j8q1dbmki";
+  };
+
+  buildInputs = [ setuptools_scm ];
+  propagatedBuildInputs = [ pycryptodome requests ];
+
+  # Jailbreak pycryptodome
+  preBuild = ''
+    substituteInPlace setup.py --replace "==3.4.7" ""
+  '';
+
+  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..ed25195e3f28
--- /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.1.1";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "41b573cf33f64a8f8f3400d0a7faf48e1888582b6f6e02b82b9bd4f0bf7497ce";
+  };
+
+  # 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/default.nix b/nixpkgs/pkgs/development/python-modules/httpx/default.nix
new file mode 100644
index 000000000000..6e81cc92193c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/httpx/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, brotli
+, certifi
+, h2
+, httpcore
+, rfc3986
+, sniffio
+, pytestCheckHook
+, pytest-asyncio
+, pytest-trio
+, pytestcov
+, trustme
+, uvicorn
+}:
+
+buildPythonPackage rec {
+  pname = "httpx";
+  version = "0.16.1";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "encode";
+    repo = pname;
+    rev = version;
+    sha256 = "00gmq45fckcqkj910bvd7pyqz1mvgsdvz4s0k7dzbnc5czzq1f4a";
+  };
+
+  propagatedBuildInputs = [
+    brotli
+    certifi
+    h2
+    httpcore
+    rfc3986
+    sniffio
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    pytest-asyncio
+    pytest-trio
+    pytestcov
+    trustme
+    uvicorn
+  ];
+
+  pythonImportsCheck = [ "httpx" ];
+
+  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"
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  meta = with lib; {
+    description = "The next generation HTTP client";
+    homepage = "https://github.com/encode/httpx";
+    license = licenses.bsd3;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..28a801de71a6
--- /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.2.0";
+
+  src = fetchFromGitHub {
+    owner = "coleifer";
+    repo = pname;
+    rev = version;
+    sha256 = "1hgic7qrmb1kxvfgf2qqiw39nqyknf17pjvli8jfzvd9mv7cb7hh";
+  };
+
+  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..872798c6ced8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hug/default.nix
@@ -0,0 +1,52 @@
+{ 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;
+  };
+
+}
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..49cb31b7d030
--- /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 = "8.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "bf52ec91244819c780341a3438d5d7b09f431d3f113a475147ac9b7b167a3d12";
+  };
+
+  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..09e94f6275dd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/humanize/default.nix
@@ -0,0 +1,32 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, mock
+, setuptools_scm
+}:
+
+buildPythonPackage rec {
+  version = "3.1.0";
+  pname = "humanize";
+  disabled = isPy27; # setup.py no longer compatible
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "fd3eb915310335c63a54d4507289ecc7b3a7454cd2c22ac5086d061a3cbfd592";
+  };
+
+  nativeBuildInputs = [ setuptools_scm ];
+  checkInputs = [ mock ];
+
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Python humanize utilities";
+    homepage = "https://github.com/jmoiron/humanize";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+    platforms = platforms.unix;
+  };
+
+}
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..1fe5ab7153d3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hupper/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi
+, pytest, pytestcov, watchdog, mock
+}:
+
+buildPythonPackage rec {
+  pname = "hupper";
+  version = "1.10.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "3818f53dabc24da66f65cf4878c1c7a9b5df0c46b813e014abdd7c569eb9a02a";
+  };
+
+  checkPhase = ''
+    py.test
+  '';
+
+  # 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 = [ pytest pytestcov mock ] ++ lib.optional (!stdenv.isDarwin) watchdog;
+}
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..9ce859c9b760
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hvac/default.nix
@@ -0,0 +1,22 @@
+{ lib, buildPythonPackage, fetchPypi, requests, six }:
+
+buildPythonPackage rec {
+  pname = "hvac";
+  version = "0.10.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b0561dbdfecc6a6d7b0cc226d75a800ae9bbc93313a6ad526a1adc97be51eada";
+  };
+
+  propagatedBuildInputs = [ requests six ];
+
+  # Requires running a Vault server
+  doCheck = false;
+
+  meta = with lib; {
+    description = "HashiCorp Vault API client";
+    homepage = "https://github.com/ianunruh/hvac";
+    license = licenses.asl20;
+  };
+}
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..aaad8f2b1dec
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hvplot/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, bokeh
+, holoviews
+, pandas
+, pytest
+, parameterized
+, nbsmoke
+, flake8
+, coveralls
+, xarray
+, networkx
+, streamz
+, colorcet
+, pythonImportsCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "hvplot";
+  version = "0.7.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1c709bebb737ebd71a0433f2333ed15f03dd3c431d4646c41c2b9fcbae4a29b7";
+  };
+
+  nativeBuildInputs = [
+    pythonImportsCheckHook
+  ];
+
+  checkInputs = [ pytest parameterized nbsmoke flake8 coveralls xarray networkx streamz ];
+  propagatedBuildInputs = [
+    bokeh
+    colorcet
+    holoviews
+    pandas
+  ];
+
+  preCheck = ''
+    export HOME=$(mktemp -d)
+  '';
+
+  # 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 = [ 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..7c34235a190b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hwi/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, bitbox02
+, ecdsa
+, hidapi
+, libusb1
+, mnemonic
+, pyaes
+, pythonAtLeast
+}:
+
+buildPythonPackage rec {
+  pname = "hwi";
+  version = "1.2.1";
+  disabled = pythonAtLeast "3.9";
+
+  src = fetchFromGitHub {
+    owner = "bitcoin-core";
+    repo = "HWI";
+    rev = version;
+    sha256 = "0fs3152lw7y5l9ssr5as8gd739m9lb7wxpv1vc5m77k5nw7l8ax5";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "'ecdsa>=0.13.0,<0.14.0'" "'ecdsa'" \
+      --replace "'hidapi>=0.7.99,<0.8.0'" "'hidapi'" \
+      --replace "'mnemonic>=0.18.0,<0.19.0'" "'mnemonic'"
+  '';
+
+  propagatedBuildInputs = [
+    bitbox02
+    ecdsa
+    hidapi
+    libusb1
+    mnemonic
+    pyaes
+  ];
+
+  # tests require to clone quite a few firmwares
+  doCheck = false;
+
+  pythonImportsCheck = [ "hwilib" ];
+
+  meta = {
+    description = "Bitcoin Hardware Wallet Interface";
+    homepage = "https://github.com/bitcoin-core/hwi";
+    license = with lib.licenses; [ mit ];
+    maintainers = with lib.maintainers; [ prusnak ];
+  };
+}
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..7316a6fc971d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hydra-check/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, docopt
+, requests
+, beautifulsoup4
+, black
+, mypy
+, flake8
+}:
+
+buildPythonPackage rec {
+  pname = "hydra-check";
+  version = "1.1.1";
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "nix-community";
+    repo = "hydra-check";
+    rev = version;
+    sha256 = "1dmsscsib8ckp496gsfqxmq8d35zs71n99xmziq9iprvy7n5clq2";
+  };
+
+  propagatedBuildInputs = [
+    docopt
+    requests
+    beautifulsoup4
+  ];
+
+  checkInputs = [ mypy ];
+
+  checkPhase = ''
+    echo -e "\x1b[32m## run mypy\x1b[0m"
+    mypy hydracheck
+  '';
+
+  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 ];
+  };
+}
+
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..42f2812a6e1d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hydra/default.nix
@@ -0,0 +1,29 @@
+{ lib, buildPythonPackage, fetchFromGitHub, isPy27, pytest, omegaconf, pathlib2 }:
+
+buildPythonPackage rec {
+  pname = "hydra";
+  version = "0.11.3";
+
+  src = fetchFromGitHub {
+    owner = "facebookresearch";
+    repo = pname;
+    rev = version;
+    sha256 = "0plbls65qfrvvigza3qvy0pwjzgkz8ylpgb1im14k3b125ny41ad";
+  };
+
+  checkInputs = [ pytest ];
+  propagatedBuildInputs = [ omegaconf ] ++ lib.optional isPy27 pathlib2;
+
+  checkPhase = ''
+    runHook preCheck
+    pytest tests/
+    runHook postCheck
+  '';
+
+  meta = with lib; {
+    description = "A framework for configuring complex applications";
+    homepage = "https://hydra.cc";
+    license = licenses.mit;
+    maintainers = with maintainers; [ bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hydrawiser/default.nix b/nixpkgs/pkgs/development/python-modules/hydrawiser/default.nix
new file mode 100644
index 000000000000..feccc73707c2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hydrawiser/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-asyncio
+, pytest-cov
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+, 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..8337fd2230ba
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hypchat/default.nix
@@ -0,0 +1,14 @@
+{ buildPythonPackage, fetchPypi
+, requests, six, dateutil }:
+
+buildPythonPackage rec {
+  pname = "hypchat";
+  version = "0.21";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1sd8f3gihagaqd848dqy6xw457fa4f9bla1bfyni7fq3h76sjdzg";
+  };
+
+  propagatedBuildInputs = [ requests six dateutil ];
+}
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..a74198f38321
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hyperframe/default.nix
@@ -0,0 +1,19 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, pytestCheckHook }:
+
+buildPythonPackage rec {
+  pname = "hyperframe";
+  version = "6.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "742d2a4bc3152a340a49d59f32e33ec420aa8e7054c1444ef5c7efff255842f1";
+  };
+
+  checkInputs = [ pytestCheckHook ];
+
+  meta = with lib; {
+    description = "HTTP/2 framing layer for Python";
+    homepage = "http://hyper.rtfd.org/";
+    license = licenses.mit;
+  };
+}
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..bab7986eda22
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hyperlink/default.nix
@@ -0,0 +1,21 @@
+{ lib, buildPythonPackage, fetchPypi, isPy27, idna, typing }:
+
+buildPythonPackage rec {
+  pname = "hyperlink";
+  version = "20.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "47fcc7cd339c6cb2444463ec3277bdcfe142c8b1daf2160bdd52248deec815af";
+  };
+
+  propagatedBuildInputs = [ idna ]
+    ++ lib.optionals isPy27 [ typing ];
+
+  meta = with lib; {
+    description = "A featureful, correct URL for Python";
+    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..ba4aeef402ec
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hyperopt/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv, fetchPypi, buildPythonPackage
+, cloudpickle, numpy, future, networkx
+, six, tqdm, scipy, pymongo
+}:
+
+buildPythonPackage rec {
+  pname = "hyperopt";
+  version = "0.2.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "bc6047d50f956ae64eebcb34b1fd40f186a93e214957f20e87af2f10195295cc";
+  };
+
+  propagatedBuildInputs = [ future cloudpickle numpy networkx six tqdm scipy pymongo ];
+
+  # 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.com/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/2.nix b/nixpkgs/pkgs/development/python-modules/hypothesis/2.nix
new file mode 100644
index 000000000000..5b086d5f1a7f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hypothesis/2.nix
@@ -0,0 +1,45 @@
+{ lib, buildPythonPackage, fetchFromGitHub
+, isPy3k, attrs, coverage, enum34, pexpect
+, doCheck ? true, pytest, pytest_xdist, flaky, mock
+, sortedcontainers
+}:
+buildPythonPackage rec {
+  # https://hypothesis.readthedocs.org/en/latest/packaging.html
+
+  # Hypothesis has optional dependencies on the following libraries
+  # pytz fake_factory django numpy pytest
+  # If you need these, you can just add them to your environment.
+
+  version = "4.57.1";
+  pname = "hypothesis";
+
+  # Use github tarballs that includes tests
+  src = fetchFromGitHub {
+    owner = "HypothesisWorks";
+    repo = "hypothesis-python";
+    rev = "hypothesis-python-${version}";
+    sha256 = "1qcpcrk6892hzyjsdr581pw6i4fj9035nv89mcjrcrzcmycdlfds";
+  };
+
+  postUnpack = "sourceRoot=$sourceRoot/hypothesis-python";
+
+  propagatedBuildInputs = [
+    attrs
+    coverage
+    sortedcontainers
+  ] ++ lib.optional (!isPy3k) enum34;
+
+  checkInputs = [ pytest pytest_xdist flaky mock pexpect ];
+  inherit doCheck;
+
+  checkPhase = ''
+    rm tox.ini # This file changes how py.test runs and breaks it
+    py.test tests/cover
+  '';
+
+  meta = with lib; {
+    description = "A Python library for property based testing";
+    homepage = "https://github.com/HypothesisWorks/hypothesis";
+    license = licenses.mpl20;
+  };
+}
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..dac4ca43fc91
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hypothesis/default.nix
@@ -0,0 +1,45 @@
+{ lib, buildPythonPackage, fetchFromGitHub
+, isPy3k, attrs, coverage, enum34, pexpect
+, doCheck ? true, pytest, pytest_xdist, flaky, mock
+, sortedcontainers
+}:
+buildPythonPackage rec {
+  # https://hypothesis.readthedocs.org/en/latest/packaging.html
+
+  # Hypothesis has optional dependencies on the following libraries
+  # pytz fake_factory django numpy pytest
+  # If you need these, you can just add them to your environment.
+
+  version = "5.30.0";
+  pname = "hypothesis";
+
+  # Use github tarballs that includes tests
+  src = fetchFromGitHub {
+    owner = "HypothesisWorks";
+    repo = "hypothesis-python";
+    rev = "hypothesis-python-${version}";
+    sha256 = "0fmc4jfaksr285fjhp18ibj2rr8cxmbd0pwx370r5wf8jnhm6jb3";
+  };
+
+  postUnpack = "sourceRoot=$sourceRoot/hypothesis-python";
+
+  propagatedBuildInputs = [
+    attrs
+    coverage
+    sortedcontainers
+  ] ++ lib.optional (!isPy3k) enum34;
+
+  checkInputs = [ pytest pytest_xdist flaky mock pexpect ];
+  inherit doCheck;
+
+  checkPhase = ''
+    rm tox.ini # This file changes how py.test runs and breaks it
+    py.test tests/cover
+  '';
+
+  meta = with lib; {
+    description = "A Python library for property based testing";
+    homepage = "https://github.com/HypothesisWorks/hypothesis";
+    license = licenses.mpl20;
+  };
+}
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..5b2869e10d19
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hyppo/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, isPy27
+, fetchFromGitHub
+, pytestCheckHook , pytestcov , numba
+, numpy
+, scikitlearn
+, scipy
+}:
+
+buildPythonPackage rec {
+  pname = "hyppo";
+  version = "0.1.3";
+
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "neurodata";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0qdnb1l4hz4dgwhapz1fp9sb2vxxvr8h2ngsbvyf50h3kapcn19r";
+  };
+
+  propagatedBuildInputs = [
+    numba
+    numpy
+    scikitlearn
+    scipy
+  ];
+
+  checkInputs = [ pytestCheckHook pytestcov ];
+  pytestFlagsArray = [ "--ignore=docs" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/neurodata/hyppo";
+    description = "Indepedence testing in Python";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ bcdarwin ];
+  };
+}
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..4dea7526b7e7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/i3-py/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv
+, 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..c27d41354112
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/i3ipc/default.nix
@@ -0,0 +1,41 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub
+, xorgserver, pytest, pytest-xvfb, i3, python, 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/ibis-framework/default.nix b/nixpkgs/pkgs/development/python-modules/ibis-framework/default.nix
new file mode 100644
index 000000000000..1627159e6fbd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ibis-framework/default.nix
@@ -0,0 +1,65 @@
+{ lib, buildPythonPackage, fetchPypi, fetchpatch, isPy27, pythonAtLeast
+, graphviz
+, multipledispatch
+, numpy
+, pandas
+, pyarrow
+, pytest
+, pytz
+, regex
+, requests
+, sqlalchemy
+, tables
+, toolz
+}:
+
+buildPythonPackage rec {
+  pname = "ibis-framework";
+  version = "1.3.0";
+  disabled = isPy27 || pythonAtLeast "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1my94a11jzg1hv6ln8wxklbqrg6z5l2l77vr89aq0829yyxacmv7";
+  };
+
+  patches = [
+    # fix tests for pandas 1.1
+    (fetchpatch {
+      url = "https://github.com/ibis-project/ibis/commit/53ef3cefc4ae90d61f3612310cb36da2bcd11305.diff";
+      sha256 = "1i5yjmqridjqpggiinsjaz5spcxca5bd48vy7a0mj4mm1b5flw2m";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    multipledispatch
+    numpy
+    pandas
+    pytz
+    regex
+    toolz
+    sqlalchemy
+    requests
+    graphviz
+    tables
+    pyarrow
+  ];
+
+  checkInputs = [
+    pytest
+  ];
+
+  # ignore tests which require test dataset, or frameworks not available
+  checkPhase = ''
+    pytest ibis \
+      --ignore=ibis/tests/all \
+      --ignore=ibis/{sql,spark}
+  '';
+
+  meta = with lib; {
+    description = "Productivity-centric Python Big Data Framework";
+    homepage = "https://github.com/ibis-project/ibis";
+    license = licenses.asl20;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..2d4a19107ce6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ibis/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, python
+, isPy27
+}:
+
+buildPythonPackage rec {
+  pname = "ibis";
+  version = "1.6.0";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "dmulholl";
+    repo = pname;
+    rev = version;
+    sha256 = "0xqhk397gzanvj2znwcgy4n5l1lc9r310smxkhjbm1xwvawpixx0";
+  };
+
+  checkPhase = ''
+    ${python.interpreter} test_ibis.py
+  '';
+
+  meta = with lib; {
+    description = "A lightweight template engine";
+    homepage = "https://github.com/dmulholland/ibis";
+    license = licenses.publicDomain;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..4499d5d62f4f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/icalendar/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, setuptools
+, dateutil
+, pytz
+}:
+
+buildPythonPackage rec {
+  version = "4.0.7";
+  pname = "icalendar";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0fc18d87f66e0b5da84fa731389496cfe18e4c21304e8f6713556b2e8724a7a4";
+  };
+
+  buildInputs = [ setuptools ];
+  propagatedBuildInputs = [ 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..eba5a70577f7
--- /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.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "16kpixl43nrn093cvkmxiq2dzd9xc73zwzkmwp0rs7x01nji8kj3";
+  };
+
+  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..b89df0bd2ce0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/icmplib/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pbr
+, pythonOlder
+, requests
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "icmplib";
+  version = "2.0.1";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "ValentinBELYN";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0vps4iz87f8l0z3va92srsx5v19nnd65c22hvbgvhag3vhqsxg7h";
+  };
+
+  propagatedBuildInputs = [
+    pbr
+    six
+    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/ics/default.nix b/nixpkgs/pkgs/development/python-modules/ics/default.nix
new file mode 100644
index 000000000000..c186020fee1e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ics/default.nix
@@ -0,0 +1,40 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub, pythonOlder
+, tatsu, arrow
+, pytestCheckHook, pytest-flakes
+}:
+
+buildPythonPackage rec {
+  pname = "ics";
+  version = "0.7";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "C4ptainCrunch";
+    repo = "ics.py";
+    rev = "v${version}";
+    sha256 = "0rrdc9rcxc3ys6rml81b8m8qdlisk78a34bdib0wy65hlkmyyykn";
+  };
+
+  propagatedBuildInputs = [ tatsu arrow ];
+
+  postPatch = ''
+    substituteInPlace requirements.txt \
+      --replace "arrow>=0.11,<0.15" "arrow"
+    substituteInPlace setup.cfg --replace "--pep8" ""
+  '';
+
+  checkInputs = [ pytestCheckHook pytest-flakes ];
+
+  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/C4ptainCrunch/ics.py/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ primeos ];
+  };
+
+}
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..f3b8393a2759
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/identify/default.nix
@@ -0,0 +1,20 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "identify";
+  version = "1.5.13";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "70b638cf4743f33042bebb3b51e25261a0a10e80f978739f17e7fd4837664a66";
+  };
+
+  # Tests not included in PyPI tarball
+  doCheck = false;
+
+  meta = with lib; {
+    description = "File identification library for Python";
+    homepage = "https://github.com/chriskuehl/identify";
+    license = licenses.mit;
+  };
+}
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..613fde773a71
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/idna/default.nix
@@ -0,0 +1,20 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "idna";
+  version = "2.10";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6";
+  };
+
+  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..47997dbdc265
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ifaddr/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, ipaddress
+, python
+}:
+
+buildPythonPackage rec {
+  version = "0.1.7";
+  pname = "ifaddr";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1f9e8a6ca6f16db5a37d3356f07b6e52344f6f9f7e806d618537731669eb1a94";
+  };
+
+  propagatedBuildInputs = [ ipaddress ];
+
+  checkPhase = ''
+   ${python.interpreter} -m unittest discover
+  '';
+
+  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..bdfd3767f8c4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ifconfig-parser/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv, 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..75d1c4d77405
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ifcopenshell/default.nix
@@ -0,0 +1,67 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, substituteAll
+, python
+, gcc10
+, cmake
+, boost172
+, icu
+, swig
+, pcre
+, opencascade-occt
+, opencollada
+, libxml2
+}:
+
+buildPythonPackage rec {
+  pname = "ifcopenshell";
+  version = "0.6.0b0";
+  format = "other";
+
+  src = fetchFromGitHub {
+    owner  = "IfcOpenShell";
+    repo   = "IfcOpenShell";
+    rev    = "v${version}";
+    fetchSubmodules = true;
+    sha256 = "1ad1s9az41z2f46rbi1jnr46mgc0q4h5kz1jm9xdlwifqv9y04g1";
+  };
+
+  patches = [
+    (substituteAll {
+      name = "site-packages.patch";
+      src = ./site-packages.patch;
+      site_packages = "lib/${python.libPrefix}/site-packages";
+    })
+  ];
+
+  nativeBuildInputs = [ gcc10 cmake ];
+
+  buildInputs = [
+    boost172
+    icu
+    pcre
+    libxml2
+  ];
+
+  preConfigure = ''
+    cd cmake
+  '';
+
+  cmakeFlags = [
+    "-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/${if stdenv.isDarwin then "libxml2.dylib" else "libxml2.so"}"
+  ];
+
+  meta = with lib; {
+    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/ifcopenshell/site-packages.patch b/nixpkgs/pkgs/development/python-modules/ifcopenshell/site-packages.patch
new file mode 100644
index 000000000000..e61fe2056f7b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ifcopenshell/site-packages.patch
@@ -0,0 +1,32 @@
+--- a/src/ifcwrap/CMakeLists.txt
++++ b/src/ifcwrap/CMakeLists.txt
+@@ -68,26 +68,17 @@ endif()
+ # directory in which the wrapper can be installed.
+ FIND_PACKAGE(PythonInterp)
+ IF(PYTHONINTERP_FOUND AND NOT "${PYTHON_EXECUTABLE}" STREQUAL "")
+-    EXECUTE_PROCESS(
+-        COMMAND ${PYTHON_EXECUTABLE} -c "import sys; from distutils.sysconfig import get_python_lib; sys.stdout.write(get_python_lib(1))"
+-        OUTPUT_VARIABLE python_package_dir
+-    )
+-
+-    IF("${python_package_dir}" STREQUAL "")
+-        MESSAGE(WARNING "Unable to locate Python site-package directory, unable to install the Python wrapper")
+-    ELSE()
+         FILE(GLOB_RECURSE sourcefiles "${CMAKE_CURRENT_SOURCE_DIR}/../ifcopenshell-python/ifcopenshell/*.py")
+         FOREACH(file ${sourcefiles})
+             FILE(RELATIVE_PATH relative "${CMAKE_CURRENT_SOURCE_DIR}/../ifcopenshell-python/ifcopenshell/" "${file}")
+             GET_FILENAME_COMPONENT(dir "${relative}" DIRECTORY)
+ 			INSTALL(FILES "${file}"
+-                    DESTINATION "${python_package_dir}/ifcopenshell/${dir}")
++                    DESTINATION "@site_packages@/ifcopenshell/${dir}")
+         ENDFOREACH()
+         INSTALL(FILES "${CMAKE_BINARY_DIR}/ifcwrap/ifcopenshell_wrapper.py"
+-                DESTINATION "${python_package_dir}/ifcopenshell")
++                DESTINATION "@site_packages@/ifcopenshell")
+         INSTALL(TARGETS _ifcopenshell_wrapper
+-                DESTINATION "${python_package_dir}/ifcopenshell")
+-    ENDIF()
++                DESTINATION "@site_packages@/ifcopenshell")
+ ELSE()
+     MESSAGE(WARNING "No Python interpreter found, unable to install the Python wrapper")
+ ENDIF()
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..307c25e724ee
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ignite/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pytest_xdist
+, pythonOlder
+, matplotlib
+, mock
+, pytorch
+, pynvml
+, scikitlearn
+, tqdm
+}:
+
+buildPythonPackage rec {
+  pname = "ignite";
+  version = "0.4.2";
+
+  src = fetchFromGitHub {
+    owner = "pytorch";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "00vcmhnp14s54g386izgaxzrdr2nqv3pz9nvpyiwrn33zawr308z";
+  };
+
+  checkInputs = [ pytestCheckHook matplotlib mock pytest_xdist ];
+  propagatedBuildInputs = [ pytorch scikitlearn tqdm pynvml ];
+
+  # 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_trains_logger.py"
+    "--ignore=tests/ignite/metrics/test_dill.py"
+    "--ignore=tests/ignite/metrics/test_ssim.py"
+    "tests/"
+  ];
+
+  # disable tests which need specific packages
+  disabledTests = [
+    "idist"
+    "tensorboard"
+    "mlflow"
+    "trains"
+    "visdom"
+    "test_setup_neptune"
+    "test_output_handler" # needs mlflow
+    "test_integration"
+    "test_pbar" # slight output differences
+    "test_write_results"
+    "test_setup_plx"
+  ];
+
+  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/ihatemoney/default.nix b/nixpkgs/pkgs/development/python-modules/ihatemoney/default.nix
new file mode 100644
index 000000000000..3e36b4dd8e2d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ihatemoney/default.nix
@@ -0,0 +1,138 @@
+{ buildPythonPackage, lib, fetchFromGitHub, isPy27, nixosTests, fetchpatch, fetchPypi
+, alembic
+, aniso8601
+, Babel
+, blinker
+, click
+, dnspython
+, email_validator
+, flask
+, flask-babel
+, flask-cors
+, flask_mail
+, flask_migrate
+, flask-restful
+, flask_script
+, flask_sqlalchemy
+, flask_wtf
+, debts
+, idna
+, itsdangerous
+, jinja2
+, Mako
+, markupsafe
+, python-dateutil
+, pytz
+, six
+, sqlalchemy
+, sqlalchemy-continuum
+, werkzeug
+, wtforms
+, psycopg2 # optional, for postgresql support
+, flask_testing
+, pytestCheckHook
+}:
+
+# ihatemoney is not really a library. It will only ever be imported
+# by the interpreter of uwsgi. So overrides for its depencies are fine.
+let
+  # https://github.com/spiral-project/ihatemoney/issues/567
+  pinned_wtforms = wtforms.overridePythonAttrs (old: rec {
+    pname = "WTForms";
+    version = "2.2.1";
+    src = fetchPypi {
+      inherit pname version;
+      sha256 = "0q9vkcq6jnnn618h27lx9sas6s9qlg2mv8ja6dn0hy38gwzarnqc";
+    };
+  });
+  pinned_flask_wtf = flask_wtf.override { wtforms = pinned_wtforms; };
+in
+
+buildPythonPackage rec {
+  pname = "ihatemoney";
+  version = "4.2";
+
+  src = fetchFromGitHub {
+    owner = "spiral-project";
+    repo = pname;
+    rev = version;
+    sha256 = "0d4vc6m0jkwlz9ly0hcjghccydvqbldh2jb8yzf94jrgkd5fd7k1";
+  };
+
+  disabled = isPy27;
+
+  patches = [
+    # fix migration on postgresql
+    # remove on next release
+    (fetchpatch {
+      url = "https://github.com/spiral-project/ihatemoney/commit/6129191b26784b895e203fa3eafb89cee7d88b71.patch";
+      sha256 = "0yc24gsih9x3pnh2mhj4v5i71x02dq93a9jd2r8b1limhcl4p1sw";
+    })
+    (fetchpatch {
+      name = "CVE-2020-15120.patch";
+      url = "https://github.com/spiral-project/ihatemoney/commit/8d77cf5d5646e1d2d8ded13f0660638f57e98471.patch";
+      sha256 = "0y855sk3qsbpq7slj876k2ifa1lccc2dccag98pkyaadpz5gbabv";
+    })
+  ];
+
+  postPatch = ''
+    # remove draconian pinning
+    sed -i 's/==.*$//' setup.cfg
+  '';
+
+  propagatedBuildInputs = [
+    alembic
+    aniso8601
+    Babel
+    blinker
+    click
+    dnspython
+    email_validator
+    flask
+    flask-babel
+    flask-cors
+    flask_mail
+    flask_migrate
+    flask-restful
+    flask_script
+    flask_sqlalchemy
+    pinned_flask_wtf
+    idna
+    itsdangerous
+    jinja2
+    Mako
+    markupsafe
+    python-dateutil
+    pytz
+    six
+    sqlalchemy
+    sqlalchemy-continuum
+    werkzeug
+    pinned_wtforms
+    psycopg2
+    debts
+  ];
+
+  checkInputs = [
+    flask_testing pytestCheckHook
+  ];
+
+  pytestFlagsArray = [ "--pyargs ihatemoney.tests.tests" ];
+  disabledTests = [
+    "test_notifications"  # requires running service.
+    "test_invite"         # requires running service.
+  ];
+
+  passthru.tests = {
+    inherit (nixosTests.ihatemoney) ihatemoney-postgresql ihatemoney-sqlite;
+  };
+
+  meta = with lib; {
+    homepage = "https://ihatemoney.org";
+    description = "A simple shared budget manager web application";
+    license = licenses.beerware;
+    maintainers = [ 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..a82a20ca7c8a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ijson/default.nix
@@ -0,0 +1,20 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "ijson";
+  version = "3.1.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d29977f7235b5bf83c372825c6abd8640ba0e3a8e031d3ffc3b63deaf6ae1487";
+  };
+
+  doCheck = false; # something about yajl
+
+  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/image-match/default.nix b/nixpkgs/pkgs/development/python-modules/image-match/default.nix
new file mode 100644
index 000000000000..5c1953d6ac3f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/image-match/default.nix
@@ -0,0 +1,34 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub, pytestrunner, scikitimage }:
+
+buildPythonPackage {
+  pname = "image-match";
+  version = "1.1.2";
+
+  src = fetchFromGitHub {
+    owner = "ascribe";
+    repo = "image-match";
+    rev = "1c5f3170555540bdf43ff8b8189c4e8c13a8b950";
+    sha256 = "0vlmpidmhkpgdzw2k03x5layhijcrjpmyfd93yv2ls77ihz00ix5";
+  };
+
+  buildInputs = [ pytestrunner ];
+
+  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;
+
+  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..861a0ed0db3d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/imagecodecs-lite/default.nix
@@ -0,0 +1,38 @@
+{ 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; {
+    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..65c1cfd020a8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/imagecorruptions/default.nix
@@ -0,0 +1,35 @@
+{ buildPythonPackage
+, fetchPypi
+, numpy
+, scikitimage
+, lib, stdenv
+, 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
+  ];
+
+  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..db59ba70bb26
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/imageio-ffmpeg/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "imageio-ffmpeg";
+  version = "0.4.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "13b05b17a941a9f4a90b16910b1ffac159448cff051a153da8ba4b4343ffa195";
+  };
+  patches = [ (fetchpatch {
+    # Fixes compatibility with python3.9
+    # Should be included in the next release after 0.4.2
+    url = "https://github.com/imageio/imageio-ffmpeg/pull/43/commits/b90c39fe3d29418d67d953588ed9fdf4d848f811.patch";
+    sha256 = "0d9kf4w6ldwag3s2dr9zjin6wrj66fnl4fn8379ci4q4qfsqgx3f";
+  })];
+
+  disabled = !isPy3k;
+
+  # No test infrastructure in repository.
+  doCheck = false;
+
+  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/default.nix b/nixpkgs/pkgs/development/python-modules/imageio/default.nix
new file mode 100644
index 000000000000..71f7eae9c32f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/imageio/default.nix
@@ -0,0 +1,55 @@
+{ lib, stdenv
+, buildPythonPackage
+, isPy27
+, pathlib
+, fetchPypi
+, pillow
+, psutil
+, imageio-ffmpeg
+, pytest
+, numpy
+, isPy3k
+, ffmpeg_3
+, futures
+, enum34
+}:
+
+buildPythonPackage rec {
+  pname = "imageio";
+  version = "2.9.0";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    sha256 = "52ddbaeca2dccf53ba2d6dec5676ca7bc3b2403ef8b37f7da78b7654bb3e10f0";
+    inherit pname version;
+  };
+
+  checkInputs = [ pytest psutil ] ++ lib.optionals isPy3k [
+    imageio-ffmpeg ffmpeg_3
+    ];
+  propagatedBuildInputs = [ numpy pillow ];
+
+  checkPhase = ''
+    export IMAGEIO_USERDIR="$TMP"
+    export IMAGEIO_NO_INTERNET="true"
+    export HOME="$(mktemp -d)"
+    py.test
+  '';
+
+  # For some reason, importing imageio also imports xml on Nix, see
+  # https://github.com/imageio/imageio/issues/395
+
+  # Also, there are tests that test the downloading of ffmpeg if it's not installed.
+  # "Uncomment" those by renaming.
+  postPatch = ''
+    substituteInPlace tests/test_meta.py --replace '"urllib",' "\"urllib\",\"xml\","
+    substituteInPlace tests/test_ffmpeg.py --replace 'test_get_exe_installed' 'get_exe_installed'
+  '';
+
+  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;
+  };
+
+}
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..cd48f54ee8f4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/imagesize/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "imagesize";
+  version = "1.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b1f6b5a4eab1f73479a50fb79fcf729514a900c341d8503d62a62dbc4127a2b1";
+  };
+
+  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..59eb3afaa0ec
--- /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/imapclient/default.nix b/nixpkgs/pkgs/development/python-modules/imapclient/default.nix
new file mode 100644
index 000000000000..c091f53b8d4f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/imapclient/default.nix
@@ -0,0 +1,35 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, mock
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "IMAPClient";
+  version = "2.1.0";
+
+  src = fetchFromGitHub {
+    owner = "mjs";
+    repo = "imapclient";
+    rev = version;
+    sha256 = "1zc8qj8ify2zygbz255b6fcg7jhprswf008ccwjmbrnj08kh9l4x";
+  };
+
+  # fix test failing in python 36
+  postPatch = ''
+    substituteInPlace tests/test_imapclient.py \
+      --replace "if sys.version_info >= (3, 7):" "if sys.version_info >= (3, 6, 4):"
+  '';
+
+  propagatedBuildInputs = [ six ];
+
+  checkInputs = [ mock ];
+
+  meta = with lib; {
+    homepage = "https://imapclient.readthedocs.io";
+    description = "Easy-to-use, Pythonic and complete IMAP client library";
+    license = licenses.bsd3;
+    maintainers = [ maintainers.almac ];
+  };
+}
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..1825e1a40d8d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/imaplib2/default.nix
@@ -0,0 +1,22 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "imaplib2";
+  version = "2.45.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a35b6d88258696e80aabecfb784e08730b8558fcaaa3061ff2c7f8637afbd0b3";
+  };
+
+  # No tests on PyPI and no tags on GitHub :(
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A threaded Python IMAP4 client";
+    homepage = "https://github.com/bcoe/imaplib2";
+    # See https://github.com/bcoe/imaplib2/issues/25
+    license = licenses.psfl;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/imbalanced-learn/0.4.nix b/nixpkgs/pkgs/development/python-modules/imbalanced-learn/0.4.nix
new file mode 100644
index 000000000000..fe21096d635d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/imbalanced-learn/0.4.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, scikitlearn, pandas, nose, pytest }:
+
+buildPythonPackage rec {
+  pname = "imbalanced-learn";
+  version = "0.4.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "5bd9e86e40ce4001a57426541d7c79b18143cbd181e3330c1a3e5c5c43287083";
+  };
+
+  propagatedBuildInputs = [ scikitlearn ];
+  checkInputs = [ nose pytest pandas ];
+  checkPhase = ''
+    export HOME=$PWD
+    # skip some tests that fail because of minimal rounding errors
+    # or large dependencies
+    py.test imblearn -k 'not classification \
+                         and not _generator \
+                         and not _forest \
+                         and not wrong_memory'
+  '';
+
+  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;
+  };
+}
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..4253ed30e415
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/imbalanced-learn/default.nix
@@ -0,0 +1,36 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, isPy27
+, pandas
+, pytestCheckHook
+, scikitlearn
+, tensorflow
+}:
+
+buildPythonPackage rec {
+  pname = "imbalanced-learn";
+  version = "0.7.0";
+  disabled = isPy27; # scikit-learn>=0.21 doesn't work on python2
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "da59de0d1c0fa66f62054dd9a0a295a182563aa1abbb3bf9224a3678fcfe8fa4";
+  };
+
+  propagatedBuildInputs = [ scikitlearn ];
+  checkInputs = [ pytestCheckHook pandas ];
+  preCheck = ''
+    export HOME=$TMPDIR
+  '';
+  disabledTests = [
+    "estimator"
+    "classification"
+    "_generator"
+    "show_versions"
+    "test_make_imbalanced_iris"
+  ];
+
+  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;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/imdbpy/default.nix b/nixpkgs/pkgs/development/python-modules/imdbpy/default.nix
new file mode 100644
index 000000000000..dea62f080093
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/imdbpy/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, fetchPypi, lxml, sqlalchemy }:
+
+buildPythonPackage rec {
+  pname = "IMDbPY";
+  version = "2020.9.25";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1p3j9j1jcgbw4626cvgpryhvczy9gzlg0laz6lflgq17m129gin2";
+  };
+
+  patches = [ ./sql_error.patch ]; # Already fixed in master, but not yet in the current release. This can be removed upon the next version update
+
+  propagatedBuildInputs = [ lxml sqlalchemy ];
+
+  doCheck = false; # Tests require networking, and https://github.com/alberanid/imdbpy/issues/240
+  pythonImportsCheck = [ "imdb" ];
+
+  meta = with lib; {
+    homepage = "https://imdbpy.github.io/";
+    description = "A Python package for retrieving and managing the data of the IMDb database";
+    maintainers = [ maintainers.ivar ];
+    license = licenses.gpl2Only;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/imdbpy/sql_error.patch b/nixpkgs/pkgs/development/python-modules/imdbpy/sql_error.patch
new file mode 100644
index 000000000000..10770f4f1135
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/imdbpy/sql_error.patch
@@ -0,0 +1,39 @@
+diff --git a/imdb/parser/sql/__init__.py b/imdb/parser/sql/__init__.py
+index cd4a3e3..3fcfdd4 100644
+--- a/imdb/parser/sql/__init__.py
++++ b/imdb/parser/sql/__init__.py
+@@ -557,7 +557,6 @@ class IMDbSqlAccessSystem(IMDbBase):
+     """The class used to access IMDb's data through a SQL database."""
+
+     accessSystem = 'sql'
+-    _sql_logger = logging.getLogger('imdbpy.parser.sql')
+
+     def __init__(self, uri, adultSearch=True, *arguments, **keywords):
+         """Initialize the access system."""
+@@ -582,7 +581,7 @@ class IMDbSqlAccessSystem(IMDbBase):
+         except ImportError as e:
+             raise IMDbError('unable to import SQLAlchemy')
+         # Set the connection to the database.
+-        self._sql_logger.debug('connecting to %s', uri)
++        logger.debug('connecting to %s', uri)
+         try:
+             self._connection = setConnection(uri, DB_TABLES)
+         except AssertionError as e:
+@@ -593,7 +592,7 @@ class IMDbSqlAccessSystem(IMDbBase):
+         # Maps some IDs to the corresponding strings.
+         self._kind = {}
+         self._kindRev = {}
+-        self._sql_logger.debug('reading constants from the database')
++        logger.debug('reading constants from the database')
+         try:
+             for kt in KindType.select():
+                 self._kind[kt.id] = kt.kind
+@@ -1616,7 +1615,7 @@ class IMDbSqlAccessSystem(IMDbBase):
+         return
+         if not hasattr(self, '_connection'):
+             return
+-        self._sql_logger.debug('closing connection to the database')
++        logger.debug('closing connection to the database')
+         try:
+             self._connection.close()
+         except:
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..7e9a6b5daa88
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/img2pdf/default.nix
@@ -0,0 +1,25 @@
+{ lib, pillow, fetchPypi, buildPythonPackage, isPy27, pikepdf }:
+
+buildPythonPackage rec {
+  pname = "img2pdf";
+  version = "0.4.0";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "eaee690ab8403dd1a9cb4db10afee41dd3e6c7ed63bdace02a0121f9feadb0c9";
+  };
+
+  propagatedBuildInputs = [
+    pikepdf
+    pillow
+  ];
+
+  meta = with lib; {
+    description = "Convert images to PDF via direct JPEG inclusion";
+    homepage = "https://gitlab.mister-muffin.de/josch/img2pdf";
+    license = licenses.lgpl2;
+    platforms = platforms.unix;
+    maintainers = [ maintainers.veprbl ];
+  };
+}
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..9ca8531dbbce
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/imgaug/default.nix
@@ -0,0 +1,59 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, imageio
+, imagecorruptions
+, numpy
+, opencv3
+, pytest
+, scikitimage
+, scipy
+, shapely
+, six
+, lib, stdenv
+}:
+
+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
+  ];
+
+  checkPhase = ''
+     pytest ./test
+  '';
+
+  checkInputs = [ opencv3 pytest ];
+
+  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..d1a69c043d0f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/imgsize/default.nix
@@ -0,0 +1,23 @@
+{ lib, stdenv
+, 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/immutables/default.nix b/nixpkgs/pkgs/development/python-modules/immutables/default.nix
new file mode 100644
index 000000000000..41dcc6b2c11e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/immutables/default.nix
@@ -0,0 +1,19 @@
+{ lib, buildPythonPackage, fetchPypi, pythonOlder }:
+
+buildPythonPackage rec {
+  pname = "immutables";
+  version = "0.14";
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0y0aqw29g525frdnmv9paljzacpp4s21sadfbca5b137iciwr8d0";
+  };
+
+  meta = {
+    description = "An immutable mapping type for Python";
+    homepage = "https://github.com/MagicStack/immutables";
+    license = with lib.licenses; [ asl20 ];
+    maintainers = with lib.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..15d148f168f1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/impacket/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, fetchPypi, flask, ldapdomaindump, pycryptodomex, pyasn1, pyopenssl }:
+
+buildPythonPackage rec {
+  pname = "impacket";
+  version = "0.9.22";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "4bf7e7b595356585599b4b2773b8a463d7b9765c97012dcd5a44eb6d547f6a1d";
+  };
+
+  propagatedBuildInputs = [ flask ldapdomaindump pycryptodomex pyasn1 pyopenssl ];
+
+  # fail with:
+  # RecursionError: maximum recursion depth exceeded
+  doCheck = false;
+  pythonImportsCheck = [ "impacket" ];
+
+  meta = with lib; {
+    description = "Network protocols Constructors and Dissectors";
+    homepage = "https://github.com/CoreSecurity/impacket";
+    # Modified Apache Software License, Version 1.1
+    license = licenses.free;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..edab68aa18a3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/importlib-metadata/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools_scm
+, zipp
+, pathlib2
+, contextlib2
+, configparser
+, isPy3k
+, importlib-resources
+, packaging
+}:
+
+buildPythonPackage rec {
+  pname = "importlib-metadata";
+  version = "1.7.0";
+
+  src = fetchPypi {
+    pname = "importlib_metadata";
+    inherit version;
+    sha256 = "10vz0ydrzspdhdbxrzwr9vhs693hzh4ff71lnqsifvdzvf66bfwh";
+  };
+
+  nativeBuildInputs = [ setuptools_scm ];
+
+  propagatedBuildInputs = [ zipp ]
+    ++ lib.optionals (!isPy3k) [ pathlib2 contextlib2 configparser ];
+
+  doCheck = false; # Cyclic dependencies.
+
+  # removing test_main.py - it requires 'pyflakefs'
+  # and adding `pyflakefs` to `checkInputs` causes infinite recursion.
+  preCheck = ''
+    rm importlib_metadata/tests/test_main.py
+  '';
+
+  meta = with lib; {
+    description = "Read metadata from Python packages";
+    homepage = "https://importlib-metadata.readthedocs.io/";
+    license = licenses.asl20;
+  };
+}
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..22c05e3319c6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/importlib-resources/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools_scm
+, toml
+, importlib-metadata
+, typing
+, singledispatch
+, pythonOlder
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "importlib_resources";
+  version = "3.3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "7b51f0106c8ec564b1bef3d9c588bc694ce2b92125bbb6278f4f2f5b54ec3592";
+  };
+
+  nativeBuildInputs = [ setuptools_scm toml ];
+  propagatedBuildInputs = [
+    importlib-metadata
+  ] ++ lib.optional (pythonOlder "3.4") singledispatch
+    ++ lib.optional (pythonOlder "3.5") typing
+  ;
+
+  checkPhase = ''
+    ${python.interpreter} -m unittest discover
+  '';
+
+  meta = with lib; {
+    description = "Read resources from Python packages";
+    homepage = "https://importlib-resources.readthedocs.io/";
+    license = licenses.asl20;
+  };
+}
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..3a6a3c9ef8d7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/importmagic/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "importmagic";
+  version = "0.1.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "3f7757a5b74c9a291e20e12023bb3bf71bc2fa3adfb15a08570648ab83eaf8d8";
+  };
+
+  propagatedBuildInputs = [ six ];
+
+  doCheck = false;  # missing json file from tarball
+
+  meta = with lib; {
+    description = "Python Import Magic - automagically add, remove and manage imports";
+    homepage = "https://github.com/alecthomas/importmagic";
+    license = licenses.bsd0;
+  };
+
+}
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..65ae47ed87b0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/imread/default.nix
@@ -0,0 +1,36 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, nose
+, pkg-config
+, libjpeg
+, libpng
+, libtiff
+, libwebp
+, numpy
+}:
+
+buildPythonPackage rec {
+  pname = "python-imread";
+  version = "0.7.0";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "imread";
+    sha256 = "0yb0fmy6ilh5fvbk69wl2bzqgss2g0951668mx8z9yyj4jhr1z2y";
+  };
+
+
+  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..33c2ae0001c2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/imutils/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, opencv3
+}:
+
+buildPythonPackage rec {
+  version = "0.5.3";
+  pname = "imutils";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "857af6169d90e4a0a814130b9b107f5d611150ce440107e1c1233521c6fb1e2b";
+  };
+
+  propagatedBuildInputs = [ opencv3 ];
+
+  # no tests
+  doCheck = false;
+
+  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/incremental/default.nix b/nixpkgs/pkgs/development/python-modules/incremental/default.nix
new file mode 100644
index 000000000000..6241bc869c1c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/incremental/default.nix
@@ -0,0 +1,18 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "incremental";
+  version = "17.5.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "7b751696aaf36eebfab537e458929e194460051ccad279c72b755a167eebd4b3";
+  };
+
+  meta = with lib; {
+    homepage = "https://github.com/twisted/treq";
+    description = "Incremental is a small library that versions your Python projects";
+    license = licenses.mit;
+    maintainers = with maintainers; [ nand0p ];
+  };
+}
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..c0f6fe920505
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/inflect/default.nix
@@ -0,0 +1,16 @@
+{ buildPythonPackage, fetchPypi, isPy27, setuptools_scm, nose, six, importlib-metadata, toml }:
+
+buildPythonPackage rec {
+  pname = "inflect";
+  version = "5.0.2";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d284c905414fe37c050734c8600fe170adfb98ba40f72fc66fed393f5b8d5ea0";
+  };
+
+  nativeBuildInputs = [ setuptools_scm toml ];
+  propagatedBuildInputs = [ six importlib-metadata ];
+  checkInputs = [ nose ];
+}
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..bc2f39ad2178
--- /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.13.0";
+
+  disabled = pythonOlder "3.6"; # requires python version >=3.6
+
+  src = fetchFromGitHub {
+    owner = "influxdata";
+    repo = "influxdb-client-python";
+    rev = "v${version}";
+    sha256 = "0g7jhjnag8jx8zbjh6xlqds42alpj87a4dpqc37xqa4ir55m3c2q";
+  };
+
+  # makes test not reproducible
+  postPatch = ''
+    sed -i -e '/randomize/d' test-requirements.txt
+  '';
+
+  propagatedBuildInputs = [
+    rx
+    certifi
+    six
+    python-dateutil
+    setuptools
+    urllib3
+    ciso8601
+    pytz
+  ];
+
+  # requires influxdb server
+  doCheck = false;
+
+  meta = with lib; {
+    description = "InfluxDB 2.0 Python client library";
+    homepage = "https://github.com/influxdata/influxdb-client-python";
+    license = licenses.mit;
+    maintainers = [ 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..2d0fd5a93adb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/influxdb/default.nix
@@ -0,0 +1,38 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, requests
+, dateutil
+, pytz
+, six
+, msgpack
+, fetchpatch
+}:
+
+buildPythonPackage rec {
+  pname = "influxdb";
+  version = "5.3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "9bcaafd57ac152b9824ab12ed19f204206ef5df8af68404770554c5b55b475f6";
+  };
+
+  patches = [
+    (fetchpatch {
+      url = "https://github.com/influxdata/influxdb-python/commit/cc41e290f690c4eb67f75c98fa9f027bdb6eb16b.patch";
+      sha256 = "1fb9qrq1kp24pixjwvzhdy67z3h0wnj92aj0jw0a25fd0rdxdvg4";
+    })
+  ];
+
+  # ImportError: No module named tests
+  doCheck = false;
+  propagatedBuildInputs = [ requests dateutil pytz six msgpack ];
+
+  meta = with lib; {
+    description = "Python client for InfluxDB";
+    homepage = "https://github.com/influxdb/influxdb-python";
+    license = licenses.mit;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/influxgraph/default.nix b/nixpkgs/pkgs/development/python-modules/influxgraph/default.nix
new file mode 100644
index 000000000000..32374453375d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/influxgraph/default.nix
@@ -0,0 +1,30 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, isPy3k
+, influxdb, graphite_api, memcached
+}:
+
+buildPythonPackage rec {
+  pname = "influxgraph";
+  version = "1.5.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0l33sfwdh4bfprmzp2kx0d9098g6yxbnhyyx9qr3kzczpm0jg9vy";
+  };
+
+  patchPhase = lib.optionalString isPy3k ''
+    sed 's/python-memcached/python3-memcached/' \
+      -i ./influxgraph.egg-info/requires.txt    \
+      -i ./setup.py
+  '';
+
+  propagatedBuildInputs = [ influxdb graphite_api memcached ];
+
+  passthru.moduleName = "influxgraph.InfluxDBFinder";
+
+  meta = with lib; {
+    description = "InfluxDB storage plugin for Graphite-API";
+    homepage = "https://github.com/InfluxGraph/influxgraph";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ basvandijk ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/infoqscraper/default.nix b/nixpkgs/pkgs/development/python-modules/infoqscraper/default.nix
new file mode 100644
index 000000000000..4baa891a7790
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/infoqscraper/default.nix
@@ -0,0 +1,33 @@
+{ lib, stdenv
+, buildPythonPackage
+, html5lib
+, six
+, beautifulsoup4
+, pkgs
+}:
+
+buildPythonPackage rec {
+  version = "0.1.0";
+  pname = "infoqscraper";
+
+  src = pkgs.fetchFromGitHub {
+    owner = "cykl";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "07mxp4mla7fwfc032f3mxrhjarnhkjqdxxibf9ba87c93z3dq8jj";
+  };
+
+  # requires network
+  doCheck = false;
+
+  buildInputs = [ html5lib ];
+  propagatedBuildInputs = [ six beautifulsoup4 pkgs.ffmpeg_3 pkgs.swftools pkgs.rtmpdump ];
+
+  meta = with lib; {
+    description = "Discover presentations and/or create a movie consisting of slides and audio track from an infoq url";
+    homepage = "https://github.com/cykl/infoqscraper/wiki";
+    license = licenses.mit;
+    maintainers = with maintainers; [ edwtjo ];
+  };
+
+}
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..7646d25ee425
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/inform/default.nix
@@ -0,0 +1,41 @@
+{ lib, buildPythonPackage, fetchFromGitHub
+, arrow
+, six
+, hypothesis
+, pytest
+, pytestrunner
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "inform";
+  version = "1.23";
+
+  src = fetchFromGitHub {
+    owner = "KenKundert";
+    repo = "inform";
+    rev = "v${version}";
+    sha256 = "02zlprvidkz51aypss4knhv7dbr0sbpz3caqjzf9am2n1jx2viyy";
+  };
+
+  nativeBuildInputs = [ pytestrunner ];
+  propagatedBuildInputs = [ arrow six ];
+
+  checkInputs = [ pytest hypothesis ];
+  checkPhase = ''
+    patchShebangs test.doctests.py test.inform.py
+    ./test.doctests.py && ./test.inform.py && pytest
+  '';
+
+  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..90761f76f9d5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/iniconfig/default.nix
@@ -0,0 +1,21 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "iniconfig";
+  version = "1.1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32";
+  };
+
+  doCheck = false; # avoid circular import with pytest
+  pythonImportsCheck = [ "iniconfig" ];
+
+  meta = with lib; {
+    description = "brain-dead simple parsing of ini files";
+    homepage = "https://github.com/RonnyPfannschmidt/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..9bd24a4d7889
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/inifile/default.nix
@@ -0,0 +1,22 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "inifile";
+  version = "0.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0zgd53czc1irwx6b5zip8xlmyfr40hz2pd498d8yv61znj6lm16h";
+  };
+
+  meta = with lib; {
+    description = "A small INI library for Python";
+    homepage    = "https://github.com/mitsuhiko/python-inifile";
+    license     = licenses.bsd0;
+    maintainers = with maintainers; [ vozz ];
+  };
+
+}
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..c515b7865b15
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/iniparse/default.nix
@@ -0,0 +1,33 @@
+{ lib, stdenv
+, 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/inotify-simple/default.nix b/nixpkgs/pkgs/development/python-modules/inotify-simple/default.nix
new file mode 100644
index 000000000000..898737ca7b49
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/inotify-simple/default.nix
@@ -0,0 +1,22 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "inotify-simple";
+  version = "1.2.1";
+
+  src = fetchPypi {
+    pname = "inotify_simple";
+    inherit version;
+    sha256 = "132craajflksgxxwjawj73nn1ssv8jn58j3k5vvyiq03avbz4sfv";
+  };
+
+  # The package has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A simple Python wrapper around inotify";
+    homepage = "https://github.com/chrisjbillington/inotify_simple";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ earvstedt ];
+  };
+}
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..c434a3f52bce
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/inquirer/default.nix
@@ -0,0 +1,35 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub, python-editor, readchar, blessed, pytest, pytestcov, pexpect, pytest-mock }:
+
+buildPythonPackage rec {
+  pname = "inquirer";
+  version = "2.7.0";
+
+  # PyPi archive currently broken: https://github.com/magmax/python-inquirer/issues/106
+  src = fetchFromGitHub rec {
+    owner = "magmax";
+    repo = "python-inquirer";
+    rev = version;
+    sha256 = "152l5qjgkag8zkr69ax2i5s8xcac1qvyngisrplbnbzwbpf77d0d";
+  };
+
+  propagatedBuildInputs = [ blessed python-editor readchar ];
+
+  postPatch = ''
+   substituteInPlace requirements.txt \
+     --replace "blessed==1.17.6" "blessed~=1.17" \
+     --replace "readchar==2.0.1" "readchar>=2.0.0"
+  '';
+
+  checkInputs = [ pytest pytestcov pexpect pytest-mock ];
+
+  checkPhase = ''
+    pytest --cov-report=term-missing  --cov inquirer --no-cov-on-fail tests/unit tests/integration
+  '';
+
+  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/intake/default.nix b/nixpkgs/pkgs/development/python-modules/intake/default.nix
new file mode 100644
index 000000000000..922d543fd1de
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/intake/default.nix
@@ -0,0 +1,82 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, appdirs
+, dask
+, holoviews
+, hvplot
+, jinja2
+, msgpack
+, msgpack-numpy
+, numpy
+, pandas
+, panel
+, pyarrow
+, pytestCheckHook
+, pythonOlder
+, python-snappy
+, requests
+, ruamel_yaml
+, six
+, tornado
+}:
+
+buildPythonPackage rec {
+  pname = "intake";
+  version = "0.6.0";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0c284abeb74927a7366dcab6cefc010c4d050365b8af61c37326a2473a490a4e";
+  };
+
+  propagatedBuildInputs = [
+    appdirs
+    dask
+    holoviews
+    hvplot
+    jinja2
+    msgpack-numpy
+    msgpack
+    numpy
+    pandas
+    panel
+    python-snappy
+    requests
+    ruamel_yaml
+    six
+    tornado
+  ];
+
+  checkInputs = [ pyarrow pytestCheckHook ];
+
+  postPatch = ''
+    # Is in setup_requires but not used in setup.py...
+    substituteInPlace setup.py --replace "'pytest-runner'" ""
+  '';
+
+  # test_discover requires driver_with_entrypoints-0.1.dist-info, which is not included in tarball
+  # test_filtered_compressed_cache requires calvert_uk_filter.tar.gz, which is not included in tarball
+  preCheck = ''
+    HOME=$TMPDIR
+    PATH=$out/bin:$PATH
+  '';
+
+  # disable tests which touch network
+  disabledTests = ''
+    "test_discover"
+    "test_filtered_compressed_cache"
+    "test_get_dir"
+    "test_remote_cat"
+    "http"
+  '';
+
+  meta = with lib; {
+    description = "Data load and catalog system";
+    homepage = "https://github.com/ContinuumIO/intake";
+    license = licenses.bsd2;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..0634e9190242
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/intelhex/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+}:
+
+buildPythonPackage rec {
+  pname = "intelhex";
+  version = "2.2.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0ckqjbxd8gwcg98gfzpn4vq1qxzfvq3rdbrr1hikj1nmw08qb780";
+  };
+
+  patches = [
+    # patch the tests to check for the correct version string (2.2.1)
+    (fetchpatch {
+      url = "https://patch-diff.githubusercontent.com/raw/bialix/intelhex/pull/26.patch";
+      sha256 = "1f3f2cyf9ipb9zdifmjs8rqhg028dhy91vabxxn3l7br657s8r2l";
+    })
+  ];
+
+  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/internetarchive/default.nix b/nixpkgs/pkgs/development/python-modules/internetarchive/default.nix
new file mode 100644
index 000000000000..879c90c40a42
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/internetarchive/default.nix
@@ -0,0 +1,58 @@
+{ buildPythonPackage
+, fetchPypi
+, pytest
+, six
+, tqdm
+, pyyaml
+, docopt
+, requests
+, jsonpatch
+, args
+, schema
+, responses
+, backports_csv
+, isPy3k
+, lib
+, glibcLocales
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "internetarchive";
+  version = "1.9.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0e9b24577086283280a5089b3e65086640b4e42d61ca4af913639f45b02b9e4c";
+  };
+
+  propagatedBuildInputs = [
+    six
+    tqdm
+    pyyaml
+    docopt
+    requests
+    jsonpatch
+    args
+    schema
+    setuptools
+  ] ++ lib.optionals (!isPy3k) [ backports_csv ];
+
+  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";
+    license = licenses.agpl3;
+    maintainers = [ maintainers.marsam ];
+  };
+}
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..b4e1dfaff181
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/interruptingcow/default.nix
@@ -0,0 +1,17 @@
+{ lib, stdenv, 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..27a5fa3650e8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/intervaltree/default.nix
@@ -0,0 +1,30 @@
+{ lib, stdenv, 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/invoke/default.nix b/nixpkgs/pkgs/development/python-modules/invoke/default.nix
new file mode 100644
index 000000000000..45f3ee7a04db
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/invoke/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, bash
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "invoke";
+  version = "1.4.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "de3f23bfe669e3db1085789fd859eb8ca8e0c5d9c20811e2407fa042e8a5e15d";
+  };
+
+  patchPhase = ''
+    sed -e 's|/bin/bash|${bash}/bin/bash|g' -i invoke/config.py
+  '';
+
+  # errors with vendored libs
+  doCheck = false;
+
+  meta = {
+    description = "Pythonic task execution";
+    license = lib.licenses.bsd2;
+  };
+}
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..0f0466c8b3eb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/iocapture/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, flexmock
+, pytest
+, pytestcov
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "iocapture";
+  version = "0.1.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "86670e1808bcdcd4f70112f43da72ae766f04cd8311d1071ce6e0e0a72e37ee8";
+  };
+
+  checkInputs = [
+    flexmock
+    pytest
+    pytestcov
+    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/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..427681fedb86
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ipaddr/default.nix
@@ -0,0 +1,23 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "ipaddr";
+  version = "2.2.0";
+  disabled = isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1ml8r8z3f0mnn381qs1snbffa920i9ycp6mm2am1d3aqczkdz4j0";
+  };
+
+  meta = with lib; {
+    description = "Google's IP address manipulation library";
+    homepage = "https://github.com/google/ipaddr-py";
+    license = licenses.asl20;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ipaddress/default.nix b/nixpkgs/pkgs/development/python-modules/ipaddress/default.nix
new file mode 100644
index 000000000000..f2e479aff96e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ipaddress/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, pythonAtLeast
+, python
+}:
+
+if (pythonAtLeast "3.3") then null else buildPythonPackage rec {
+  pname = "ipaddress";
+  version = "1.0.23";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b7f8e0369580bb4a24d5ba1d7cc29660a4a6987763faf1d8a8046830e020e7e2";
+  };
+
+  checkPhase = ''
+    ${python.interpreter} test_ipaddress.py
+  '';
+
+  meta = with lib; {
+    description = "Port of the 3.3+ ipaddress module to 2.6, 2.7, and 3.2";
+    homepage = "https://github.com/phihag/ipaddress";
+    license = licenses.psfl;
+  };
+
+}
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..b21907f75ff5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ipdb/default.nix
@@ -0,0 +1,34 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, ipython
+, isPyPy
+, isPy27
+, mock
+}:
+
+buildPythonPackage rec {
+  pname = "ipdb";
+  version = "0.13.4";
+  disabled = isPyPy || isPy27;  # setupterm: could not find terminfo database
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "c85398b5fb82f82399fc38c44fe3532c0dde1754abee727d8f5cfcc74547b334";
+  };
+
+  propagatedBuildInputs = [ ipython ];
+  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..057d82cbebc3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ipdbplugin/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv
+, 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/ipfsapi/default.nix b/nixpkgs/pkgs/development/python-modules/ipfsapi/default.nix
new file mode 100644
index 000000000000..3deb0c6cb80c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ipfsapi/default.nix
@@ -0,0 +1,30 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, isPy27
+, six
+, requests
+}:
+
+buildPythonPackage {
+  pname = "ipfsapi";
+  version = "0.4.2.post1";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "ipfs";
+    repo = "py-ipfs-api";
+    rev = "0c485544a114f580c65e2ffbb5782efbf7fd9f61";
+    sha256 = "1v7f77cv95yv0v80gisdh71mj7jcq41xcfip6bqm57zfdbsa0xpn";
+  };
+
+  propagatedBuildInputs = [ six requests ];
+
+  meta = with lib; {
+    description = "A python client library for the IPFS API";
+    license = licenses.mit;
+    maintainers = with maintainers; [ mguentner ];
+    homepage = "https://pypi.python.org/pypi/ipfsapi";
+  };
+
+}
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..431c05bb3881
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/iptools/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv
+, 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/ipydatawidgets/default.nix b/nixpkgs/pkgs/development/python-modules/ipydatawidgets/default.nix
new file mode 100644
index 000000000000..e6e1e605cca5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ipydatawidgets/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, pytest
+, pytestcov
+, nbval
+, ipywidgets
+, numpy
+, six
+, traittypes
+}:
+
+buildPythonPackage rec {
+  pname = "ipydatawidgets";
+  version = "4.1.0";
+
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d9f94828c11e3b40350fb14a02e027f42670a7c372bcb30db18d552dcfab7c01";
+  };
+
+  propagatedBuildInputs = [
+    ipywidgets
+    numpy
+    six
+    traittypes
+  ];
+
+  checkInputs = [ pytest pytestcov 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/4.nix b/nixpkgs/pkgs/development/python-modules/ipykernel/4.nix
new file mode 100644
index 000000000000..d408c1185dc7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ipykernel/4.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, nose
+, isPy27
+, mock
+, ipython
+, jupyter_client
+, pexpect
+, traitlets
+, tornado
+}:
+
+buildPythonPackage rec {
+  pname = "ipykernel";
+  version = "4.10.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "eeb74b2bcfe0ced5a7900361f98fa1171288aa47ed4b522efe5acb167c6cf5fb";
+  };
+
+  checkInputs = [ nose ] ++ lib.optional isPy27 mock;
+  propagatedBuildInputs = [
+    ipython
+    jupyter_client
+    pexpect
+    traitlets
+    tornado
+  ];
+
+  # Tests require backends.
+  # I don't want to add all supported backends as propagatedBuildInputs
+  doCheck = false;
+
+  meta = {
+    description = "IPython Kernel for Jupyter";
+    homepage = "http://ipython.org/";
+    license = lib.licenses.bsd3;
+  };
+}
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..c8539598fe6f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ipykernel/default.nix
@@ -0,0 +1,70 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, flaky
+, ipython
+, jupyter_client
+, traitlets
+, tornado
+, pythonOlder
+, pytestCheckHook
+, nose
+}:
+
+buildPythonPackage rec {
+  pname = "ipykernel";
+  version = "5.2.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1a3hr7wx3ywwskr99hgp120dw9ab1vmcaxdixlsbd9bg6ly3fdr9";
+  };
+
+  propagatedBuildInputs = [ ipython jupyter_client traitlets tornado ];
+
+  # https://github.com/ipython/ipykernel/pull/377
+  patches = [
+    (fetchpatch {
+      url = "https://github.com/ipython/ipykernel/commit/a3bf849dbd368a1826deb9dfc94c2bd3e5ed04fe.patch";
+      sha256 = "1yhpwqixlf98a3n620z92mfips3riw6psijqnc5jgs2p58fgs2yc";
+    })
+  ];
+
+  checkInputs = [ pytestCheckHook nose flaky ];
+  dontUseSetuptoolsCheck = true;
+  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;
+
+  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/ipympl/default.nix b/nixpkgs/pkgs/development/python-modules/ipympl/default.nix
new file mode 100644
index 000000000000..4efe8b176c52
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ipympl/default.nix
@@ -0,0 +1,24 @@
+{ lib, buildPythonPackage, fetchPypi, ipywidgets, matplotlib }:
+
+buildPythonPackage rec {
+  pname = "ipympl";
+  version = "0.5.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0e2f2e540a2dfea61524b7993fc8552c9236b1aaa3826e1f382c75cb2fa5c382";
+  };
+
+  propagatedBuildInputs = [ 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 ];
+    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..297b87d5745b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ipyparallel/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, nose
+, dateutil
+, ipython_genutils
+, decorator
+, pyzmq
+, ipython
+, jupyter_client
+, ipykernel
+, tornado
+, isPy3k
+, futures
+}:
+
+buildPythonPackage rec {
+  pname = "ipyparallel";
+  version = "6.3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0a97b276c62db633e9e97a816282bdd166f9df74e28204f0c8fa54b71944cfdc";
+  };
+
+  buildInputs = [ nose ];
+
+  propagatedBuildInputs = [ dateutil ipython_genutils decorator pyzmq ipython jupyter_client ipykernel tornado
+  ] ++ 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/5.nix b/nixpkgs/pkgs/development/python-modules/ipython/5.nix
new file mode 100644
index 000000000000..a75ceaa0b76d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ipython/5.nix
@@ -0,0 +1,72 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+# Build dependencies
+, glibcLocales
+# Test dependencies
+, nose
+, pygments
+, testpath
+, isPy27
+, mock
+# Runtime dependencies
+, backports_shutil_get_terminal_size
+, decorator
+, pathlib2
+, pickleshare
+, requests
+, simplegeneric
+, traitlets
+, prompt_toolkit
+, pexpect
+, appnope
+}:
+
+buildPythonPackage rec {
+  pname = "ipython";
+  version = "5.8.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "4bac649857611baaaf76bc82c173aa542f7486446c335fe1a6c05d0d491c8906";
+  };
+
+  prePatch = lib.optionalString stdenv.isDarwin ''
+    substituteInPlace setup.py --replace "'gnureadline'" " "
+  '';
+
+  patches = [
+    # Use the proper pygments lexer for python2 (https://github.com/ipython/ipython/pull/12095)
+    (fetchpatch {
+      name = "python2-lexer.patch";
+      url = "https://github.com/ipython/ipython/pull/12095/commits/8805293b5e4bce9150cc2ad9c5d6d984849ae447.patch";
+      sha256 = "16p4gl7a49v76w33j39ih7yspy6x2d14p9bh4wdpg9cafhw9nbc0";
+    })
+  ];
+
+  buildInputs = [ glibcLocales ];
+
+  checkInputs = [ nose pygments testpath ] ++ lib.optional isPy27 mock;
+
+  propagatedBuildInputs = [
+    backports_shutil_get_terminal_size decorator pickleshare prompt_toolkit
+    simplegeneric traitlets requests pathlib2 pexpect
+  ] ++ lib.optionals stdenv.isDarwin [ appnope ];
+
+  LC_ALL="en_US.UTF-8";
+
+  doCheck = false; # Circular dependency with ipykernel
+
+  checkPhase = ''
+    nosetests
+  '';
+
+  meta = {
+    description = "IPython: Productive Interactive Computing";
+    homepage = "http://ipython.org/";
+    license = lib.licenses.bsd3;
+    maintainers = with lib.maintainers; [ bjornfor orivej lnl7 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ipython/7.16.nix b/nixpkgs/pkgs/development/python-modules/ipython/7.16.nix
new file mode 100644
index 000000000000..9700737f485e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ipython/7.16.nix
@@ -0,0 +1,70 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+# Build dependencies
+, glibcLocales
+# Test dependencies
+, nose
+, pygments
+# Runtime dependencies
+, jedi
+, decorator
+, pickleshare
+, traitlets
+, prompt_toolkit
+, pexpect
+, appnope
+, backcall
+, fetchpatch
+}:
+
+buildPythonPackage rec {
+  pname = "ipython";
+  version = "7.16.1";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "9f4fcb31d3b2c533333893b9172264e4821c1ac91839500f31bd43f2c59b3ccf";
+  };
+
+  prePatch = lib.optionalString stdenv.isDarwin ''
+    substituteInPlace setup.py --replace "'gnureadline'" " "
+  '';
+
+  buildInputs = [ glibcLocales ];
+
+  checkInputs = [ nose pygments ];
+
+  propagatedBuildInputs = [
+    jedi
+    decorator
+    pickleshare
+    traitlets
+    prompt_toolkit
+    pygments
+    pexpect
+    backcall
+  ] ++ lib.optionals stdenv.isDarwin [appnope];
+
+  LC_ALL="en_US.UTF-8";
+
+  doCheck = false; # Circular dependency with ipykernel
+
+  checkPhase = ''
+    nosetests
+  '';
+
+  pythonImportsCheck = [
+    "IPython"
+  ];
+
+  meta = with lib; {
+    description = "IPython: Productive Interactive Computing";
+    homepage = "http://ipython.org/";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ bjornfor fridh ];
+  };
+}
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..dd9004aa0cb3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ipython/default.nix
@@ -0,0 +1,70 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+# Build dependencies
+, glibcLocales
+# Test dependencies
+, nose
+, pygments
+# Runtime dependencies
+, jedi
+, decorator
+, pickleshare
+, traitlets
+, prompt_toolkit
+, pexpect
+, appnope
+, backcall
+, fetchpatch
+}:
+
+buildPythonPackage rec {
+  pname = "ipython";
+  version = "7.19.0";
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "cbb2ef3d5961d44e6a963b9817d4ea4e1fa2eb589c371a470fed14d8d40cbd6a";
+  };
+
+  prePatch = lib.optionalString stdenv.isDarwin ''
+    substituteInPlace setup.py --replace "'gnureadline'" " "
+  '';
+
+  buildInputs = [ glibcLocales ];
+
+  checkInputs = [ nose pygments ];
+
+  propagatedBuildInputs = [
+    jedi
+    decorator
+    pickleshare
+    traitlets
+    prompt_toolkit
+    pygments
+    pexpect
+    backcall
+  ] ++ lib.optionals stdenv.isDarwin [appnope];
+
+  LC_ALL="en_US.UTF-8";
+
+  doCheck = false; # Circular dependency with ipykernel
+
+  checkPhase = ''
+    nosetests
+  '';
+
+  pythonImportsCheck = [
+    "IPython"
+  ];
+
+  meta = with lib; {
+    description = "IPython: Productive Interactive Computing";
+    homepage = "http://ipython.org/";
+    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..0ccb1b2a4e14
--- /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.5.0";
+
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "e8549a7ac7dc45948a5f2735e17f97622313c7fea24ea3c1bd4a5ebf02bf5638";
+  };
+
+  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..c63cee791232
--- /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.5.1";
+
+  # GitHub version tries to run npm (Node JS)
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "593f5d6761e304cbb78bca967030485d8835e8d310ef7d83ac1b0e6a13e4911c";
+  };
+
+  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..5f2b3299a024
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ipywidgets/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python
+, nose
+, pytest
+, mock
+, ipython
+, ipykernel
+, traitlets
+, notebook
+, widgetsnbextension
+}:
+
+buildPythonPackage rec {
+  pname = "ipywidgets";
+  version = "7.5.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "e945f6e02854a74994c596d9db83444a1850c01648f1574adf144fbbabe05c97";
+  };
+
+  # Tests are not distributed
+  # doCheck = false;
+
+  buildInputs = [ nose pytest mock ];
+  propagatedBuildInputs = [
+    ipython
+    ipykernel
+    traitlets
+    notebook
+    widgetsnbextension
+  ];
+
+  checkPhase = ''
+    ${python.interpreter} -m unittest discover
+  '';
+
+  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..ed113dc6da64
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/irc/default.nix
@@ -0,0 +1,40 @@
+{ lib, buildPythonPackage, fetchPypi, isPy3k
+, six, jaraco_logging, jaraco_text, jaraco_stream, pytz, jaraco_itertools
+, setuptools_scm, jaraco_collections, importlib-metadata, toml
+}:
+
+buildPythonPackage rec {
+  pname = "irc";
+  version = "19.0.1";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "99fd5d1fa1d054dee4fbb81e0d5193dc1e8200db751d5da9a97850a62162b9ab";
+  };
+
+  doCheck = false;
+
+  pythonImportsCheck = [ "irc" ];
+
+  nativeBuildInputs = [ setuptools_scm ];
+  propagatedBuildInputs = [
+    six
+    importlib-metadata
+    jaraco_logging
+    jaraco_text
+    jaraco_stream
+    pytz
+    jaraco_itertools
+    jaraco_collections
+    toml
+  ];
+
+  meta = with lib; {
+    description = "IRC (Internet Relay Chat) protocol library for Python";
+    homepage = "https://github.com/jaraco/irc";
+    license = licenses.mit;
+    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..41973e805846
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ircrobots/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, anyio
+, asyncio-throttle
+, dataclasses
+, ircstates
+, async_stagger
+, async-timeout
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "ircrobots";
+  version = "0.3.6";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "jesopo";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1c8h8b78gmnfipppr9dxp7sl6wd9lx4l3pdwykaib1f49dqwavys";
+  };
+
+  postPatch = ''
+    # too specific pins https://github.com/jesopo/ircrobots/issues/3
+    sed -iE 's/anyio.*/anyio/' requirements.txt
+  '';
+
+  propagatedBuildInputs = [
+    anyio
+    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..b5404febfa3c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ircstates/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, pythonOlder
+, irctokens
+, pendulum
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "ircstates";
+  version = "0.11.7";
+  disabled = pythonOlder "3.6";  # f-strings
+
+  src = fetchFromGitHub {
+    owner = "jesopo";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "00dyd6mry10na98x1gs92xnfpjf1wd9zpblx1wcx8ggv5rqvgqrm";
+  };
+
+  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..037a5f0520fd
--- /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.0";
+  disabled = pythonOlder "3.6";  # f-strings
+
+  src = fetchFromGitHub {
+    owner = "jesopo";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0kpxn5paailm4xpdlnzxrhjrfgvvg5pp327wd8kl41a0wbqkj4zb";
+  };
+
+  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..3b03a15b9a4d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/isbnlib/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, nose
+, coverage
+}:
+
+buildPythonPackage rec {
+  pname = "isbnlib";
+  version = "3.10.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "cb3b400b37a73cf4a0bc698be2ea414e78ff117867baed9313aa8c97596e1b98";
+  };
+
+  checkInputs = [
+    nose
+    coverage
+  ];
+
+  # requires network connection
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Extract, clean, transform, hyphenate and metadata for ISBNs";
+    homepage = "https://github.com/xlcnd/isbnlib";
+    license = licenses.lgpl3;
+    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..736588aa4504
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/islpy/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isl
+, pybind11
+, pytestCheckHook
+, pythonOlder
+, cffi
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "islpy";
+  version = "2020.2.2";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "7eb7dfa41d6a67d9ee4ea4bb9f08bdbcbee42b364502136b7882cfd80ff427e0";
+  };
+
+  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/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..acf6d3c9331d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/iso3166/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv, fetchFromGitHub, buildPythonPackage, pytest }:
+
+buildPythonPackage {
+  pname = "iso3166";
+  version = "0.8";
+
+  src = fetchFromGitHub {
+    owner = "deactivated";
+    repo = "python-iso3166";
+    # repo has no version tags
+    rev = "f04e499447bbff10af701cf3dd81f6bcdf02f7d7";
+    sha256 = "0zs9za9dr2nl5srxir08yibmp6nffcapmzala0fgh8ny7y6rafrx";
+  };
+
+  checkInputs = [ pytest ];
+
+  checkPhase = ''
+    py.test
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/deactivated/python-iso3166";
+    description = "Self-contained ISO 3166-1 country definitions";
+    license = licenses.mit;
+    maintainers = with maintainers; [ zraexy ];
+  };
+}
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..b83374fff3e1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/iso8601/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "iso8601";
+  version = "0.1.13";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f7dec22af52025d4526be94cc1303c7d8f5379b746a3f54a8c8446384392eeb1";
+  };
+
+  checkInputs = [ pytest ];
+
+  checkPhase = ''
+    py.test iso8601
+  '';
+
+  meta = {
+    homepage = "https://bitbucket.org/micktwomey/pyiso8601/";
+    description = "Simple module to parse ISO 8601 dates";
+    maintainers = with lib.maintainers; [ phreedom ];
+  };
+}
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..d2098a83c95e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/isodate/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, python
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "isodate";
+  version = "0.6.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "2e364a3d5759479cdb2d37cce6b9376ea504db2ff90252a2e5b7cc89cc9ff2d8";
+  };
+
+  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/isort/4.nix b/nixpkgs/pkgs/development/python-modules/isort/4.nix
new file mode 100644
index 000000000000..b2ef4e66f361
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/isort/4.nix
@@ -0,0 +1,43 @@
+{ lib, buildPythonPackage, fetchPypi, setuptools, isPy27, futures
+, backports_functools_lru_cache, mock, pytest
+}:
+
+let
+  skipTests = [ "test_requirements_finder" "test_pipfile_finder" ] ++ lib.optional isPy27 "test_standard_library_deprecates_user_issue_778";
+  testOpts = lib.concatMapStringsSep " " (t: "--deselect test_isort.py::${t}") skipTests;
+in buildPythonPackage rec {
+  pname = "isort";
+  version = "4.3.21"; # Note 4.x is the last version that supports Python2
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "54da7e92468955c4fceacd0c86bd0ec997b0e1ee80d97f67c35a78b719dccab1";
+  };
+
+  propagatedBuildInputs = [
+    setuptools
+  ] ++ lib.optionals isPy27 [ futures backports_functools_lru_cache ];
+
+  checkInputs = [ mock pytest ];
+
+  checkPhase = ''
+    # isort excludes paths that contain /build/, so test fixtures don't work
+    # with TMPDIR=/build/
+    PATH=$out/bin:$PATH TMPDIR=/tmp/ pytest ${testOpts}
+
+    # 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
+    )
+  '';
+
+  meta = with lib; {
+    description = "A Python utility / library to sort Python imports";
+    homepage = "https://github.com/timothycrosley/isort";
+    license = licenses.mit;
+    maintainers = with maintainers; [ couchemar nand0p ];
+  };
+}
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..bc11697339e8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/isort/default.nix
@@ -0,0 +1,77 @@
+{ lib, buildPythonPackage, fetchFromGitHub
+, colorama
+, hypothesis
+, poetry-core
+, pylama
+, pytestCheckHook
+}:
+
+let
+in buildPythonPackage rec {
+  pname = "isort";
+  version = "5.6.4";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "PyCQA";
+    repo = "isort";
+    rev = version;
+    sha256 = "1m7jpqssnbsn1ydrw1dn7nrcrggqcvj9v6mk5ampxmvk94xd2r2q";
+  };
+
+  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/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_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_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 nand0p ];
+  };
+}
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..c67259eee0f6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/itanium_demangler/default.nix
@@ -0,0 +1,30 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, lib
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "itanium_demangler";
+  version = "1.0"; # pulled from pypi version
+
+  src = fetchFromGitHub {
+    owner = "whitequark";
+    repo = "python-${pname}";
+    rev = "29c77860be48e6dafe3496e4d9d0963ce414e366";
+    sha256 = "0qm95l6542nk63986w9lgzkxg824l31714i584s02rh9xwfg1xfx";
+  };
+
+  checkInputs = [ pytest ];
+
+  checkPhase = ''
+    pytest tests/test.py
+  '';
+
+  meta = with lib; {
+    description = "A pure Python parser for the Itanium C++ ABI symbol mangling language";
+    homepage = "https://github.com/whitequark/python-itanium_demangler";
+    license = licenses.bsd0;
+    maintainers = [ 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..e1efb9aa673f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/itemadapter/default.nix
@@ -0,0 +1,24 @@
+{ lib, buildPythonPackage, fetchPypi, isPy27 }:
+
+buildPythonPackage rec {
+  pname = "itemadapter";
+  version = "0.2.0";
+
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "cb7aaa577fefe2aa6f229ccf4d058e05f44e0178a98c8fb70ee4d95acfabb423";
+  };
+
+  doCheck = false; # infinite recursion with Scrapy
+
+  pythonImportsCheck = [ "itemadapter" ];
+
+  meta = with lib; {
+    description = "Common interface for data container classes";
+    homepage = "https://github.com/scrapy/itemadapter";
+    license = licenses.bsd3;
+    maintainers = [ maintainers.marsam ];
+  };
+}
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..107585f0416c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/itemloaders/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, isPy27
+, w3lib
+, parsel
+, jmespath
+, itemadapter
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "itemloaders";
+  version = "1.0.4";
+
+  disabled = isPy27;
+
+  # Tests not included in PyPI tarball
+  src = fetchFromGitHub {
+    owner = "scrapy";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0j68xgx2z63sc1nc9clw6744036vfbijdsghvjv6pk674d5lgyam";
+  };
+
+  propagatedBuildInputs = [ w3lib parsel jmespath itemadapter ];
+
+  checkInputs = [ pytestCheckHook ];
+
+  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..a62d5068f776
--- /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 = "1.18";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "88ca7dd76242205dc82761bf98932a42e6c1ba338cb065f1cc775413ef4e0dc2";
+  };
+
+  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..e89786d4e18d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/itsdangerous/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "itsdangerous";
+  version = "1.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "321b033d07f2a4136d3ec762eac9f16a10ccd60f53c0c91af90217ace7ba1f19";
+  };
+
+  meta = with lib; {
+    description = "Helpers to pass trusted data to untrusted environments and back";
+    homepage = "https://pypi.python.org/pypi/itsdangerous/";
+    license = licenses.bsd0;
+  };
+
+}
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..417d1a20b3bf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/itypes/default.nix
@@ -0,0 +1,31 @@
+{
+  lib, stdenv,
+  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; [ ivegotasthma ];
+  };
+}
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..14cf18ae694f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/j2cli/default.nix
@@ -0,0 +1,32 @@
+{ lib, stdenv
+, 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 ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jabberbot/default.nix b/nixpkgs/pkgs/development/python-modules/jabberbot/default.nix
new file mode 100644
index 000000000000..4c625d944859
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jabberbot/default.nix
@@ -0,0 +1,23 @@
+{ lib, stdenv, buildPythonPackage, isPy3k, fetchPypi, xmpppy }:
+
+buildPythonPackage rec {
+  pname = "jabberbot";
+  version = "0.16";
+
+  disabled = isPy3k;
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1qr7c5p9a0nzsvri1djnd5r3d7ilh2mdxvviqn1s2hcc70rha65d";
+  };
+
+  propagatedBuildInputs = [ xmpppy ];
+
+  doCheck = false; # lol, it does not even specify dependencies properly
+
+  meta = with lib; {
+    description = "A framework for writing Jabber/XMPP bots and services";
+    homepage = "http://thp.io/2007/python-jabberbot/";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ mic92 ];
+  };
+}
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..14d54ef5a422
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/janus/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, fetchPypi, pytestCheckHook, pythonOlder, pytest-asyncio }:
+
+buildPythonPackage rec {
+  pname = "janus";
+  version = "0.6.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "4712e0ef75711fe5947c2db855bc96221a9a03641b52e5ae8e25c2b705dd1d0c";
+  };
+
+  disabled = pythonOlder "3.6";
+
+  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_classes/default.nix b/nixpkgs/pkgs/development/python-modules/jaraco_classes/default.nix
new file mode 100644
index 000000000000..a3d19df76537
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jaraco_classes/default.nix
@@ -0,0 +1,19 @@
+{ buildPythonPackage, fetchPypi, isPy27, setuptools_scm, six, more-itertools }:
+
+buildPythonPackage rec {
+  pname = "jaraco.classes";
+  version = "3.1.0";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1avsxzm5mwylmy2zbxq3xvn48z5djb0qy3hwv4ryncprivzri1n3";
+  };
+
+  pythonNamespaces = [ "jaraco" ];
+
+  nativeBuildInputs = [ setuptools_scm ];
+  propagatedBuildInputs = [ six more-itertools ];
+
+  doCheck = false;
+}
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..3c37755366d0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jaraco_collections/default.nix
@@ -0,0 +1,23 @@
+{ buildPythonPackage, fetchPypi, setuptools_scm
+, six, jaraco_classes, jaraco_text
+}:
+
+buildPythonPackage rec {
+  pname = "jaraco.collections";
+  version = "3.0.0";
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "be570ef4f2e7290b757449395238fa63d70a9255574624e73c5ff9f1ee554721";
+  };
+
+  pythonNamespaces = [ "jaraco" ];
+
+  doCheck = false;
+  buildInputs = [ setuptools_scm ];
+  propagatedBuildInputs = [ six jaraco_classes jaraco_text ];
+
+  # break dependency cycle
+  patchPhase = ''
+    sed -i "/'jaraco.text',/d" setup.py
+  '';
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jaraco_functools/2.nix b/nixpkgs/pkgs/development/python-modules/jaraco_functools/2.nix
new file mode 100644
index 000000000000..e0bbde47d250
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jaraco_functools/2.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, fetchPypi
+, setuptools_scm
+, more-itertools, backports_functools_lru_cache }:
+
+buildPythonPackage rec {
+  pname = "jaraco.functools";
+  version = "2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0ickpwvvdrlbm477gdzfjfcbgmfia9ksm9a3i3pbx9xia97r9fim";
+  };
+
+  propagatedBuildInputs = [ more-itertools backports_functools_lru_cache ];
+
+  doCheck = false;
+
+  buildInputs = [ setuptools_scm ];
+
+  meta = with lib; {
+    description = "Additional functools in the spirit of stdlib's functools";
+    homepage = "https://github.com/jaraco/jaraco.functools";
+    license = licenses.mit;
+  };
+}
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..eb176d0d8575
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jaraco_functools/default.nix
@@ -0,0 +1,27 @@
+{ lib, buildPythonPackage, fetchPypi
+, setuptools_scm, toml
+, more-itertools, backports_functools_lru_cache }:
+
+buildPythonPackage rec {
+  pname = "jaraco.functools";
+  version = "3.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "9fedc4be3117512ca3e03e1b2ffa7a6a6ffa589bfb7d02bfb324e55d493b94f4";
+  };
+
+  nativeBuildInputs = [ setuptools_scm toml ];
+
+  propagatedBuildInputs = [ more-itertools backports_functools_lru_cache ];
+
+  doCheck = false;
+
+  pythonNamespaces = [ "jaraco" ];
+
+  meta = with lib; {
+    description = "Additional functools in the spirit of stdlib's functools";
+    homepage = "https://github.com/jaraco/jaraco.functools";
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jaraco_itertools/0001-Don-t-run-flake8-checks-during-the-build.patch b/nixpkgs/pkgs/development/python-modules/jaraco_itertools/0001-Don-t-run-flake8-checks-during-the-build.patch
new file mode 100644
index 000000000000..2dcf7d648626
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jaraco_itertools/0001-Don-t-run-flake8-checks-during-the-build.patch
@@ -0,0 +1,27 @@
+From fd56b0d85393d684bd3bf99f33d8638da884282f Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?J=C3=B6rg=20Thalheim?= <joerg@thalheim.io>
+Date: Thu, 25 Jun 2020 09:52:11 +0100
+Subject: [PATCH] disable flake8/black8/coverage from tests
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Jörg Thalheim <joerg@thalheim.io>
+---
+ pytest.ini | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/pytest.ini b/pytest.ini
+index 5027d34..4e2a2d2 100644
+--- a/pytest.ini
++++ b/pytest.ini
+@@ -1,5 +1,5 @@
+ [pytest]
+ norecursedirs=dist build .tox .eggs
+-addopts=--doctest-modules --flake8 --black --cov
++addopts=--doctest-modules
+ doctest_optionflags=ALLOW_UNICODE ELLIPSIS ALLOW_BYTES
+ filterwarnings=
+-- 
+2.27.0
+
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..f5d0b0538b66
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jaraco_itertools/default.nix
@@ -0,0 +1,38 @@
+{ lib, buildPythonPackage, fetchPypi, setuptools_scm
+, inflect, more-itertools, six, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "jaraco.itertools";
+  version = "5.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "6447d567f57efe5efea386265c7864652e9530830a1b80f43e60b4f222b9ab84";
+  };
+
+  pythonNamespaces = [ "jaraco" ];
+
+  nativeBuildInputs = [ setuptools_scm ];
+
+  patches = [
+    ./0001-Don-t-run-flake8-checks-during-the-build.patch
+  ];
+
+  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..4a6391fbc489
--- /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.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "31716fe84d3d5df39d95572942513bd4bf8ae0a478f64031eff4c2ea9e83434e";
+  };
+
+  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/2.nix b/nixpkgs/pkgs/development/python-modules/jaraco_stream/2.nix
new file mode 100644
index 000000000000..e1737083c86c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jaraco_stream/2.nix
@@ -0,0 +1,13 @@
+{ buildPythonPackage, fetchPypi, setuptools_scm, six }:
+
+buildPythonPackage rec {
+  pname = "jaraco.stream";
+  version = "2.0";
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "196synw4g76yagcflmavi7wakf5cdgsflmvbj7zs616gv03xbsf2";
+  };
+  doCheck = false;
+  buildInputs = [ setuptools_scm ];
+  propagatedBuildInputs = [ six ];
+}
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..9a4f6d972450
--- /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.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "287e1cba9f278e0146fdded6bc40518930813a5584579769aeaa1d0bfd178a73";
+  };
+
+  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..c61c8f689ddc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jaraco_text/default.nix
@@ -0,0 +1,33 @@
+{ lib, buildPythonPackage, fetchPypi, pythonOlder
+, importlib-resources
+, jaraco_functools
+, setuptools_scm
+}:
+
+buildPythonPackage rec {
+  pname = "jaraco.text";
+  version = "3.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1v0hz3h74m31jlbc5bxwkvrx1h2n7887bajrg1n1c3yc4q8qn1z5";
+  };
+
+  pythonNamespaces = [ "jaraco" ];
+
+  nativeBuildInputs =[ setuptools_scm ];
+  propagatedBuildInputs = [
+    jaraco_functools
+  ] ++ lib.optional (pythonOlder "3.7") [ importlib-resources ];
+
+  # no tests in pypi package
+  doCheck = false;
+
+  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/javaobj-py3/default.nix b/nixpkgs/pkgs/development/python-modules/javaobj-py3/default.nix
new file mode 100644
index 000000000000..fae3c2f3958f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/javaobj-py3/default.nix
@@ -0,0 +1,28 @@
+{ buildPythonPackage
+, fetchPypi
+, isPy27
+, lib
+}:
+
+buildPythonPackage rec {
+  pname = "javaobj-py3";
+  version = "0.4.1";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "419ff99543469e68149f875abb0db5251cecd350c03d2bfb4c94a5796f1cbc14";
+  };
+
+  # Tests assume network connectivity
+  doCheck = false;
+
+  meta = {
+    description = "Module for serializing and de-serializing Java objects";
+    homepage = "https://github.com/tcalmant/python-javaobj";
+    license = lib.licenses.asl20;
+    maintainers = with lib.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..a9acf380da10
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/javaproperties/default.nix
@@ -0,0 +1,32 @@
+{ lib, buildPythonPackage, fetchFromGitHub
+, six
+, pytest
+, dateutil
+}:
+
+buildPythonPackage rec {
+  version = "0.7.0";
+  pname = "javaproperties";
+
+  src = fetchFromGitHub {
+    owner = "jwodder";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "14dlzwr4gxlbgjy012i4pqs2rn2rmp21w8n1k1wwjkf26mcvrq5s";
+  };
+
+  propagatedBuildInputs = [ six ];
+
+  checkInputs = [ 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/jc/default.nix b/nixpkgs/pkgs/development/python-modules/jc/default.nix
new file mode 100644
index 000000000000..6f120fa6ea2e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jc/default.nix
@@ -0,0 +1,33 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, ruamel_yaml
+, xmltodict
+, pygments
+, isPy27
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "jc";
+  version = "1.14.1";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "kellyjonbrazil";
+    repo = "jc";
+    rev = "v${version}";
+    sha256 = "1vzzz7dlg6apxhcl0qkfdpp2v9d0q6jyafpfmklkcbjs31zvwcsw";
+  };
+
+  propagatedBuildInputs = [ ruamel_yaml xmltodict pygments ];
+
+  checkInputs = [ pytestCheckHook ];
+
+  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..d4aa49c3ca3c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jdatetime/default.nix
@@ -0,0 +1,19 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, six }:
+
+buildPythonPackage rec {
+  pname = "jdatetime";
+  version = "3.6.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a589e35f0dab89283c1a3de9d70ed6cf657932aaed8e8ce1b0e5801aaab1da67";
+  };
+
+  propagatedBuildInputs = [ six ];
+
+  meta = with lib; {
+    description = "Jalali datetime binding for python";
+    homepage = "https://pypi.python.org/pypi/jdatetime";
+    license = licenses.psfl;
+  };
+}
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/default.nix b/nixpkgs/pkgs/development/python-modules/jedi/default.nix
new file mode 100644
index 000000000000..6e833a774604
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jedi/default.nix
@@ -0,0 +1,34 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub, fetchPypi, pytest, glibcLocales, tox, pytestcov, parso }:
+
+buildPythonPackage rec {
+  pname = "jedi";
+  # switch back to stable version on the next release.
+  # current stable is incompatible with parso
+  version = "2020-08-06";
+
+  src = fetchFromGitHub {
+    owner = "davidhalter";
+    repo = "jedi";
+    rev = "216f976fd5cab7a460e5d287e853d11759251e52";
+    sha256 = "1kb2ajzigadl95pnwglg8fxz9cvpg9hx30hqqj91jkgrc7djdldj";
+    fetchSubmodules = true;
+  };
+
+  checkInputs = [ pytest glibcLocales tox pytestcov ];
+
+  propagatedBuildInputs = [ parso ];
+
+  checkPhase = ''
+    LC_ALL="en_US.UTF-8" py.test test
+  '';
+
+  # tox required for tests: https://github.com/davidhalter/jedi/issues/808
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/davidhalter/jedi";
+    description = "An autocompletion tool for Python that can be used for text editors";
+    license = licenses.lgpl3Plus;
+    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..84096c6db4f9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jeepney/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, pytest
+, testpath
+, tornado
+, trio
+}:
+
+buildPythonPackage rec {
+  pname = "jeepney";
+  version = "0.6.0";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "7d59b6622675ca9e993a6bd38de845051d315f8b0c72cca3aef733a20b648657";
+  };
+
+  propagatedBuildInputs = [
+    tornado
+  ];
+
+  checkInputs = [
+    pytest
+    testpath
+    trio
+  ];
+
+  checkPhase = ''
+    pytest
+  '';
+
+  meta = with lib; {
+    homepage = "https://gitlab.com/takluyver/jeepney";
+    description = "Pure Python DBus interface";
+    license = licenses.mit;
+  };
+}
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..33c14dbaeb2d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jellyfin-apiclient-python/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, fetchFromGitHub, requests
+, websocket_client, pythonOlder }:
+
+buildPythonPackage rec {
+  pname = "jellyfin-apiclient-python";
+  version = "1.6.1";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "iwalton3";
+    repo = "jellyfin-apiclient-python";
+    rev = "v${version}";
+    sha256 = "0f7czq83ic22fz1vnf0cavb7l3grcxxd5yyw9wcjz3g1j2d76735";
+  };
+
+  propagatedBuildInputs = [ requests websocket_client ];
+
+  pythonImportsCheck = [ "jellyfin_apiclient_python" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/iwalton3/jellyfin-apiclient-python";
+    description = "Python API client for Jellyfin";
+    license = licenses.gpl3;
+    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..9f4b57ba8979
--- /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.8.2";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "02q3d9b933hf8lyvg7w7lgmhij8bjs748vjmsfxhabai04a796d4";
+  };
+
+  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..7d4f6dd93639
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jenkins-job-builder/default.nix
@@ -0,0 +1,36 @@
+{ lib, buildPythonPackage, fetchPypi, isPy27
+, fasteners
+, jinja2
+, pbr
+, python-jenkins
+, pyyaml
+, six
+, stevedore
+}:
+
+buildPythonPackage rec {
+  pname = "jenkins-job-builder";
+  version = "3.8.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-uRyeRP1y3GS7tXb0kHLBi7+trJRme/Ke3xgOY+LqZ6k=";
+  };
+
+  postPatch = ''
+    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..912c21cc8fb4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jenkinsapi/default.nix
@@ -0,0 +1,40 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, mock
+, pytest
+, pytest-mock
+, pytz
+, requests
+, requests-kerberos
+, toml
+}:
+
+buildPythonPackage rec {
+  pname = "jenkinsapi";
+  version = "0.3.11";
+
+  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..b515cd92b23b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jieba/default.nix
@@ -0,0 +1,33 @@
+{ 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;
+  };
+}
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..5dc3cbe105e5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jinja2/default.nix
@@ -0,0 +1,41 @@
+{ lib, stdenv
+, buildPythonPackage
+, isPy3k
+, fetchPypi
+, pytest
+, markupsafe
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "Jinja2";
+  version = "2.11.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "89aab215427ef59c34ad58735269eb58b1a5808103067f7bb9d5836c651b3bb0";
+  };
+
+  checkInputs = [ pytest ];
+  propagatedBuildInputs = [ markupsafe setuptools ];
+
+  # Multiple tests run out of stack space on 32bit systems with python2.
+  # See https://github.com/pallets/jinja/issues/1158
+  doCheck = !stdenv.is32bit || isPy3k;
+
+  checkPhase = ''
+    pytest -v tests
+  '';
+
+  meta = with lib; {
+    homepage = "http://jinja.pocoo.org/";
+    description = "Stand-alone template engine";
+    license = licenses.bsd3;
+    longDescription = ''
+      Jinja2 is a template engine written in pure Python. It provides a
+      Django inspired non-XML syntax but supports inline expressions and
+      an optional sandboxed environment.
+    '';
+    maintainers = with maintainers; [ pierron sjourdois ];
+  };
+}
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..0a6d0c365a04
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jinja2_pluralize/default.nix
@@ -0,0 +1,23 @@
+{ lib, stdenv, 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..7887fe96f75e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jinja2_time/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv
+, 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..78aaadf690e2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jira/default.nix
@@ -0,0 +1,35 @@
+{ lib, buildPythonPackage, fetchPypi, isPy3k
+, pytest, pytestrunner, pbr, glibcLocales , pytestcov
+, requests, requests_oauthlib, requests_toolbelt, defusedxml
+, ipython
+}:
+
+buildPythonPackage rec {
+  pname = "jira";
+  version = "2.0.0";
+
+  PBR_VERSION = version;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "e2a94adff98e45b29ded030adc76103eab34fa7d4d57303f211f572bedba0e93";
+  };
+
+  buildInputs = [ glibcLocales pytest pytestcov pytestrunner pbr ];
+  propagatedBuildInputs = [ requests requests_oauthlib requests_toolbelt defusedxml pbr ipython ];
+
+  # impure tests because of connectivity attempts to jira servers
+  doCheck = false;
+
+  patches = [ ./sphinx-fix.patch ];
+
+  LC_ALL = "en_US.utf8";
+
+  disabled = !isPy3k;
+
+  meta = with lib; {
+    description = "This library eases the use of the JIRA REST API from Python.";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ globin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jira/sphinx-fix.patch b/nixpkgs/pkgs/development/python-modules/jira/sphinx-fix.patch
new file mode 100644
index 000000000000..ccc47ac4b9cf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jira/sphinx-fix.patch
@@ -0,0 +1,11 @@
+diff --git a/setup.py b/setup.py
+index c49a24d..31aeec2 100644
+--- a/setup.py
++++ b/setup.py
+@@ -11,5 +11,5 @@ except ImportError:
+ 
+ 
+ setuptools.setup(
+-    setup_requires=['pbr>=3.0.0', 'setuptools>=17.1', 'pytest-runner', 'sphinx>=1.6.5'],
++    setup_requires=['pbr>=3.0.0', 'setuptools>=17.1', 'pytest-runner'],
+     pbr=True)
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..3b31700de0eb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jmespath/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, ply
+, nose
+}:
+
+buildPythonPackage rec {
+  pname = "jmespath";
+  version = "0.10.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b85d0567b8666149a93172712e68920734333c0ce7e89b78b3e987f71e5ed4f9";
+  };
+
+  buildInputs = [ nose ];
+  propagatedBuildInputs = [ ply ];
+
+  meta = with lib; {
+    homepage = "https://github.com/boto/jmespath";
+    description = "JMESPath allows you to declaratively specify how to extract elements from a JSON document";
+    license = "BSD";
+  };
+
+}
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..16edf3c04e14
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/joblib/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, pythonOlder
+, buildPythonPackage
+, fetchPypi
+, stdenv
+, numpydoc
+, pytestCheckHook
+, python-lz4
+, setuptools
+, sphinx
+}:
+
+
+buildPythonPackage rec {
+  pname = "joblib";
+  version = "0.17.0";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "9e284edd6be6b71883a63c9b7f124738a3c16195513ad940eae7e3438de885d5";
+  };
+
+  checkInputs = [ sphinx numpydoc pytestCheckHook ];
+  propagatedBuildInputs = [ python-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
+  ] ++ 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..77789fa44dbe
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/johnnycanencrypt/default.nix
@@ -0,0 +1,99 @@
+{ lib
+, stdenv
+, rustPlatform
+, fetchFromGitHub
+, pipInstallHook
+, llvmPackages
+, pkg-config
+, maturin
+, pcsclite
+, nettle
+, python
+, requests
+, vcrpy
+, numpy
+, pytestCheckHook
+, pythonOlder
+, PCSC
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "johnnycanencrypt";
+  version = "0.5.0";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "kushaldas";
+    repo = "johnnycanencrypt";
+    rev = "v${version}";
+    sha256 = "192wfrlyylrpzq70yki421mi1smk8q2cyki2a1d03q7h6apib3j4";
+  };
+  cargoPatches = [ ./Cargo.lock.patch ];
+
+  cargoSha256 = "0ifvpdizcdp2c5x2x2j1bhhy5a75q0pk7a63dmh52mlpmh45fy6r";
+
+  LIBCLANG_PATH = llvmPackages.libclang + "/lib";
+
+  propagatedBuildInputs = [
+    requests
+    vcrpy
+  ];
+
+  nativeBuildInputs = [
+    llvmPackages.clang
+    pkg-config
+    python
+    maturin
+    pipInstallHook
+  ];
+
+  buildInputs = [
+    pcsclite
+    nettle
+  ] ++ lib.optionals stdenv.isDarwin [ PCSC ];
+
+  # 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
+  '';
+
+  buildPhase = ''
+    runHook preBuild
+    maturin build --release --manylinux off --strip --cargo-extra-args="-j $NIX_BUILD_CORES --frozen"
+    runHook postBuild
+  '';
+
+  installPhase = ''
+    install -Dm644 -t dist target/wheels/*.whl
+    pipInstallPhase
+  '';
+
+  preCheck = ''
+    export TESTDIR=$(mktemp -d)
+    cp -r tests/ $TESTDIR
+    pushd $TESTDIR
+  '';
+
+  postCheck = ''
+    popd
+  '';
+
+  pythonImportsCheck = [ "johnnycanencrypt" ];
+
+  meta = with lib; {
+    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..8c1fe0a7d366
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/josepy/default.nix
@@ -0,0 +1,35 @@
+{ lib, fetchPypi, buildPythonPackage
+# buildInputs
+, six
+, setuptools
+, pyopenssl
+, cryptography
+}:
+
+buildPythonPackage rec {
+  pname = "josepy";
+  version = "1.5.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "502a36f86efe2a6d09bf7018bca9fd8f8f24d8090a966aa037dbc844459ff9c8";
+  };
+
+  propagatedBuildInputs = [
+    pyopenssl
+    cryptography
+    six
+    setuptools
+  ];
+
+  # too many unpackaged check requirements
+  doCheck = false;
+
+  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/jpylyzer/default.nix b/nixpkgs/pkgs/development/python-modules/jpylyzer/default.nix
new file mode 100644
index 000000000000..c5c9cdf15056
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jpylyzer/default.nix
@@ -0,0 +1,30 @@
+{ lib, stdenv
+, fetchFromGitHub
+, buildPythonPackage
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "jpylyzer";
+  version = "1.18.0";
+
+  src = fetchFromGitHub {
+    owner = "openpreserve";
+    repo = pname;
+    rev = version;
+    sha256 = "0vhrq15l6jd5fm6vj7mczjzjpl2ph1dk8jp89dw4vlccky8660ll";
+  };
+
+  propagatedBuildInputs = [ six ];
+
+  # there don't appear to be any in-tree tests as such, but the builder's automatic
+  # runner seems to be upset by the project layout
+  doCheck = false;
+
+  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..3d4097b07186
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jq/default.nix
@@ -0,0 +1,21 @@
+{ buildPythonPackage, fetchPypi, lib, jq }:
+
+buildPythonPackage rec {
+  pname = "jq";
+  version = "1.1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "62d649c4f6f26ed91810c8db075f5fe05319c3dc99dbebcd2d31b0b697a4592e";
+  };
+  patches = [ ./jq-py-setup.patch ];
+
+  buildInputs = [ 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..df5245a0c3b5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jq/jq-py-setup.patch
@@ -0,0 +1,147 @@
+From 968ddf2bd773e800e46737fced743bd00af9aa0d Mon Sep 17 00:00:00 2001
+From: William Kral <william.kral@gmail.com>
+Date: Tue, 8 Sep 2020 22:04:24 -0700
+Subject: [PATCH] Vastly simplify setup.py for distro compatibility
+
+---
+ setup.py | 101 ++-----------------------------------------------------
+ 1 file changed, 2 insertions(+), 99 deletions(-)
+
+diff --git a/setup.py b/setup.py
+index cb63f60..87380ed 100644
+--- a/setup.py
++++ b/setup.py
+@@ -1,114 +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=[
+-                ["autoreconf", "-i"],
+-                ["./configure", "CFLAGS=-fPIC", "--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'] = 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,8 +25,7 @@ setup(
+     url='http://github.com/mwilliamson/jq.py',
+     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},
++    ext_modules=[jq_extension],
+     classifiers=[
+         'Development Status :: 5 - Production/Stable',
+         'Intended Audience :: Developers',
+@@ -137,4 +41,3 @@ setup(
+         'Programming Language :: Python :: 3.8',
+     ],
+ )
+-
+-- 
+2.28.0
+
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..a5468fa273b5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jsbeautifier/default.nix
@@ -0,0 +1,21 @@
+{ lib, fetchPypi, buildPythonApplication, editorconfig, pytest, six }:
+
+buildPythonApplication rec {
+  pname = "jsbeautifier";
+  version = "1.13.0";
+
+  propagatedBuildInputs = [ six editorconfig ];
+  checkInputs = [ pytest ];
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f5565fbcd95f79945e124324815e586ae0d2e43df5af82a4400390e6ea789e8b";
+  };
+
+  meta = with lib; {
+    homepage    = "http://jsbeautifier.org";
+    description = "JavaScript unobfuscator and beautifier.";
+    license     = licenses.mit;
+    maintainers = with maintainers; [ apeyroux ];
+  };
+}
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..f11fccb086bc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jsmin/default.nix
@@ -0,0 +1,17 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "jsmin";
+  version = "2.2.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0fsmqbjvpxvff0984x7c0y8xmf49ax9mncz48b9xjx8wrnr9kpxn";
+  };
+
+  meta = with lib; {
+    description = "JavaScript minifier";
+    homepage = "https://github.com/tikitu/jsmin/";
+    license = licenses.mit;
+  };
+}
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-schema-for-humans/default.nix b/nixpkgs/pkgs/development/python-modules/json-schema-for-humans/default.nix
new file mode 100644
index 000000000000..4e762e456ceb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/json-schema-for-humans/default.nix
@@ -0,0 +1,35 @@
+{ lib, buildPythonPackage, fetchFromGitHub
+, pbr, click, dataclasses-json, htmlmin, jinja2, markdown2, pygments, pytz, pyyaml, requests, pytestCheckHook, beautifulsoup4, tox
+}:
+
+buildPythonPackage rec {
+  pname = "json-schema-for-humans";
+  version = "0.27.1";
+
+  src = fetchFromGitHub {
+    owner = "coveooss";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0d2a4a2lcqssr5g9rmc76f86nkqc9grixh507vzc9fi1h3gbi765";
+  };
+
+  nativeBuildInputs = [ pbr ];
+  propagatedBuildInputs = [
+    click dataclasses-json htmlmin jinja2 markdown2
+    pygments pytz pyyaml requests
+  ];
+
+  preBuild = ''
+    export PBR_VERSION=0.0.1
+  '';
+
+  checkInputs = [ pytestCheckHook beautifulsoup4 ];
+  pytestFlagsArray = [ "--ignore tests/generate_test.py" ];
+
+  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/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..2a622d913a81
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jsondiff/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "jsondiff";
+  version = "1.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "00v3689175aqzdscrxpffm712ylp8jvcpqdg51ca22ni6721p51l";
+  };
+
+  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..07ee609d6534
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jsonfield/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv, 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..82ddb3bf23a7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jsonlines/default.nix
@@ -0,0 +1,28 @@
+{ lib, fetchFromGitHub, buildPythonPackage, six
+, flake8, pep8-naming, pytest, pytestcov }:
+
+buildPythonPackage rec {
+  pname = "jsonlines";
+  version = "1.2.0";
+
+  src = fetchFromGitHub {
+    owner = "wbolster";
+    repo = pname;
+    rev = version;
+    sha256 = "1f8zsqy8p9a41gqg2a5x7sppc5qhhq7gw58id2aigb270yxzs7jw";
+  };
+
+  propagatedBuildInputs = [ six ];
+
+  checkInputs = [ flake8 pep8-naming pytest pytestcov ];
+  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; [ sondr3 ];
+    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..4fc558fd394e
--- /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.7.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "2004a421890311176136fb911c339c4bab45984808814feaed6a328c6e211ba2";
+  };
+
+  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..8971bac4b497
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jsonpatch/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, jsonpointer
+}:
+
+buildPythonPackage rec {
+  pname = "jsonpatch";
+  version = "1.27";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "4d08af10d71723b5b2924da6ba90f273a4d1a5c6accfb605eb970cb2f9b29cf9";
+  };
+
+  # test files are missing
+  doCheck = false;
+  propagatedBuildInputs = [ jsonpointer ];
+
+  meta = {
+    description = "Library to apply JSON Patches according to RFC 6902";
+    homepage = "https://github.com/stefankoegl/python-json-patch";
+    license = lib.licenses.bsd2; # "Modified BSD license, says pypi"
+  };
+}
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..81a6eb3fb27b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jsonpath_rw/default.nix
@@ -0,0 +1,31 @@
+{ lib, stdenv
+, 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..66e7d62aa839
--- /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 = "1.4.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "e8d4b7cd0bd6826001a74377df1079a76ad8bae0f909282de2554164c837c8ba";
+  };
+
+  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..e1eaaed6c178
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jsonpointer/default.nix
@@ -0,0 +1,21 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "jsonpointer";
+  version = "2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0qjkjy1qlyc1nl3k95wd03ssxac0a717x8889ypgs1cfcj3bm4n1";
+  };
+
+  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..b901d811a230
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jsonref/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv, 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; [ nand0p ];
+    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..0b77db5df4e6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jsonrpc-async/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi
+, aiohttp, jsonrpc-base }:
+
+buildPythonPackage rec {
+  pname = "jsonrpc-async";
+  version = "1.1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "383f331e28cd8f6e3fa86f3e7052efa541b7ae8bf328a4e692aa045cfc0ecf25";
+  };
+
+  propagatedBuildInputs = [ aiohttp jsonrpc-base ];
+
+  meta = with lib; {
+    description = "A JSON-RPC client library for asyncio";
+    homepage = "https://github.com/armills/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..cc4bd1b2f686
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jsonrpc-base/default.nix
@@ -0,0 +1,20 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "jsonrpc-base";
+  version = "1.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "7f374c57bfa1cb16d1f340d270bc0d9f1f5608fb1ac6c9ea15768c0e6ece48b7";
+  };
+
+  propagatedBuildInputs = [ ];
+
+  meta = with lib; {
+    description = "A JSON-RPC client library base interface";
+    homepage = "https://github.com/armills/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..d14d382f013c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jsonrpc-websocket/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi
+, aiohttp, jsonrpc-base, pep8
+, pytestCheckHook
+, pytest-asyncio
+}:
+
+buildPythonPackage rec {
+  pname = "jsonrpc-websocket";
+  version = "1.2.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "c343d057b572791ed3107b771c17358bc710772a9a6156047a3cfafb409ed895";
+  };
+
+  nativeBuildInputs = [ pep8 ];
+
+  propagatedBuildInputs = [ aiohttp jsonrpc-base ];
+
+  checkInputs = [ pytestCheckHook pytest-asyncio ];
+  pytestFlagsArray = [ "tests.py" ];
+
+  meta = with lib; {
+    description = "A JSON-RPC websocket client library for asyncio";
+    homepage = "https://github.com/armills/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..570fb0a1d1a1
--- /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.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "340915c17ebef7451948341542bf4789fc8d8c9fe604e86f00b722b6074a89f0";
+  };
+
+  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/jsonrpclib/default.nix b/nixpkgs/pkgs/development/python-modules/jsonrpclib/default.nix
new file mode 100644
index 000000000000..d37b4ce3ccb2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jsonrpclib/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, cjson
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "jsonrpclib";
+  version = "0.1.7";
+
+  disabled = isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "02vgirw2bcgvpcxhv5hf3yvvb4h5wzd1lpjx8na5psdmaffj6l3z";
+  };
+
+  propagatedBuildInputs = [ cjson ];
+
+  meta = with lib; {
+    description = "JSON RPC client library";
+    homepage = "https://pypi.python.org/pypi/jsonrpclib/";
+    license = lib.licenses.asl20;
+    maintainers = [ lib.maintainers.joachifm ];
+  };
+}
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..d90040c4269f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jsonschema/default.nix
@@ -0,0 +1,39 @@
+{ lib, buildPythonPackage, fetchPypi, python, isPy27
+, attrs
+, functools32
+, importlib-metadata
+, mock
+, nose
+, pyperf
+, pyrsistent
+, setuptools_scm
+, twisted
+, vcversioner
+}:
+
+buildPythonPackage rec {
+  pname = "jsonschema";
+  version = "3.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "c8a85b28d377cc7737e46e2d9f2b4f44ee3c0e1deac6bf46ddefc7187d30797a";
+  };
+
+  nativeBuildInputs = [ setuptools_scm ];
+  propagatedBuildInputs = [ attrs importlib-metadata functools32 pyrsistent ];
+  checkInputs = [ nose mock pyperf twisted vcversioner ];
+
+  # zope namespace collides on py27
+  doCheck = !isPy27;
+  checkPhase = ''
+    nosetests
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/Julian/jsonschema";
+    description = "An implementation of JSON Schema validation for Python";
+    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..9042498664a8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jsonstreams/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, fetchFromGitHub, pytestCheckHook, six, }:
+
+buildPythonPackage rec {
+  pname = "jsonstreams";
+  version = "0.5.0";
+
+  src = fetchFromGitHub {
+    owner = "dcbaker";
+    repo = pname;
+    rev = version;
+    sha256 = "0c85fdqkj5k4b0v0ngx2d9qbmzdsvglh4j9k9h7508bvn7l8fa4b";
+  };
+
+  propagatedBuildInputs = [ six ];
+
+  checkInputs = [ pytestCheckHook ];
+  pytestFlagsArray = [ "tests --doctest-modules jsonstreams" ];
+
+  meta = with lib; {
+    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/jsonwatch/default.nix b/nixpkgs/pkgs/development/python-modules/jsonwatch/default.nix
new file mode 100644
index 000000000000..feced9442257
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jsonwatch/default.nix
@@ -0,0 +1,35 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchurl
+, six
+, isPyPy
+}:
+
+buildPythonPackage {
+  pname = "jsonwatch";
+  version = "0.2.0";
+  disabled = isPyPy; # doesn't find setuptools
+
+  src = fetchurl {
+    url = "https://github.com/dbohdan/jsonwatch/archive/v0.2.0.tar.gz";
+    sha256 = "04b616ef97b9d8c3887004995420e52b72a4e0480a92dbf60aa6c50317261e06";
+  };
+
+  propagatedBuildInputs = [ six ];
+
+  meta = with lib; {
+    description = "Like watch -d but for JSON";
+    longDescription = ''
+      jsonwatch is a command line utility with which you can track
+      changes in JSON data delivered by a shell command or a web
+      (HTTP/HTTPS) API.  jsonwatch requests data from the designated
+      source repeatedly at a set interval and displays the
+      differences when the data changes. It is similar in its
+      behavior to how watch(1) with the -d switch works for
+      plain-text data.
+    '';
+    homepage = "https://github.com/dbohdan/jsonwatch";
+    license = licenses.mit;
+    platforms = platforms.all;
+  };
+}
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..eff6accaa024
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jug/default.nix
@@ -0,0 +1,34 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, fetchpatch
+, nose, numpy
+, bottle, pyyaml, redis, six
+, zlib
+, pytestCheckHook }:
+
+buildPythonPackage rec {
+  pname = "Jug";
+  version = "2.0.3";
+  buildInputs = [ nose numpy ];
+  propagatedBuildInputs = [
+    bottle
+    pyyaml
+    redis
+    six
+
+    zlib
+  ];
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "3656355c1f9cd1731065c9d589f66d33653cbe5e0879cbe5d8447b51e4ddb4ec";
+  };
+
+  checkInputs = [ pytestCheckHook ];
+  pythonImportsCheck = [ "jug" ];
+
+  meta = with lib; {
+    description = "A Task-Based Parallelization Framework";
+    license = licenses.mit;
+    homepage = "https://jug.readthedocs.io/";
+    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..d9234d836b0f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/junos-eznc/default.nix
@@ -0,0 +1,44 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, six
+, scp
+, pyserial
+, paramiko
+, netaddr
+, ncclient
+, ntc-templates
+, lxml
+, jinja2
+, pyyaml
+, transitions
+, yamlordereddictloader
+, nose
+}:
+
+buildPythonPackage rec {
+  pname = "junos-eznc";
+  version = "2.5.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "bf036d0af9ee5c5e4f517cb5fc902fe891fa120e18f459805862c53d4a97193a";
+  };
+
+  checkInputs = [ nose ];
+
+  propagatedBuildInputs = [
+    scp six pyserial paramiko netaddr ncclient ntc-templates lxml jinja2 pyyaml transitions yamlordereddictloader
+  ];
+
+  checkPhase = ''
+    nosetests -v --with-coverage --cover-package=jnpr.junos --cover-inclusive -a unit
+  '';
+
+  meta = with lib; {
+    homepage = "http://www.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-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-repo2docker/default.nix b/nixpkgs/pkgs/development/python-modules/jupyter-repo2docker/default.nix
new file mode 100644
index 000000000000..f01605513cb6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jupyter-repo2docker/default.nix
@@ -0,0 +1,52 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, pythonAtLeast
+, docker
+, escapism
+, jinja2
+, pkgs-docker
+, python-json-logger
+, pyyaml
+, ruamel_yaml
+, semver
+, toml
+, traitlets
+}:
+
+buildPythonPackage rec {
+  version = "0.11.0";
+  pname = "jupyter-repo2docker";
+  disabled = !(pythonAtLeast "3.4");
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "7fc2edf0cda1e46f2e7553bfb84a47e6d141b8dac393268ef01ee3504ca6ad94";
+  };
+
+  propagatedBuildInputs = [
+    docker
+    escapism
+    jinja2
+    pkgs-docker
+    python-json-logger
+    ruamel_yaml
+    semver
+    toml
+    traitlets
+  ];
+
+  # tests not packaged with pypi release
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "repo2docker"
+    "repo2docker.app"
+    "repo2docker.utils"
+    "repo2docker.contentproviders.base"
+  ];
+
+  meta = with lib; {
+    homepage = "https://repo2docker.readthedocs.io/en/latest/";
+    description = "Repo2docker: Turn code repositories into Jupyter enabled Docker Images";
+    license = licenses.bsdOriginal;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..4d2efcf00b7a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jupyter-sphinx/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, nbformat
+, sphinx
+, ipywidgets
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "jupyter-sphinx";
+  version = "0.2.4";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "jupyter_sphinx";
+    sha256 = "b5ba1efdd1488b385de0068036a665932ed93998e40ce3a342c60f0926781fd9";
+  };
+
+  propagatedBuildInputs = [ 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..0f0c0d346e6a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jupyter-telemetry/default.nix
@@ -0,0 +1,32 @@
+{ stdenv
+, 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..03d28bbf55d6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jupyter/default.nix
@@ -0,0 +1,34 @@
+{ lib, stdenv
+, 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_client/5.nix b/nixpkgs/pkgs/development/python-modules/jupyter_client/5.nix
new file mode 100644
index 000000000000..201fbec02ca5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jupyter_client/5.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, traitlets
+, jupyter_core
+, pyzmq
+, dateutil
+, isPyPy
+, py
+, tornado
+}:
+
+buildPythonPackage rec {
+  pname = "jupyter_client";
+  version = "5.3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "5efdf4131124d4a0d5789101e74827022585f172d2f4b60cf6fa98e0a7511b25";
+  };
+
+  propagatedBuildInputs = [
+    traitlets
+    jupyter_core
+    pyzmq
+    dateutil
+    tornado
+  ] ++ 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; [  ];
+  };
+}
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..47d3bb6af0c0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jupyter_client/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, traitlets
+, jupyter_core
+, pyzmq
+, dateutil
+, isPyPy
+, py
+, tornado
+}:
+
+buildPythonPackage rec {
+  pname = "jupyter_client";
+  version = "6.1.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "49e390b36fe4b4226724704ea28d9fb903f1a3601b6882ce3105221cd09377a1";
+  };
+
+  propagatedBuildInputs = [
+    traitlets
+    jupyter_core
+    pyzmq
+    dateutil
+    tornado
+  ] ++ 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_console/5.nix b/nixpkgs/pkgs/development/python-modules/jupyter_console/5.nix
new file mode 100644
index 000000000000..440f22b13321
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jupyter_console/5.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, nose
+, jupyter_client
+, ipython
+, ipykernel
+, prompt_toolkit
+, pygments
+}:
+
+buildPythonPackage rec {
+  pname = "jupyter_console";
+  version = "5.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "545dedd3aaaa355148093c5609f0229aeb121b4852995c2accfa64fe3e0e55cd";
+  };
+
+  checkInputs = [ nose ];
+  propagatedBuildInputs = [
+    jupyter_client
+    ipython
+    ipykernel
+    prompt_toolkit
+    pygments
+  ];
+
+  # 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_console/default.nix b/nixpkgs/pkgs/development/python-modules/jupyter_console/default.nix
new file mode 100644
index 000000000000..372698744cf7
--- /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.2.0";
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "7f6194f4f4692d292da3f501c7f343ccd5e36c6a1becf7b7515e23e66d6bf1e9";
+  };
+
+  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..54ea49c34004
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jupyter_core/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, ipython
+, traitlets
+, glibcLocales
+, mock
+, pytest
+, nose
+}:
+
+buildPythonPackage rec {
+  pname = "jupyter_core";
+  version = "4.7.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "aa1f9496ab3abe72da4efe0daab0cb2233997914581f9a071e07498c6add8ed3";
+  };
+
+  checkInputs = [ pytest mock glibcLocales nose ];
+  propagatedBuildInputs = [ ipython traitlets ];
+
+  patches = [ ./tests_respect_pythonpath.patch ];
+
+  checkPhase = ''
+    HOME=$TMPDIR LC_ALL=en_US.utf8 py.test
+  '';
+
+  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/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..71fba8a12225
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jupyterhub-systemdspawner/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, jupyterhub
+, tornado
+, bash
+}:
+
+buildPythonPackage rec {
+  pname = "jupyterhub-systemdspawner";
+  version = "0.15.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b6e2d981657aa5d3794abb89b1650d056524158a3d0f0f706007cae9b6dbeb2b";
+  };
+
+  propagatedBuildInputs = [
+    jupyterhub
+    tornado
+  ];
+
+  postPatch = ''
+    substituteInPlace systemdspawner/systemd.py \
+      --replace "/bin/bash" "${bash}/bin/bash"
+
+    substituteInPlace systemdspawner/systemdspawner.py \
+      --replace "/bin/bash" "${bash}/bin/bash"
+  '';
+
+  meta = with lib; {
+    description = "JupyterHub Spawner using systemd for resource isolation";
+    homepage = "https://github.com/jupyterhub/systemdspawner";
+    license = licenses.bsd3;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..704d9174ebd7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jupyterhub/default.nix
@@ -0,0 +1,127 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchzip
+, alembic
+, ipython
+, jinja2
+, python-oauth2
+, prometheus_client
+, async_generator
+, pamela
+, sqlalchemy
+, tornado
+, traitlets
+, requests
+, notebook
+, pythonOlder
+, nodePackages
+, oauthlib
+, certipy
+, jupyter-telemetry
+}:
+
+let
+  # js/css assets that setup.py tries to fetch via `npm install` when building
+  # from source.
+  bootstrap =
+    fetchzip {
+      url = "https://registry.npmjs.org/bootstrap/-/bootstrap-3.3.7.tgz";
+      sha256 = "0r7s54bbf68ri1na9bbabyf12mcpb6zk5ja2q6z82aw1fa4xi3yd";
+    };
+  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.2.1.tgz";
+      sha256 = "1j6y18miwzafdj8kfpwbmbn9qvgnbnpc7l4arqrhqj33m04xrlgi";
+    };
+  moment =
+    fetchzip {
+      url = "https://registry.npmjs.org/moment/-/moment-2.22.2.tgz";
+      sha256 = "12gb3p0rz5wyjwykv9g0pix7dd352lx1z7rzdjsf2brhwc4ffyip";
+    };
+  requirejs =
+    fetchzip {
+      url = "https://registry.npmjs.org/requirejs/-/requirejs-2.3.4.tgz";
+      sha256 = "0q6mkj0iv341kks06dya6lfs2kdw0n6vc7n4a7aa3ia530fk9vja";
+    };
+
+in
+
+buildPythonPackage rec {
+  pname = "jupyterhub";
+  version = "1.1.0";
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1mqknz0rxqzx4nc57vscvfh2d4znzlzpy83ancqxdaq3b8i70al5";
+  };
+
+  # 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', 'run', 'lessc', '--'" \
+      "'${nodePackages.less}/bin/lessc'"
+
+    substituteInPlace setup.py --replace \
+      "'npm', 'install', '--progress=false'" \
+      "'true'"
+
+    declare -A deps
+    deps[bootstrap]=${bootstrap}
+    deps[font-awesome]=${font-awesome}
+    deps[jquery]=${jquery}
+    deps[moment]=${moment}
+    deps[requirejs]=${requirejs}
+
+    mkdir -p share/jupyter/hub/static/components
+    for dep in "''${!deps[@]}"; do
+      if [ ! -e share/jupyter/hub/static/components/$dep ]; then
+        cp -r ''${deps[$dep]} share/jupyter/hub/static/components/$dep
+      fi
+    done
+  '';
+
+  propagatedBuildInputs = [
+    alembic ipython jinja2 pamela python-oauth2 requests sqlalchemy tornado
+    traitlets prometheus_client async_generator notebook certipy oauthlib
+    jupyter-telemetry
+  ];
+
+  # Disable tests because they take an excessive amount of time to complete.
+  doCheck = false;
+
+
+  meta = with lib; {
+    description = "Serves multiple Jupyter notebook instances";
+    homepage = "https://jupyter.org/";
+    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..3219bd5730bb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jupyterlab-git/default.nix
@@ -0,0 +1,40 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, notebook
+, nbdime
+, git
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "jupyterlab_git";
+  version = "0.23.3";
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "20a4954d8d1b1eb6f9111cd15d6a598bd7ff72b08797cf5e86c5a55827c85a1d";
+  };
+
+  propagatedBuildInputs = [ notebook nbdime git ];
+
+  # all Tests on darwin fail or are skipped due to sandbox
+  doCheck = !stdenv.isDarwin;
+
+  checkInputs = [ pytest ];
+
+  checkPhase = ''
+    pytest jupyterlab_git/ --ignore=jupyterlab_git/tests/test_handlers.py
+  '';
+
+  pythonImportsCheck = [ "jupyterlab_git" ];
+
+  meta = with lib; {
+    description = "Jupyter lab extension for version control with Git.";
+    license = with licenses; [ bsd3 ];
+    homepage = "https://github.com/jupyterlab/jupyterlab-git";
+    maintainers = with maintainers; [ chiroptical ];
+  };
+}
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..f3ea20842aa5
--- /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/default.nix b/nixpkgs/pkgs/development/python-modules/jupyterlab/default.nix
new file mode 100644
index 000000000000..ff725ce18297
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jupyterlab/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, jupyterlab_server
+, notebook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "jupyterlab";
+  version = "2.2.9";
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "3be8f8edea173753dd838c1b6d3bbcb6f5c801121f824a477025c1b6a1d33dc6";
+  };
+
+  propagatedBuildInputs = [ jupyterlab_server notebook ];
+
+  makeWrapperArgs = [
+    "--set" "JUPYTERLAB_DIR" "$out/share/jupyter/lab"
+  ];
+
+  # Depends on npm
+  doCheck = false;
+
+  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..bfbd1cc89e08
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jupyterlab_server/default.nix
@@ -0,0 +1,39 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, notebook
+, jsonschema
+, pythonOlder
+, requests
+, pytest
+, pyjson5
+}:
+
+buildPythonPackage rec {
+  pname = "jupyterlab_server";
+  version = "1.2.0";
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "5431d9dde96659364b7cc877693d5d21e7b80cea7ae3959ecc2b87518e5f5d8c";
+  };
+
+  checkInputs = [ requests pytest ];
+  propagatedBuildInputs = [ notebook jsonschema pyjson5 ];
+
+  # test_listing test fails
+  # this is a new package and not all tests pass
+  doCheck = false;
+
+  checkPhase = ''
+    pytest
+  '';
+
+  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..ba627449c123
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jupytext/default.nix
@@ -0,0 +1,44 @@
+{ lib, buildPythonPackage, fetchPypi, isPy27
+, markdown-it-py
+, nbformat
+, pytest
+, pyyaml
+, toml
+}:
+
+buildPythonPackage rec {
+  pname = "jupytext";
+  version = "1.7.1";
+
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "23123b90c267c67716fe6a022dfae49b84fd3809370d83211f2920eb3106bf40";
+  };
+
+  propagatedBuildInputs = [
+    markdown-it-py
+    nbformat
+    pyyaml
+    toml
+  ];
+
+  checkInputs = [
+    pytest
+  ];
+
+  # requires test notebooks which are not shipped with the pypi release
+  # also, pypi no longer includes tests
+  doCheck = false;
+  checkPhase = ''
+    pytest
+  '';
+
+  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/jwcrypto/default.nix b/nixpkgs/pkgs/development/python-modules/jwcrypto/default.nix
new file mode 100644
index 000000000000..42ed4cf8794b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jwcrypto/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, cryptography
+}:
+
+buildPythonPackage rec {
+  pname = "jwcrypto";
+  version = "0.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b7fee2635bbefdf145399392f5be26ad54161c8271c66b5fe107b4b452f06c24";
+  };
+
+  propagatedBuildInputs = [
+    cryptography
+  ];
+
+  meta = with lib; {
+    description = "Implementation of JOSE Web standards";
+    homepage = "https://github.com/latchset/jwcrypto";
+    license = licenses.lgpl3Plus;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..80b62f1e4483
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/k5test/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, substituteAll
+, six
+, krb5Full
+, findutils
+, which
+}:
+
+buildPythonPackage rec {
+  pname = "k5test";
+  version = "0.9.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1lqp3jgfngyhaxjgj3n230hn90wsylwilh120yjf62h7b1s02mh8";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./fix-paths.patch;
+      inherit findutils krb5Full;
+      # krb5-config is in dev output
+      krb5FullDev = krb5Full.dev;
+      which = "${which}/bin/which";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  # No tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Library for setting up self-contained Kerberos 5 environment";
+    homepage = "https://github.com/pythongssapi/k5test";
+    license = licenses.mit;
+    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..f99835b5f2a3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/k5test/fix-paths.patch
@@ -0,0 +1,90 @@
+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 f57946b..ad78579 100644
+--- a/k5test/realm.py
++++ b/k5test/realm.py
+@@ -181,19 +181,13 @@ class K5Realm(object):
+             return path
+ 
+     def _init_paths(self, **paths):
+-        self.kdb5_util = self._discover_path('kdb5_util',
+-                                             '/usr/sbin/kdb5_util', paths)
+-        self.krb5kdc = self._discover_path('krb5kdc',
+-                                           '/usr/sbin/krb5kdc', paths)
+-        self.kadmin_local = self._discover_path('kadmin_local',
+-                                                '/usr/sbin/kadmin.local',
+-                                                paths)
+-        self.kprop = self._discover_path('kprop', '/usr/sbin/kprop', paths)
+-        self.kadmind = self._discover_path('kadmind',
+-                                           '/usr/sbin/kadmind', paths)
+-
+-        self._kinit = self._discover_path('kinit', '/usr/bin/kinit', paths)
+-        self._klist = self._discover_path('klist', '/usr/bin/klist', paths)
++        self.kdb5_util = '@krb5Full@/bin/kdb5_util'
++        self.krb5kdc = '@krb5Full@/bin/krb5kdc'
++        self.kadmin_local = '@krb5Full@/bin/kadmin.local'
++        self.kprop = '@krb5Full@/bin/kprop'
++        self.kadmind = '@krb5Full@/bin/kadmind'
++        self._kinit = '@krb5Full@/bin/kinit'
++        self._klist = '@krb5Full@/bin/klist'
+ 
+     def _create_conf(self, profile, filename):
+         with open(filename, 'w') as conf_file:
+diff --git a/k5test/unit.py b/k5test/unit.py
+index 4ee7f98..543d662 100644
+--- a/k5test/unit.py
++++ b/k5test/unit.py
+@@ -38,7 +38,7 @@ _KRB_VERSION = None
+ def krb_minversion_test(target_version, problem):
+     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..24a02f7f696a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/kaa-base/default.nix
@@ -0,0 +1,51 @@
+{ lib, stdenv
+, 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..5164004e8ea5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/kaa-metadata/default.nix
@@ -0,0 +1,56 @@
+{ lib, stdenv
+, 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..b147b30c2ce3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/kafka-python/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv, 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..8ff129637375
--- /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.10";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "05a2a3d4adeebc8a465d037999ba8db2cb471a24b41d623d4bcb80aac02ddbc9";
+  };
+
+  # 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..866042b6942c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/kaitaistruct/default.nix
@@ -0,0 +1,17 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "kaitaistruct";
+  version = "0.9";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "3d5845817ec8a4d5504379cc11bd570b038850ee49c4580bc0998c8fb1d327ad";
+  };
+
+  meta = with lib; {
+    description = "Kaitai Struct: runtime library for Python";
+    homepage = "https://github.com/kaitai-io/kaitai_struct_python_runtime";
+    license = licenses.mit;
+  };
+}
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..2a45404919c0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/kajiki/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, Babel
+, pytz
+, nine
+, nose
+}:
+
+buildPythonPackage rec {
+  pname = "Kajiki";
+  version = "0.8.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "bbec46b19285d42769d7c4f5a8a0195b72a62b54cd360a26a8875319d58efef6";
+  };
+
+  propagatedBuildInputs = [ Babel pytz nine ];
+  checkInputs = [ nose ];
+
+  meta = with lib; {
+    description = "Kajiki provides fast well-formed XML templates";
+    homepage = "https://github.com/nandoflorestan/kajiki";
+    license = licenses.mit;
+  };
+
+}
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..dea22059f096
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/kaptan/default.nix
@@ -0,0 +1,32 @@
+{ lib, stdenv
+, 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
+  '';
+
+  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/kazoo/default.nix b/nixpkgs/pkgs/development/python-modules/kazoo/default.nix
new file mode 100644
index 000000000000..d8743776578e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/kazoo/default.nix
@@ -0,0 +1,44 @@
+{ lib, stdenv
+, 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/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..22ae853c043c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/keep/default.nix
@@ -0,0 +1,37 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, PyGithub
+, terminaltables
+, click
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "keep";
+  version = "2.10";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ce71d14110df197ab5afdbd26a14c0bd266b79671118ae1351835fa192e61d9b";
+  };
+
+  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..7a488edf895d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/keepalive/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv
+, 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;
+  };
+
+}
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..437a0193c61d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/keepkey/default.nix
@@ -0,0 +1,33 @@
+{ lib, stdenv, fetchFromGitHub, buildPythonPackage, pytest
+, ecdsa , mnemonic, protobuf, hidapi, trezor }:
+
+buildPythonPackage rec {
+  pname = "keepkey";
+  version = "6.6.0";
+
+  src = fetchFromGitHub {
+    owner = "keepkey";
+    repo = "python-keepkey";
+    rev = "v${version}";
+    sha256 = "1v0ns26ykskn0dpbvz9g6lz4q740qmahvddj3pc3rfbjvg43p3vh";
+  };
+
+  propagatedBuildInputs = [ protobuf hidapi trezor ];
+
+  buildInputs = [ ecdsa mnemonic ];
+
+  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..b9189cf4e167
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/keepkey_agent/default.nix
@@ -0,0 +1,32 @@
+{ lib, stdenv
+, 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..d62a179136f4
--- /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..7274d3d17a69
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/keras/default.nix
@@ -0,0 +1,36 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi
+, pytest, pytestcov, pytest_xdist
+, six, numpy, scipy, pyyaml, h5py
+, keras-applications, keras-preprocessing
+}:
+
+buildPythonPackage rec {
+  pname = "Keras";
+  version = "2.4.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "fedd729b52572fb108a98e3d97e1bac10a81d3917d2103cc20ab2a5f03beb973";
+  };
+
+  checkInputs = [
+    pytest
+    pytestcov
+    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..985339caed53
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/kerberos/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, kerberos
+}:
+
+buildPythonPackage rec {
+  pname = "kerberos";
+  version = "1.3.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "cdd046142a4e0060f96a00eb13d82a5d9ebc0f2d7934393ed559bac773460a2c";
+  };
+
+  nativeBuildInputs = [ kerberos ];
+
+  # No tests in archive
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Kerberos high-level interface";
+    homepage = "https://pypi.python.org/pypi/kerberos";
+    license = licenses.asl20;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/keyring/2.nix b/nixpkgs/pkgs/development/python-modules/keyring/2.nix
new file mode 100644
index 000000000000..ee3b42b9bb85
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/keyring/2.nix
@@ -0,0 +1,33 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi
+, dbus-python, setuptools_scm, entrypoints, secretstorage
+, pytest, pytest-flake8 }:
+
+buildPythonPackage rec {
+  pname = "keyring";
+  version = "18.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0f58jq58jhfzlhix7x2zz7c4ycdvcs1z3sgs4lkr4xxx680wrmk7";
+  };
+
+  nativeBuildInputs = [ setuptools_scm ];
+
+  checkInputs = [ pytest pytest-flake8 ];
+
+  propagatedBuildInputs = [ dbus-python entrypoints ] ++ lib.optional stdenv.isLinux secretstorage;
+
+  doCheck = !stdenv.isDarwin;
+
+  checkPhase = ''
+    py.test
+  '';
+
+  meta = with lib; {
+    description = "Store and access your passwords safely";
+    homepage    = "https://pypi.python.org/pypi/keyring";
+    license     = licenses.psfl;
+    maintainers = with maintainers; [ lovek323 orivej ];
+    platforms   = platforms.unix;
+  };
+}
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..3e26079f1235
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/keyring/default.nix
@@ -0,0 +1,43 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, isPy27, pythonOlder
+, dbus-python
+, entrypoints
+, importlib-metadata
+, pytest
+, pytest-flake8
+, secretstorage
+, setuptools_scm
+, toml
+}:
+
+buildPythonPackage rec {
+  pname = "keyring";
+  version = "21.5.0";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "207bd66f2a9881c835dad653da04e196c678bf104f8252141d2d3c4f31051579";
+  };
+
+  nativeBuildInputs = [
+    setuptools_scm
+    toml
+  ];
+
+  checkInputs = [ pytest pytest-flake8 ];
+
+  propagatedBuildInputs = [ dbus-python entrypoints ]
+  ++ lib.optional stdenv.isLinux secretstorage
+  ++ lib.optionals (pythonOlder "3.8") [ importlib-metadata ];
+
+  # checks try to access a darwin path on linux
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Store and access your passwords safely";
+    homepage    = "https://pypi.python.org/pypi/keyring";
+    license     = licenses.psfl;
+    maintainers = with maintainers; [ lovek323 ];
+    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..bc20ff4e3740
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/keyrings-alt/default.nix
@@ -0,0 +1,41 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, pythonOlder, isPy27, six
+, pytest, backports_unittest-mock, keyring, setuptools_scm, toml
+}:
+
+buildPythonPackage rec {
+  pname = "keyrings.alt";
+  version = "4.0.2";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "cc475635099d6edd7e475c5a479e5b4da5e811a3af04495a1e9ada488d16fe25";
+  };
+
+  postPatch = ''
+    substituteInPlace pytest.ini \
+      --replace "--flake8" ""
+  '';
+
+  nativeBuildInputs = [ setuptools_scm toml ];
+  propagatedBuildInputs = [ six ];
+
+  checkInputs = [ pytest keyring ] ++ lib.optional (pythonOlder "3.3") backports_unittest-mock;
+
+  # heavily relies on importing tests from keyring package
+  doCheck = false;
+  checkPhase = ''
+    py.test
+  '';
+
+  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/keyutils/default.nix b/nixpkgs/pkgs/development/python-modules/keyutils/default.nix
new file mode 100644
index 000000000000..4134c47084a2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/keyutils/default.nix
@@ -0,0 +1,24 @@
+{ lib, buildPythonPackage, fetchFromGitHub, keyutils, pytestrunner, 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";
+  };
+
+  buildInputs = [ keyutils ];
+  checkInputs = [ pytest pytestrunner ];
+
+  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/kitchen/default.nix b/nixpkgs/pkgs/development/python-modules/kitchen/default.nix
new file mode 100644
index 000000000000..1a14b974114e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/kitchen/default.nix
@@ -0,0 +1,16 @@
+{ lib, stdenv, 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/kiwisolver/1_1.nix b/nixpkgs/pkgs/development/python-modules/kiwisolver/1_1.nix
new file mode 100644
index 000000000000..0702e3518e01
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/kiwisolver/1_1.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, stdenv
+, libcxx
+}:
+
+buildPythonPackage rec {
+  pname = "kiwisolver";
+  version = "1.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "53eaed412477c836e1b9522c19858a8557d6e595077830146182225613b11a75";
+  };
+
+  NIX_CFLAGS_COMPILE = lib.optionalString stdenv.isDarwin "-I${libcxx}/include/c++/v1";
+
+  # Does not include tests
+  doCheck = false;
+
+  meta = {
+    description = "A fast implementation of the Cassowary constraint solver";
+    homepage = "https://github.com/nucleic/kiwi";
+    license = lib.licenses.bsd3;
+  };
+
+}
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..d4d62787092b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/kiwisolver/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, stdenv
+, libcxx
+, cppy
+}:
+
+buildPythonPackage rec {
+  pname = "kiwisolver";
+  version = "1.3.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "950a199911a8d94683a6b10321f9345d5a3a8433ec58b217ace979e18f16e248";
+  };
+
+  NIX_CFLAGS_COMPILE = lib.optionalString stdenv.isDarwin "-I${libcxx}/include/c++/v1";
+
+  nativeBuildInputs = [
+    cppy
+  ];
+
+  # Does not include tests
+  doCheck = false;
+
+  meta = {
+    description = "A fast implementation of the Cassowary constraint solver";
+    homepage = "https://github.com/nucleic/kiwi";
+    license = lib.licenses.bsd3;
+  };
+
+}
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..f4c26edd0e4a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/klein/default.nix
@@ -0,0 +1,35 @@
+{ lib, buildPythonPackage, fetchPypi, fetchpatch
+, six, twisted, werkzeug, incremental
+, mock }:
+
+buildPythonPackage rec {
+  pname = "klein";
+  version = "17.10.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "30aaf0d78a987d5dbfe0968a07367ad0c73e02823cc8eef4c54f80ab848370d0";
+  };
+
+  patches = [
+    (fetchpatch {
+      name = "tests-expect-werkzeug-308.patch";
+      url = "https://github.com/twisted/klein/commit/e2a5835b83e37a2bc5faefbfe1890c529b18b9c6.patch";
+      sha256 = "03j0bj3l3hnf7f96rb27i4bzy1iih79ll5bcah7gybdi1wpznh8w";
+    })
+  ];
+
+  propagatedBuildInputs = [ six twisted werkzeug incremental ];
+
+  checkInputs = [ mock twisted ];
+
+  checkPhase = ''
+    trial klein
+  '';
+
+  meta = with lib; {
+    description = "Klein Web Micro-Framework";
+    homepage    = "https://github.com/twisted/klein";
+    license     = licenses.mit;
+  };
+}
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..548896b47286
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/kmapper/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, scikitlearn
+, numpy
+, scipy
+, jinja2
+, pytest
+, networkx
+, matplotlib
+, python-igraph
+, plotly
+, ipywidgets
+}:
+
+buildPythonPackage rec {
+  pname = "kmapper";
+  version = "1.4.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "3bb09d016ae0dc3308c2901f0775139a26e7f689afacea564a74e5627de35cd7";
+  };
+
+  propagatedBuildInputs = [
+    scikitlearn
+    numpy
+    scipy
+    jinja2
+  ];
+
+  checkInputs = [
+    pytest
+    networkx
+    matplotlib
+    python-igraph
+    plotly
+    ipywidgets
+  ];
+
+  checkPhase = ''
+    pytest test --ignore test/test_drawing.py
+  '';
+
+  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/knack/default.nix b/nixpkgs/pkgs/development/python-modules/knack/default.nix
new file mode 100644
index 000000000000..dd45e9672313
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/knack/default.nix
@@ -0,0 +1,54 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchPypi
+, argcomplete
+, colorama
+, jmespath
+, knack
+, pygments
+, pyyaml
+, six
+, tabulate
+, mock
+, vcrpy
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "knack";
+  version = "0.7.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "dfc6aef6760ea9a9620577e01540617678d78cab3111a0f03e8b9f987d0f08ca";
+  };
+
+  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/koji/default.nix b/nixpkgs/pkgs/development/python-modules/koji/default.nix
new file mode 100644
index 000000000000..5f560be4e887
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/koji/default.nix
@@ -0,0 +1,32 @@
+{ lib, fetchurl, buildPythonPackage, isPy3k, pycurl, six, rpm, dateutil }:
+
+buildPythonPackage rec {
+  pname = "koji";
+  version = "1.14.3";
+  format = "other";
+
+  src = fetchurl {
+    url = "https://releases.pagure.org/koji/${pname}-${version}.tar.bz2";
+    sha256 = "0a3kn3qvspvx15imgzzzjsbvw6bqmbk29apbliqwifa9cj7pvb40";
+  };
+
+  propagatedBuildInputs = [ pycurl six rpm dateutil ];
+
+  # Judging from SyntaxError
+  disabled = isPy3k;
+
+  makeFlags = [ "DESTDIR=$(out)" ];
+
+  postInstall = ''
+    mv $out/usr/* $out/
+    cp -R $out/nix/store/*/* $out/
+    rm -rf $out/nix
+  '';
+
+  meta = with lib; {
+    description = "An RPM-based build system";
+    homepage = "https://pagure.io/koji";
+    license = licenses.lgpl21;
+    platforms = platforms.unix;
+  };
+}
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..1aa22a62e19f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/kombu/default.nix
@@ -0,0 +1,46 @@
+{ lib, buildPythonPackage, fetchPypi
+, amqp
+, botocore
+, case
+, Pyro4
+, pytest
+, pytz
+, sqlalchemy
+, importlib-metadata
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "kombu";
+  version = "5.0.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f4965fba0a4718d47d470beeb5d6446e3357a62402b16c510b6a2f251e05ac3c";
+  };
+
+  postPatch = ''
+    substituteInPlace requirements/test.txt \
+      --replace "pytest-sugar" ""
+    substituteInPlace requirements/default.txt \
+      --replace "amqp==2.5.1" "amqp~=2.5"
+  '';
+
+  propagatedBuildInputs = [
+    amqp
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  checkInputs = [ botocore pytest case pytz Pyro4 sqlalchemy ];
+  # test_redis requires fakeredis, which isn't trivial to package
+  checkPhase = ''
+    pytest --ignore t/unit/transport/test_redis.py
+  '';
+
+  meta = with lib; {
+    description = "Messaging library for Python";
+    homepage    = "https://github.com/celery/kombu";
+    license     = licenses.bsd3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/konfig/default.nix b/nixpkgs/pkgs/development/python-modules/konfig/default.nix
new file mode 100644
index 000000000000..e7062bad5ee7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/konfig/default.nix
@@ -0,0 +1,48 @@
+{ lib, buildPythonPackage, fetchFromGitHub, isPy3k, writeText, configparser, six, pytest, glibcLocales }:
+
+buildPythonPackage rec {
+  pname = "konfig";
+  version = "1.1";
+
+  # konfig unconditionaly depend on configparser, even if it is part of
+  # the standard library in python 3.2 or above.
+  disabled = isPy3k;
+
+  # PyPI tarball is missing utf8.ini, required for tests
+  src = fetchFromGitHub {
+    owner = "mozilla-services";
+    repo = pname;
+    rev = version;
+    sha256 = "1h780fbrv275dcik4cs3rincza805z6q726b48r4a0qmh5d8160c";
+  };
+
+  propagatedBuildInputs = [ configparser six ];
+
+  patches = [ (writeText "konfig.patch" ''
+    diff --git a/setup.py b/setup.py
+    index 96fd858..bb4db06 100644
+    --- a/setup.py
+    +++ b/setup.py
+    @@ -20,7 +20,7 @@ setup(name='konfig',
+           author_email="tarek@mozilla.com",
+           include_package_data=True,
+           install_requires = [
+    -        'configparser', 'argparse', 'six'
+    +        'configparser', 'six'
+           ],
+           zip_safe=False,
+           classifiers=classifiers,
+  '') ];
+
+  checkInputs = [ pytest glibcLocales ];
+
+  checkPhase = ''
+    LC_ALL=en_US.utf8 pytest -v konfig/tests
+  '';
+
+  meta = with lib; {
+    description = "Yet Another Config Parser";
+    homepage    = "https://github.com/mozilla-services/konfig";
+    license     = licenses.mpl20;
+  };
+}
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..8ad94d955aec
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/korean-lunar-calendar/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv
+, 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/kubernetes/default.nix b/nixpkgs/pkgs/development/python-modules/kubernetes/default.nix
new file mode 100644
index 000000000000..172180781968
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/kubernetes/default.nix
@@ -0,0 +1,39 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, pythonAtLeast,
+  ipaddress, websocket_client, urllib3, pyyaml, requests_oauthlib, python-dateutil, google-auth, adal,
+  isort, pytest, coverage, mock, sphinx, autopep8, pep8, codecov, recommonmark, nose }:
+
+buildPythonPackage rec {
+  pname = "kubernetes";
+  version = "12.0.1";
+
+  prePatch = ''
+    sed -e 's/sphinx>=1.2.1,!=1.3b1,<1.4 # BSD/sphinx/' -i test-requirements.txt
+
+    # This is used to randomize tests, which is not reproducible. Drop it.
+    sed -e '/randomize/d' -i test-requirements.txt
+  ''
+  # This is a python2 and python3.2 only requiremet since it is a backport of a python-3.3 api.
+  + (if (pythonAtLeast "3.3")  then ''
+    sed -e '/ipaddress/d' -i requirements.txt
+  '' else "");
+
+  doCheck = pythonAtLeast "3";
+  checkPhase = ''
+    py.test --ignore=kubernetes/dynamic/test_client.py
+  '';
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ec52ea01d52e2ec3da255992f7e859f3a76f2bdb51cf65ba8cd71dfc309d8daa";
+  };
+
+  checkInputs = [ isort coverage pytest mock sphinx autopep8 pep8 codecov recommonmark nose ];
+  propagatedBuildInputs = [ ipaddress websocket_client urllib3 pyyaml requests_oauthlib python-dateutil google-auth adal ];
+
+  meta = with lib; {
+    description = "Kubernetes python client";
+    homepage = "https://github.com/kubernetes-client/python";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ lsix ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/labelbox/default.nix b/nixpkgs/pkgs/development/python-modules/labelbox/default.nix
new file mode 100644
index 000000000000..1efe01092124
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/labelbox/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, requests
+, jinja2
+, pillow
+, rasterio
+, shapely
+, ndjson
+, backoff
+, google-api-core
+, backports-datetime-fromisoformat
+}:
+
+buildPythonPackage rec {
+  pname = "labelbox";
+  version = "2.4.9";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "488fb0b2233738c3bba3d3bf67b941f105553b7286cca3099ac0120dd247bd84";
+  };
+
+  propagatedBuildInputs = [
+    jinja2 requests pillow rasterio shapely ndjson backoff
+    google-api-core backports-datetime-fromisoformat
+  ];
+
+  # Test cases are not running on pypi or GitHub
+  doCheck = false;
+  pythonImportsCheck = [ "labelbox" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/Labelbox/Labelbox";
+    description = "Platform API for LabelBox";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ rakesh4g ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/lammps-cython/default.nix b/nixpkgs/pkgs/development/python-modules/lammps-cython/default.nix
new file mode 100644
index 000000000000..4c16010f4af8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lammps-cython/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, fetchurl
+, buildPythonPackage
+, lammps-mpi
+, mpi
+, mpi4py
+, numpy
+, cython
+, pymatgen
+, ase
+, pytestrunner
+, pytest_4
+, pytestcov
+, isPy3k
+, openssh
+}:
+
+buildPythonPackage rec {
+  pname = "lammps-cython";
+  version = "0.5.7";
+  disabled = (!isPy3k);
+
+  src = fetchurl {
+     url = "https://gitlab.com/costrouc/${pname}/-/archive/v${version}/${pname}-v${version}.tar.gz";
+     sha256 = "1wj9scmjdl00af13b5ihfccrjpikrdgkzd88ialam1nkxvxi42bl";
+  };
+
+  buildInputs = [ cython pytestrunner ];
+  checkInputs = [ pytest_4 pytestcov openssh ];
+  propagatedBuildInputs = [ mpi4py pymatgen ase numpy ];
+
+  preBuild = ''
+    echo "Creating lammps.cfg file..."
+    cat << EOF > lammps.cfg
+    [lammps]
+    lammps_include_dir = ${lammps-mpi}/include
+    lammps_library_dir = ${lammps-mpi}/lib
+    lammps_library = lammps_mpi
+
+    [mpi]
+    mpi_include_dir = ${mpi}/include
+    mpi_library_dir = ${mpi}/lib
+    mpi_library     = mpi
+    EOF
+  '';
+
+  meta = {
+    description = "Pythonic Wrapper to LAMMPS using cython";
+    homepage = "https://gitlab.com/costrouc/lammps-cython";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ costrouc ];
+  };
+}
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..f9d90e42686b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/langcodes/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, marisa-trie
+, pythonOlder
+, fetchPypi
+, nose
+}:
+
+buildPythonPackage rec {
+  pname = "langcodes";
+  version = "2.1.0";
+  disabled = pythonOlder "3.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "75bcaca8825e1a321965b136815dee53083c63314975e024ad0ccff8545e681f";
+  };
+
+  propagatedBuildInputs = [ marisa-trie ];
+
+  checkInputs = [ nose ];
+
+  checkPhase = ''
+    nosetests
+  '';
+
+  meta = with lib; {
+    description = "A toolkit for working with and comparing the standardized codes for languages, such as ‘en’ for English or ‘es’ for Spanish";
+    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..57fee2664cdf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/langdetect/default.nix
@@ -0,0 +1,21 @@
+{ lib, buildPythonPackage, fetchPypi, six }:
+
+buildPythonPackage rec {
+  pname = "langdetect";
+  version = "1.0.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "0c5zm6c7xzsigbb9c7v4r33fcpz911zscfwvh3dq1qxdy3ap18ci";
+  };
+
+  propagatedBuildInputs = [ six ];
+
+  meta = with lib; {
+    description = "Python port of Google's language-detection library";
+    homepage = "https://github.com/Mimino666/langdetect";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ earvstedt ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/larch/default.nix b/nixpkgs/pkgs/development/python-modules/larch/default.nix
new file mode 100644
index 000000000000..7708bc0dbc02
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/larch/default.nix
@@ -0,0 +1,32 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchurl
+, sphinx
+, tracing
+, ttystatus
+, cliapp
+}:
+
+buildPythonPackage rec {
+  pname = "larch";
+  version = "1.20131130";
+
+  src = fetchurl {
+    url = "http://code.liw.fi/debian/pool/main/p/python-larch/python-larch_${version}.orig.tar.gz";
+    sha256 = "1hfanp9l6yc5348i3f5sb8c5s4r43y382hflnbl6cnz4pm8yh5r7";
+  };
+
+  buildInputs = [ sphinx ];
+  propagatedBuildInputs = [ tracing ttystatus cliapp ];
+
+  # error: invalid command 'test'
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://liw.fi/larch/";
+    description = "Python B-tree library";
+    license = licenses.gpl3;
+    maintainers = [];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/lark-parser/default.nix b/nixpkgs/pkgs/development/python-modules/lark-parser/default.nix
new file mode 100644
index 000000000000..a95a8907422a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lark-parser/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+}:
+
+buildPythonPackage rec {
+  pname = "lark-parser";
+  version = "0.8.8";
+
+  src = fetchFromGitHub {
+    owner = "lark-parser";
+    repo = "lark";
+    rev = version;
+    sha256 = "1q2dvkkfx9dvag5v5ps0ki4avh7i003gn9sj30jy1rsv1bg4y2mb";
+  };
+
+  # tests of Nearley support require js2py
+  preCheck = ''
+    rm -r tests/test_nearley
+  '';
+
+  meta = {
+    description = "A modern parsing library for Python, implementing Earley & LALR(1) and an easy interface";
+    homepage = "https://github.com/lark-parser/lark";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ fridh ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/lasagne/default.nix b/nixpkgs/pkgs/development/python-modules/lasagne/default.nix
new file mode 100644
index 000000000000..5bddf5cbe6f2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lasagne/default.nix
@@ -0,0 +1,31 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, numpy
+, Theano
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "Lasagne";
+  version = "0.1";
+  disabled = isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0cqj86rdm6c7y5vq3i13qy76fg5xi3yjp4r0hpqy8hvynv54wqrw";
+  };
+
+  propagatedBuildInputs = [ numpy Theano ];
+
+  # there are no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Lightweight library to build and train neural networks in Theano";
+    homepage = "https://github.com/Lasagne/Lasagne";
+    maintainers = with maintainers; [ NikolaMandic ];
+    license = licenses.mit;
+  };
+
+}
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..6c5112312bb3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/launchpadlib/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+, httplib2
+, keyring
+, lazr-restfulclient
+, lazr-uri
+, setuptools
+, six
+, testresources
+, wadllib
+}:
+
+buildPythonPackage rec {
+  pname = "launchpadlib";
+  version = "1.10.13";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "5804d68ec93247194449d17d187e949086da0a4d044f12155fad269ef8515435";
+  };
+
+  propagatedBuildInputs = [
+    httplib2
+    keyring
+    lazr-restfulclient
+    lazr-uri
+    setuptools
+    six
+    testresources
+    wadllib
+  ];
+
+  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.lgpl3;
+    maintainers = [ maintainers.marsam ];
+  };
+}
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..93956c51b256
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lazr-restfulclient/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, isPy27
+, fetchPypi
+, distro
+, httplib2
+, oauthlib
+, setuptools
+, six
+, wadllib
+}:
+
+buildPythonPackage rec {
+  pname = "lazr.restfulclient";
+  version = "0.14.3";
+
+  disabled = isPy27; # namespace is broken for python2
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "9f28bbb7c00374159376bd4ce36b4dacde7c6b86a0af625aa5e3ae214651a690";
+  };
+
+  propagatedBuildInputs = [ distro httplib2 oauthlib setuptools six wadllib ];
+
+  doCheck = false; # requires to package lazr.restful, lazr.authentication, and 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..080eb4cdb0ed
--- /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.5";
+
+  disabled = isPy27; # namespace is broken for python2
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f36e7e40d5f8f2cf20ff2c81784a14a546e6c19c216d40a6617ebe0c96c92c49";
+  };
+
+  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..d8a895c8357b
--- /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.2";
+
+  propagatedBuildInputs = [ lazr_delegates ];
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "cdb9a70dac4a76ca1ff3528d9eafe5414c6c69c1b92e7e84d3477ae85f6bb787";
+  };
+}
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..63784b4005bb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lazy-object-proxy/default.nix
@@ -0,0 +1,33 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, pytest
+, setuptools_scm
+}:
+
+buildPythonPackage rec {
+  pname = "lazy-object-proxy";
+  version = "1.5.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "5944a9b95e97de1980c65f03b79b356f30a43de48682b8bdd90aa5089f0ec1f4";
+  };
+
+  nativeBuildInputs = [ setuptools_scm ];
+
+  checkInputs = [ pytest ];
+  checkPhase = ''
+    py.test tests
+  '';
+
+  # 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..1bc52b3a65c8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lazy_import/default.nix
@@ -0,0 +1,35 @@
+{ lib, stdenv, 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/ldap/default.nix b/nixpkgs/pkgs/development/python-modules/ldap/default.nix
new file mode 100644
index 000000000000..e5cd3d3828e1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ldap/default.nix
@@ -0,0 +1,37 @@
+{ buildPythonPackage, fetchPypi
+, pyasn1, pyasn1-modules, pytest
+, openldap, cyrus_sasl, lib, stdenv }:
+
+buildPythonPackage rec {
+  pname = "python-ldap";
+  version = "3.3.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "198as30xy6p760niqps2zdvq2xcmr765h06pmda8fa9y077wl4a7";
+  };
+
+  propagatedBuildInputs = [ pyasn1 pyasn1-modules ];
+
+  buildInputs = [ openldap cyrus_sasl ];
+
+  checkInputs = [ pytest ];
+
+  checkPhase = ''
+    # 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"
+
+    py.test
+  '';
+
+  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..e1accc4d177e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ldap3/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv, fetchPypi, buildPythonPackage, pyasn1 }:
+
+buildPythonPackage rec {
+  pname = "ldap3";
+  version = "2.8.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "37d633e20fa360c302b1263c96fe932d40622d0119f1bddcb829b03462eeeeb7";
+  };
+
+  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..bc08633da8b4
--- /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 = "2.4.1";
+
+  src = fetchPypi {
+    pname = "ldappool";
+    inherit version;
+    sha256 = "23edef09cba4b1ae764f1ddada828d8e39d72cf32a457e599f5a70064310ea00";
+  };
+
+  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..e3694bffe378
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ldaptor/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, twisted
+, passlib
+, pyopenssl
+, pyparsing
+, service-identity
+, zope_interface
+, isPy3k
+, pythonAtLeast
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "ldaptor";
+  version = "20.1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "778f45d68a0b5d63a892c804c05e57b464413a41d8ae52f92ae569321473ab67";
+  };
+
+  propagatedBuildInputs = [
+    twisted passlib pyopenssl pyparsing service-identity zope_interface
+  ];
+
+  # https://github.com/twisted/ldaptor/pull/210
+  disabled = !isPy3k || pythonAtLeast "3.9";
+
+  checkPhase = ''
+    ${python.interpreter} -m twisted.trial ldaptor
+  '';
+
+  meta = {
+    description = "A Pure-Python Twisted library for LDAP";
+    homepage = "https://github.com/twisted/ldaptor";
+    license = lib.licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/le/default.nix b/nixpkgs/pkgs/development/python-modules/le/default.nix
new file mode 100644
index 000000000000..6415b255c716
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/le/default.nix
@@ -0,0 +1,30 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchurl
+, isPy3k
+, simplejson
+, psutil
+}:
+
+buildPythonPackage rec {
+  pname = "le";
+  version = "1.4.29";
+
+  src = fetchurl {
+    url = "https://github.com/logentries/le/archive/v${version}.tar.gz";
+    sha256 = "d29738937cb6e714b6ec2ae74b66b1983482ffd54b4faa40767af18509521d4c";
+  };
+
+  disabled = isPy3k;
+
+  doCheck = false;
+
+  propagatedBuildInputs = [ simplejson psutil ];
+
+  meta = with lib; {
+    homepage = "https://github.com/rapid7/le";
+    description = "Logentries agent";
+    license = licenses.mit;
+  };
+
+}
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..99c1f080a031
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/leather/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv, fetchPypi, buildPythonPackage, six }:
+
+buildPythonPackage rec {
+  pname = "leather";
+  version = "0.3.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "125r372q7bwcajfdysp7w5zh5wccwxf1mkhqawl8h518nl1icv87";
+  };
+
+  propagatedBuildInputs = [ six ];
+
+  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/ledger_agent/default.nix b/nixpkgs/pkgs/development/python-modules/ledger_agent/default.nix
new file mode 100644
index 000000000000..4fc935799c31
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ledger_agent/default.nix
@@ -0,0 +1,32 @@
+{ lib, stdenv
+, 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..f853dfbf01f9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ledgerblue/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv, fetchPypi, buildPythonPackage, hidapi
+, pycrypto, pillow, protobuf, future, ecpy, python-u2flib-host, pycryptodomex
+, websocket_client
+}:
+
+buildPythonPackage rec {
+  pname = "ledgerblue";
+  version = "0.1.34";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f9553d496fbc6b612d98cc9db2f1648c1bcb63939c988ee1520e8fcb9bd77b24";
+  };
+
+  propagatedBuildInputs = [
+    hidapi pycrypto pillow protobuf future ecpy python-u2flib-host pycryptodomex websocket_client
+  ];
+
+  # No tests
+  doCheck = false;
+
+  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..42bc0c391295
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ledgerwallet/default.nix
@@ -0,0 +1,41 @@
+{ lib, stdenv
+, fetchFromGitHub
+, 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";
+  };
+
+  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; [ xwvvvvwx ];
+  };
+}
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..844e28aa0788
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lektor/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, click
+, watchdog
+, exifread
+, requests
+, mistune
+, inifile
+, Babel
+, jinja2
+, flask
+, pyopenssl
+, ndg-httpsclient
+, pytest
+, pytestcov
+, pytest-mock
+, pytest-pylint
+, pytest-click
+, isPy27
+, functools32
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "lektor";
+  version = "3.1.3";
+
+  src = fetchFromGitHub {
+    owner = "lektor";
+    repo = "lektor";
+    rev = version;
+    sha256 = "16qw68rz5q77w84lwyhjpfd3bm4mfrhcjrnxwwnz3vmi610h68hx";
+  };
+
+  propagatedBuildInputs = [
+    click watchdog exifread requests mistune inifile Babel jinja2
+    flask pyopenssl ndg-httpsclient setuptools
+  ] ++ lib.optionals isPy27 [ functools32 ];
+
+  checkInputs = [
+    pytest pytestcov pytest-mock pytest-pylint pytest-click
+  ];
+
+  checkPhase = ''
+    pytest
+  '';
+
+  # many errors -- tests assume inside of git repo, linting errors 13/317 fail
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A static content management system";
+    homepage    = "https://www.getlektor.com/";
+    license     = licenses.bsd0;
+    maintainers = with maintainers; [ vozz 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/lexid/default.nix b/nixpkgs/pkgs/development/python-modules/lexid/default.nix
new file mode 100644
index 000000000000..4307d52d8913
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lexid/default.nix
@@ -0,0 +1,22 @@
+{ lib, python, pythonOlder, buildPythonPackage, fetchPypi, pytestCheckHook, click }:
+
+buildPythonPackage rec {
+  pname = "lexid";
+  version = "2020.1005";
+  disabled = pythonOlder "3.6";
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "52333a2b9ebd14aa0dfeb33de72bd159c2dc31adb9c59cddfc486e2b69bfdcd1";
+  };
+
+  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..debe88f2f6cc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/libagent/default.nix
@@ -0,0 +1,31 @@
+{ lib, stdenv, fetchFromGitHub, buildPythonPackage, ed25519, ecdsa , semver, mnemonic,
+  unidecode, mock, pytest , backports-shutil-which, ConfigArgParse,
+  python-daemon, pymsgbox }:
+
+buildPythonPackage rec {
+  pname = "libagent";
+  version = "0.14.1";
+
+  src = fetchFromGitHub {
+    owner = "romanz";
+    repo = "trezor-agent";
+    rev = "v${version}";
+    sha256 = "16y1y9ahcv3wj7f0v4mfiwzkmn2hz1iv7y13cgr57sxa3ymyqx6c";
+  };
+
+  propagatedBuildInputs = [ unidecode backports-shutil-which ConfigArgParse
+    python-daemon pymsgbox ecdsa ed25519 mnemonic semver ];
+
+  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.gpl3;
+    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..eb1ce861dd26
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/libais/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi,
+  six, pytest, pytestrunner, pytestcov, coverage
+}:
+buildPythonPackage rec {
+  pname = "libais";
+  version = "0.17";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0pyka09h8nb0vlzh14npq4nxmzg1046lr3klgn97dsf5k0iflapb";
+  };
+
+  # data files missing
+  doCheck = false;
+
+  checkInputs = [ pytest pytestrunner pytestcov 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..73d99afda674
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/libarchive-c/default.nix
@@ -0,0 +1,38 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, pytest
+, glibcLocales
+, libarchive
+, mock
+}:
+
+buildPythonPackage rec {
+  pname = "libarchive-c";
+  version = "2.9";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "9919344cec203f5db6596a29b5bc26b07ba9662925a05e24980b84709232ef60";
+  };
+
+  checkInputs = [ mock pytest glibcLocales ];
+
+  LC_ALL="en_US.UTF-8";
+
+  postPatch = ''
+    substituteInPlace libarchive/ffi.py --replace \
+      "find_library('archive')" "'${libarchive.lib}/lib/libarchive${stdenv.hostPlatform.extensions.sharedLibrary}'"
+  '';
+
+  checkPhase = ''
+    py.test tests -k 'not test_check_archiveentry_with_unicode_entries_and_name_zip and not test_check_archiveentry_using_python_testtar'
+  '';
+
+  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..5a5116de5478
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/libarcus/default.nix
@@ -0,0 +1,33 @@
+{ lib, stdenv, buildPythonPackage, python, fetchFromGitHub
+, cmake, sip, protobuf, pythonOlder }:
+
+buildPythonPackage rec {
+  pname = "libarcus";
+  version = "4.8.0";
+  format = "other";
+
+  src = fetchFromGitHub {
+    owner = "Ultimaker";
+    repo = "libArcus";
+    rev = version;
+    sha256 = "1dvz1rkvm4309yzvj7vy49v1vskr5yfq4nzqdiydp1jb7zpvhqqm";
+  };
+
+  disabled = pythonOlder "3.4.0";
+
+  propagatedBuildInputs = [ sip ];
+  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..fc45622a671d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/libasyncns/default.nix
@@ -0,0 +1,25 @@
+{ 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 ];
+
+  buildInputs = [ libasyncns ];
+  nativeBuildInputs = [ pkg-config ];
+  doCheck = false; # requires network access
+
+  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/2.nix b/nixpkgs/pkgs/development/python-modules/libcloud/2.nix
new file mode 100644
index 000000000000..52c1cf9a9d7f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/libcloud/2.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, mock
+, pycrypto
+, requests
+, pytestrunner
+, pytest
+, requests-mock
+, typing
+, backports_ssl_match_hostname
+}:
+
+buildPythonPackage rec {
+  pname = "apache-libcloud";
+  version = "2.8.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "70096690b24a7832cc5abdfda1954b49fddc1c09a348a1e6caa781ac867ed4c6";
+  };
+
+  checkInputs = [ mock pytest pytestrunner requests-mock ];
+  propagatedBuildInputs = [ pycrypto requests ]
+    ++ lib.optionals isPy27 [ typing backports_ssl_match_hostname ];
+
+  preConfigure = "cp libcloud/test/secrets.py-dist libcloud/test/secrets.py";
+
+  # requires a certificates file
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A unified interface to many cloud providers";
+    homepage = "http://incubator.apache.org/libcloud/";
+    license = licenses.asl20;
+  };
+
+}
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..bda0553b8eee
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/libcloud/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, mock
+, pycrypto
+, requests
+, pytestrunner
+, pytest
+, requests-mock
+, typing
+}:
+
+buildPythonPackage rec {
+  pname = "apache-libcloud";
+  version = "3.3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "2e3e4d02f9b3197f9119e737bc704fba52f34459d4bc96d8ad8f183d600747ba";
+  };
+
+  checkInputs = [ mock pytest pytestrunner requests-mock ];
+  propagatedBuildInputs = [ pycrypto requests ] ++ lib.optionals isPy27 [ typing ];
+
+  preConfigure = "cp libcloud/test/secrets.py-dist libcloud/test/secrets.py";
+
+  # requires a certificates file
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A unified interface to many cloud providers";
+    homepage = "http://incubator.apache.org/libcloud/";
+    license = licenses.asl20;
+  };
+
+}
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..f064c34e1586
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/libcst/default.nix
@@ -0,0 +1,44 @@
+{ lib, buildPythonPackage, fetchFromGitHub, pythonOlder, black, isort
+, pytestCheckHook, pyyaml, typing-extensions, typing-inspect, dataclasses }:
+
+buildPythonPackage rec {
+  pname = "libcst";
+  version = "0.3.13";
+
+  # Some files for tests missing from PyPi
+  # https://github.com/Instagram/LibCST/issues/331
+  src = fetchFromGitHub {
+    owner = "instagram";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0pbddjrsqj641mr6zijk2phfn15dampbx268zcws4bhhhnrxlj65";
+  };
+
+  disabled = pythonOlder "3.6";
+
+  propagatedBuildInputs = [ pyyaml typing-inspect ]
+    ++ lib.optional (pythonOlder "3.7") dataclasses;
+
+  checkInputs = [ black isort pytestCheckHook ];
+
+  # https://github.com/Instagram/LibCST/issues/346
+  # https://github.com/Instagram/LibCST/issues/347
+  preCheck = ''
+    python -m libcst.codegen.generate visitors
+    python -m libcst.codegen.generate return_types
+    rm libcst/tests/test_fuzz.py
+    rm libcst/tests/test_pyre_integration.py
+    rm libcst/metadata/tests/test_full_repo_manager.py
+    rm libcst/metadata/tests/test_type_inference_provider.py
+  '';
+
+  pythonImportsCheck = [ "libcst" ];
+
+  meta = with lib; {
+    description =
+      "A 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; [ maintainers.ruuda ];
+  };
+}
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..4a4ba489e0a6
--- /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.9";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "17agnigmzscmdjqmrylg1lza03hwjhgxbpf4l705s6i7p7ndaqrs";
+  };
+
+  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..567ad2cf4892
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/libgpuarray/default.nix
@@ -0,0 +1,81 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchFromGitHub
+, cmake
+, cython
+, numpy
+, six
+, nose
+, Mako
+, cudaSupport ? false, cudatoolkit , nvidia_x11
+, openclSupport ? true, ocl-icd, clblas
+}:
+
+assert cudaSupport -> nvidia_x11 != null
+                   && cudatoolkit != null;
+
+buildPythonPackage rec {
+  pname = "libgpuarray";
+  version = "0.7.5";
+
+  src = fetchFromGitHub {
+    owner = "Theano";
+    repo = "libgpuarray";
+    rev = "v${version}";
+    sha256 = "0zkdwjq3k6ciiyf8y5w663fbsnmzhgy27yvpxfhkpxazw9vg3l5v";
+  };
+
+  # requires a GPU
+  doCheck = false;
+
+  configurePhase = "cmakeConfigurePhase";
+
+  libraryPath = lib.makeLibraryPath (
+    []
+    ++ lib.optionals cudaSupport [ cudatoolkit.lib cudatoolkit.out nvidia_x11 ]
+    ++ 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
+  '';
+
+  propagatedBuildInputs = [
+    numpy
+    six
+    Mako
+  ];
+
+  nativeBuildInputs = [ cmake ];
+
+  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..cfc687e37c14
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/libkeepass/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv, 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..b824dec172ed
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/liblarch/default.nix
@@ -0,0 +1,48 @@
+{ lib, stdenv
+, fetchFromGitHub
+, buildPythonPackage
+, python
+, pygobject3
+, xvfb_run
+, gobject-introspection
+, gtk3
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  version = "3.0.1";
+  pname = "liblarch";
+  disabled = pythonOlder "3.5.0";
+
+  src = fetchFromGitHub {
+    owner = "getting-things-gnome";
+    repo = "liblarch";
+    rev = "v${version}";
+    sha256 = "0xv2mfvyzipbny3iz8vll77wsqxfwh28xj6bj1ff0l452waph45m";
+  };
+
+  checkInputs = [
+    gobject-introspection # for setup hook
+    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/libmr/default.nix b/nixpkgs/pkgs/development/python-modules/libmr/default.nix
new file mode 100644
index 000000000000..a0ef924e56e6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/libmr/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv, 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..2406738cf1bb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/libnacl/default.nix
@@ -0,0 +1,33 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub, pytest, libsodium }:
+
+buildPythonPackage rec {
+  pname = "libnacl";
+  version = "1.7.1";
+
+  src = fetchFromGitHub {
+    owner = "saltstack";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "10rpim9lf0qd861a3miq8iqg8w87slqwqni7nq66h72jdk130axg";
+  };
+
+  checkInputs = [ pytest ];
+  propagatedBuildInputs = [ 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}')"
+  '';
+
+  checkPhase = ''
+    py.test
+  '';
+
+  meta = with lib; {
+    maintainers = with maintainers; [ xvapx ];
+    description = "Python bindings for libsodium based on ctypes";
+    homepage = "https://pypi.python.org/pypi/libnacl";
+    license = licenses.asl20;
+    platforms = platforms.unix;
+  };
+}
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..777eed4ddb33
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/librosa/default.nix
@@ -0,0 +1,41 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, joblib
+, matplotlib
+, six
+, scikitlearn
+, decorator
+, audioread
+, resampy
+, soundfile
+, pooch
+}:
+
+buildPythonPackage rec {
+  pname = "librosa";
+  version = "0.8.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "af0b9f2ed4bbf6aecbc448a4cd27c16453c397cb6bef0f0cfba0e63afea2b839";
+  };
+
+  propagatedBuildInputs = [ joblib matplotlib six scikitlearn 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/libsass/default.nix b/nixpkgs/pkgs/development/python-modules/libsass/default.nix
new file mode 100644
index 000000000000..9feb5b1d2425
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/libsass/default.nix
@@ -0,0 +1,37 @@
+{ lib, buildPythonPackage, fetchFromGitHub, libsass, six, pytest, werkzeug }:
+
+buildPythonPackage rec {
+  pname = "libsass";
+  version = "0.20.1";
+
+  src = fetchFromGitHub {
+    owner = "sass";
+    repo = "libsass-python";
+    rev = version;
+    sha256 = "1r0kgl7i6nnhgjl44sjw57k08gh2qr7l8slqih550dyxbf1akbxh";
+  };
+
+  buildInputs = [ libsass ];
+
+  propagatedBuildInputs = [ six ];
+
+  preBuild = ''
+    export SYSTEM_SASS=true;
+  '';
+
+  checkInputs = [
+    pytest
+    werkzeug
+  ];
+
+  checkPhase = ''
+    pytest sasstests.py
+  '';
+
+  meta = with lib; {
+    description = "A straightforward binding of libsass for Python. Compile Sass/SCSS in Python with no Ruby stack at all!";
+    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..559289987e6c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/libsavitar/default.nix
@@ -0,0 +1,32 @@
+{ lib, stdenv, buildPythonPackage, python, pythonOlder, fetchFromGitHub, cmake, sip }:
+
+buildPythonPackage rec {
+  pname = "libsavitar";
+  version = "4.8.0";
+  format = "other";
+
+  src = fetchFromGitHub {
+    owner = "Ultimaker";
+    repo = "libSavitar";
+    rev = version;
+    sha256 = "1mxkvnhn8k1a86jlnjnlpf0b8dvrcg3n7pslf60s13cgb7w3sfzh";
+  };
+
+  postPatch = ''
+    sed -i 's#''${Python3_SITEARCH}#${placeholder "out"}/${python.sitePackages}#' cmake/SIPMacros.cmake
+  '';
+
+  nativeBuildInputs = [ cmake ];
+
+  propagatedBuildInputs = [ sip ];
+
+  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..40f1b2f8e9ca
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/libsoundtouch/default.nix
@@ -0,0 +1,34 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, stdenv
+, lib
+, pythonOlder
+, requests
+, enum34
+}:
+
+buildPythonPackage {
+  pname   = "libsoundtouch";
+  version = "0.4.0";
+
+  src = fetchFromGitHub {
+    owner  = "CharlesBlonde";
+    repo   = "libsoundtouch";
+    rev    = "875074b7a23734021974345b3dc297918e453aa2";
+    sha256 = "1psd556j4x77hjxahxxgdgnq2mcd769whvnf0gmwf3jy2svfkqlg";
+  };
+
+  postPatch = lib.optionalString (! (pythonOlder "3.4")) ''
+    substituteInPlace setup.py --replace "'enum34>=1.1.6'" ""
+  '';
+
+  propagatedBuildInputs = [ requests enum34 ];
+
+  doCheck = false;
+
+  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..72e62514a526
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/libthumbor/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, django
+, six
+, pycrypto
+}:
+
+buildPythonPackage rec {
+  pname = "libthumbor";
+  version = "2.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ed4fe5f27f8f90e7285b7e6dce99c1b67d43a140bf370e989080b43d80ce25f0";
+  };
+
+  buildInputs = [ django ];
+  propagatedBuildInputs = [ six pycrypto ];
+
+  doCheck = false;
+
+  meta = with lib; {
+    description = "libthumbor is the python extension to thumbor";
+    homepage = "https://github.com/heynemann/libthumbor";
+    license = licenses.mit;
+  };
+
+}
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..df9728eb334b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/libtmux/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv, fetchPypi, buildPythonPackage, pytest }:
+
+buildPythonPackage rec {
+  pname = "libtmux";
+  version = "0.8.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1d35b9f8451944d31c5ed22ed9e6c8e18034adcc75718fcc5b27fbd9621543e1";
+  };
+
+  checkInputs = [ pytest ];
+  postPatch = ''
+    sed -i 's/==.*$//' requirements/test.txt
+  '';
+
+  # No tests in archive
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Scripting library for tmux";
+    homepage = "https://libtmux.readthedocs.io/";
+    license = licenses.bsd3;
+    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..0446299fd1bd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/libusb1/default.nix
@@ -0,0 +1,34 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, libusb1, pytest }:
+
+buildPythonPackage rec {
+  pname = "libusb1";
+  version = "1.9.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "14ljk7rywy3fiv23dpayvk14y1ywma729r3b1x2cxf68919g2gnh";
+  };
+
+  postPatch = ''
+    substituteInPlace usb1/libusb1.py --replace \
+      "ctypes.util.find_library(base_name)" \
+      "'${libusb1}/lib/libusb-1.0${stdenv.hostPlatform.extensions.sharedLibrary}'"
+  '';
+
+  buildInputs = [ libusb1 ];
+
+  checkInputs = [ pytest ];
+
+  checkPhase = ''
+    # USBPollerThread is unreliable. Let's not test it.
+    # See: https://github.com/vpelletier/python-libusb1/issues/16
+    py.test -k 'not testUSBPollerThreadExit' 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/libversion/default.nix b/nixpkgs/pkgs/development/python-modules/libversion/default.nix
new file mode 100644
index 000000000000..d54a176f6862
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/libversion/default.nix
@@ -0,0 +1,23 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, pkg-config, libversion, pythonOlder }:
+
+buildPythonPackage rec {
+  pname = "libversion";
+  version = "1.2.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1h8x9hglrqi03f461lhw3wwz23zs84dgw7hx4laxcmyrgvyzvcq1";
+  };
+
+  nativeBuildInputs = [ pkg-config ];
+  buildInputs = [ libversion ];
+
+  disabled = pythonOlder "3.6";
+
+  meta = with lib; {
+    homepage = "https://github.com/repology/py-libversion";
+    description = "Python bindings for libversion, which provides fast, powerful and correct generic version string comparison algorithm";
+    license = licenses.mit;
+    maintainers = [ maintainers.ryantm ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/libvirt/5.9.0.nix b/nixpkgs/pkgs/development/python-modules/libvirt/5.9.0.nix
new file mode 100644
index 000000000000..1134d4f1c57b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/libvirt/5.9.0.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv, buildPythonPackage, fetchgit, pkg-config, lxml, libvirt, nose }:
+
+buildPythonPackage rec {
+  pname = "libvirt";
+  version = "5.9.0";
+
+  src = fetchgit {
+    url = "git://libvirt.org/libvirt-python.git";
+    rev = "v${version}";
+    sha256 = "0qvr0s7yasswy1s5cvkm91iifk33pb8s7nbb38zznc46706b358r";
+  };
+
+  nativeBuildInputs = [ pkg-config ];
+  buildInputs = [ libvirt lxml ];
+
+  checkInputs = [ nose ];
+  checkPhase = ''
+    nosetests
+  '';
+
+  meta = with lib; {
+    homepage = "http://www.libvirt.org/";
+    description = "libvirt Python bindings";
+    license = licenses.lgpl2;
+    maintainers = [ maintainers.fpletz ];
+  };
+}
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..d29cf5a7a85f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/libvirt/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitLab, pkg-config, lxml, libvirt, nose }:
+
+buildPythonPackage rec {
+  pname = "libvirt";
+  version = "6.8.0";
+
+  src = assert version == libvirt.version; fetchFromGitLab {
+    owner = "libvirt";
+    repo = "libvirt-python";
+    rev = "v${version}";
+    sha256 = "sha256-A3eRfzQAfubyPefDlq5bAiFJ/G90D2JKdJO2Em0wE00=";
+  };
+
+  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..e934c5194285
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/license-expression/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, fetchFromGitHub
+, boolean-py
+}:
+
+buildPythonPackage rec {
+  pname = "license-expression";
+  version = "1.2";
+
+  src = fetchFromGitHub {
+    owner = "nexB";
+    repo = "license-expression";
+    rev = "v${version}";
+    sha256 = "0bbd7d90z58p9sd01b00g0vfd9bmwzksjb7pc8833s2jpja9mxz1";
+  };
+  postPatch = "patchShebangs ./configure";
+
+  propagatedBuildInputs = [ boolean-py ];
+
+  meta = with lib; {
+    homepage = "https://github.com/nexB/license-expression";
+    description = "Utility library to parse, normalize and compare License expressions for Python using a boolean logic engine";
+    license = licenses.asl20;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/lightblue/default.nix b/nixpkgs/pkgs/development/python-modules/lightblue/default.nix
new file mode 100644
index 000000000000..3e85a3cfaa04
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lightblue/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchurl
+, pkgs
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "lightblue";
+  version = "0.4";
+  disabled = isPy3k; # build fails, 2018-04-11
+
+  src = fetchurl {
+    url = "mirror://sourceforge/${pname}/${pname}-${version}.tar.gz";
+    sha256 = "016h1mlhpqxjj25lcvl4fqc19k8ifmsv6df7rhr12fyfcrp5i14d";
+  };
+
+  buildInputs = [ pkgs.bluez pkgs.openobex ];
+
+  meta = with lib; {
+    homepage = "http://lightblue.sourceforge.net";
+    description = "Cross-platform Bluetooth API for Python";
+    maintainers = with maintainers; [ leenaars ];
+    license = licenses.gpl3;
+  };
+
+}
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..62686234b6e9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lightgbm/default.nix
@@ -0,0 +1,62 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, cmake
+, numpy
+, scipy
+, scikitlearn
+, llvmPackages ? null
+}:
+
+buildPythonPackage rec {
+  pname = "lightgbm";
+  version = "3.1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "babece2e3613e97748a67ed45387bb0e984bdb1f4126e39f010fbfe7503c7b20";
+  };
+
+  nativeBuildInputs = [
+    cmake
+  ];
+
+  dontUseCmakeConfigure = true;
+
+  # we never actually explicitly call the install command so this is the only way
+  # to inject these options to it - however, openmp-library doesn't appear to have
+  # any effect, so we have to inject it into NIX_LDFLAGS manually below
+  postPatch = lib.optionalString stdenv.cc.isClang ''
+    cat >> setup.cfg <<EOF
+
+    [install]
+    openmp-include-dir=${llvmPackages.openmp}/include
+    openmp-library=${llvmPackages.openmp}/lib/libomp.dylib
+
+    EOF
+  '';
+
+  propagatedBuildInputs = [
+    numpy
+    scipy
+    scikitlearn
+  ];
+
+  postConfigure = ''
+    export HOME=$(mktemp -d)
+  '' + lib.optionalString stdenv.cc.isClang ''
+    export NIX_LDFLAGS="$NIX_LDFLAGS -L${llvmPackages.openmp}/lib -lomp"
+  '';
+
+  # 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;
+
+  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..782bd41413eb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lightning/default.nix
@@ -0,0 +1,30 @@
+{ lib, stdenv
+, 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..0c3eb5292a88
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lightparam/default.nix
@@ -0,0 +1,35 @@
+{ lib, pkgs, 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/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..e1cd31867de4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/limits/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv, fetchPypi, buildPythonPackage, six }:
+
+buildPythonPackage rec {
+  pname = "limits";
+  version = "1.5.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f0c3319f032c4bfad68438ed1325c0fac86dac64582c7c25cddc87a0b658fa20";
+  };
+
+  propagatedBuildInputs = [ six ];
+
+  doCheck = false; # ifilter
+
+  meta = with lib; {
+    description = "Rate limiting utilities";
+    license = licenses.mit;
+    homepage = "https://limits.readthedocs.org/";
+  };
+}
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..c92e014e9898
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/limnoria/default.nix
@@ -0,0 +1,32 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, pkgs
+}:
+
+buildPythonPackage rec {
+  pname = "limnoria";
+  version = "2020.12.05";
+  disabled = isPy27; # abandoned upstream
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "c4310ea12d1ac39984a96c40a12fab92aefc3d77a615f89ef542b10497ae56fa";
+  };
+
+  patchPhase = ''
+    sed -i 's/version=version/version="${version}"/' setup.py
+  '';
+  buildInputs = [ pkgs.git ];
+
+  doCheck = false;
+
+  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..b99e60b8199e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/line_profiler/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, cython
+, isPyPy
+, ipython
+, python
+, scikit-build
+, cmake
+}:
+
+buildPythonPackage rec {
+  pname = "line_profiler";
+  version = "3.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "e73ff429236d59d48ce7028484becfa01449b3d52abdcf7337e0ff2acdc5093c";
+  };
+
+  nativeBuildInputs = [
+    cython
+    cmake
+    scikit-build
+  ];
+
+  dontUseCmakeConfigure = true;
+
+  propagatedBuildInputs = [
+    ipython
+  ];
+
+  disabled = isPyPy;
+
+  preBuild = ''
+    rm -f _line_profiler.c
+  '';
+
+  checkInputs = [
+    ipython
+  ];
+
+  checkPhase = ''
+    PYTHONPATH=$out/${python.sitePackages}:$PYTHONPATH cd tests && ${python.interpreter} -m unittest discover -s .
+  '';
+
+  meta = {
+    description = "Line-by-line profiler";
+    homepage = "https://github.com/rkern/line_profiler";
+    license = lib.licenses.bsd3;
+    maintainers = with lib.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..3945ec5001cd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/linecache2/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, pbr
+, isPy3k
+}:
+
+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/linode-api/default.nix b/nixpkgs/pkgs/development/python-modules/linode-api/default.nix
new file mode 100644
index 000000000000..61624a64d66a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/linode-api/default.nix
@@ -0,0 +1,41 @@
+{ stdenv,
+  buildPythonPackage,
+  fetchFromGitHub,
+  pythonOlder,
+  lib,
+  requests,
+  future,
+  enum34,
+  mock }:
+
+buildPythonPackage rec {
+  pname = "linode-api";
+  version = "4.1.8b1"; # NOTE: this is a beta, and the API may change in future versions.
+
+  disabled = (pythonOlder "2.7");
+
+  propagatedBuildInputs = [ requests future ]
+                             ++ lib.optionals (pythonOlder "3.4") [ enum34 ];
+
+  postPatch = (lib.optionalString (!pythonOlder "3.4") ''
+    sed -i -e '/"enum34",/d' setup.py
+  '');
+
+  doCheck = true;
+  checkInputs = [ mock ];
+
+  # Sources from Pypi exclude test fixtures
+  src = fetchFromGitHub {
+    rev = "v${version}";
+    owner = "linode";
+    repo = "python-linode-api";
+    sha256 = "0qfqn92fr876dncwbkf2vhm90hnf7lwpg80hzwyzyzwz1hcngvjg";
+  };
+
+  meta = {
+    homepage = "https://github.com/linode/python-linode-api";
+    description = "The official python library for the Linode API v4 in python.";
+    license = lib.licenses.bsd3;
+    maintainers = with lib.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..611b91bb9309
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/linode/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv
+, 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; [ nslqqq ];
+  };
+
+}
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..e6202441da64
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/linuxfd/default.nix
@@ -0,0 +1,24 @@
+{ 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";
+    license = with lib.licenses; [ lgpl3 ];
+  };
+}
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..97d80fbbbda7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/liquidctl/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, docopt
+, hidapi
+, pyusb
+, smbus-cffi
+}:
+
+buildPythonPackage rec {
+  pname = "liquidctl";
+  version = "1.4.2";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner  = pname;
+    repo   = pname;
+    rev    = "v${version}";
+    sha256 = "1h5kqpvlx7xppd2wli986lkslqkcrlz1wixv7fvrppzjc2nfz5d4";
+  };
+
+  propagatedBuildInputs = [
+    docopt
+    hidapi
+    pyusb
+    smbus-cffi
+  ];
+
+  # does not contain tests
+  doCheck = false;
+  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.gpl3;
+    maintainers = with maintainers; [ arturcygan ];
+  };
+}
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..bbf1b966bf1e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/livelossplot/default.nix
@@ -0,0 +1,40 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, isPy27
+, pytest
+, bokeh
+, ipython
+, matplotlib
+, numpy
+, nbconvert
+, nbformat
+}:
+
+buildPythonPackage rec {
+  pname = "livelossplot";
+  version = "0.5.0";
+
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner  = "stared";
+    repo   = pname;
+    rev    = "v${version}";
+    sha256 = "164v65qglgyg38q9ajnas99rp14mvrk5hn8x76b8iy81vszmx1c0";
+  };
+
+  propagatedBuildInputs = [ bokeh ipython matplotlib numpy ];
+
+  checkInputs = [ pytest nbconvert nbformat ];
+  checkPhase = ''
+    pytest tests tests/external_test_examples.py
+  '';
+
+  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..d76eb736ac73
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/livestreamer-curses/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchurl
+, isPyPy
+, livestreamer
+}:
+
+buildPythonPackage rec {
+  version = "1.5.2";
+  pname = "livestreamer-curses";
+  disabled = isPyPy;
+
+  src = fetchurl {
+    url = "https://github.com/gapato/livestreamer-curses/archive/v${version}.tar.gz";
+    sha256 = "1v49sym6mrci9dxy0a7cpbp4bv6fg2ijj6rwk4wzg18c2x4qzkhn";
+  };
+
+  propagatedBuildInputs = [ livestreamer ];
+
+  meta = with lib; {
+    homepage = "https://github.com/gapato/livestreamer-curses";
+    description = "Curses frontend for livestreamer";
+    license = licenses.mit;
+  };
+
+}
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..7ae9124bb82c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/livestreamer/default.nix
@@ -0,0 +1,41 @@
+{ lib, stdenv
+, buildPythonPackage
+, pkgs
+, isPyPy
+, pycrypto
+, requests
+, singledispatch
+, futures
+, isPy27
+}:
+
+buildPythonPackage rec {
+  version = "1.12.2";
+  pname = "livestreamer";
+  disabled = isPyPy;
+
+  src = pkgs.fetchurl {
+    url = "https://github.com/chrippa/livestreamer/archive/v${version}.tar.gz";
+    sha256 = "1fp3d3z2grb1ls97smjkraazpxnvajda2d1g1378s6gzmda2jvjd";
+  };
+
+  buildInputs = [ pkgs.makeWrapper ];
+
+  propagatedBuildInputs = [ pkgs.rtmpdump pycrypto requests ]
+    ++ lib.optionals isPy27 [ singledispatch futures ];
+
+  postInstall = ''
+    wrapProgram $out/bin/livestreamer --prefix PATH : ${pkgs.rtmpdump}/bin
+  '';
+
+  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..e615582a282d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/llfuse/default.nix
@@ -0,0 +1,44 @@
+{ lib, stdenv, fetchPypi, fetchpatch, buildPythonPackage, pkg-config, pytest, fuse, attr, which
+, contextlib2, osxfuse
+}:
+
+buildPythonPackage rec {
+  pname = "llfuse";
+  version = "1.3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1g2cdhdqrb6m7655qp61pn61pwj1ql61cdzhr2jvl3w4i8877ddr";
+  };
+
+  patches = [
+    # fix tests with pytest 6
+    (fetchpatch {
+      url = "https://github.com/python-llfuse/python-llfuse/commit/1ed8b280d2544eedf8bf209761bef0d2519edd17.diff";
+      sha256 = "0wailfrr1i0n2m9ylwpr00jh79s7z3l36w7x19jx1x4djcz2hdps";
+    })
+  ];
+
+  nativeBuildInputs = [ pkg-config ];
+
+  buildInputs =
+    lib.optionals stdenv.isLinux [ fuse ]
+    ++ lib.optionals stdenv.isDarwin [ osxfuse ];
+
+  checkInputs = [ pytest which ] ++
+    lib.optionals stdenv.isLinux [ attr ];
+
+  propagatedBuildInputs = [ contextlib2 ];
+
+  checkPhase = ''
+    py.test -k "not test_listdir" ${lib.optionalString stdenv.isDarwin ''-m "not uses_fuse"''}
+  '';
+
+  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 ];
+  };
+}
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..02ee088782aa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/llvmlite/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, stdenv
+, fetchPypi
+, buildPythonPackage
+, python
+, llvm
+, pythonOlder
+, isPyPy
+, enum34
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "llvmlite";
+  version = "0.34.0";
+
+  disabled = isPyPy || !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f03ee0d19bca8f2fe922bb424a909d05c28411983b0c2bc58b020032a0d11f63";
+  };
+
+  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}/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..20020b97ef23
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lmdb/default.nix
@@ -0,0 +1,33 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, cffi
+, lmdb
+, ludios_wpull
+}:
+
+buildPythonPackage rec {
+  pname = "lmdb";
+  version = "1.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "4136ffdf0aad61da86d1402808029d002a771b2a9ccc9b39c6bcafa7847c21b6";
+  };
+
+  buildInputs = [ lmdb ];
+
+  propogatedBuildInputs = [ ludios_wpull ];
+
+  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/lmtpd/default.nix b/nixpkgs/pkgs/development/python-modules/lmtpd/default.nix
new file mode 100644
index 000000000000..3a1beba29d40
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lmtpd/default.nix
@@ -0,0 +1,20 @@
+{ buildPythonPackage, fetchPypi, isPy3k, lib, stdenv }:
+
+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/localzone/default.nix b/nixpkgs/pkgs/development/python-modules/localzone/default.nix
new file mode 100644
index 000000000000..8690b1e4c91e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/localzone/default.nix
@@ -0,0 +1,34 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, dnspython
+, sphinx
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "localzone";
+  version = "0.9.7";
+
+  src = fetchFromGitHub {
+    owner = "ags-slc";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1vzn1vm3zf86l7qncbmghjrwyvla9dc2v8abn8jajbl47gm7r5f7";
+  };
+
+  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/locket/default.nix b/nixpkgs/pkgs/development/python-modules/locket/default.nix
new file mode 100644
index 000000000000..45985a17d3e9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/locket/default.nix
@@ -0,0 +1,23 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, pytest }:
+
+buildPythonPackage rec {
+  pname = "locket";
+  version = "0.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1d4z2zngrpqkrfhnd4yhysh66kjn4mblys2l06sh5dix2p0n7vhz";
+  };
+
+  buildInputs = [ pytest ];
+
+  # weird test requirements (spur.local>=0.3.7,<0.4)
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Locket implements a lock that can be used by multiple processes provided they use the same path.";
+    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/logfury/default.nix b/nixpkgs/pkgs/development/python-modules/logfury/default.nix
new file mode 100644
index 000000000000..5f83c8633dc1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/logfury/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, funcsigs
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "logfury";
+  version = "0.1.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1lywirv3d1lw691mc4mfpz7ak6r49klri43bbfgdnvsfppxminj2";
+  };
+
+  propagatedBuildInputs = [
+    funcsigs
+    six
+  ];
+
+  # No tests
+  doCheck = false;
+
+  meta = {
+    description = "Logfury is for python library maintainers. It allows for responsible, low-boilerplate logging of method calls.";
+    homepage = "https://github.com/ppolewicz/logfury";
+    license = lib.licenses.bsd3;
+    maintainers = with lib.maintainers; [ jwiegley ];
+  };
+}
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..b7ba746d79ee
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/logilab/common.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv, 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..9a071b5cf5f9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/logilab/constraint.nix
@@ -0,0 +1,22 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, logilab_common, six }:
+
+buildPythonPackage rec {
+  pname = "logilab-constraint";
+  version = "0.6.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1n0xim4ij1n4yvyqqvyc0wllhjs22szglsd5av0j8k2qmck4njcg";
+  };
+
+  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..15cea1d7baaa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/logilab_astng/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv
+, 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..458d2ca50329
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/loguru/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, isPy27, colorama, pytestCheckHook }:
+
+buildPythonPackage rec {
+  pname = "loguru";
+  version = "0.5.3";
+
+  disabled = isPy27;
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b28e72ac7a98be3d28ad28570299a393dfcd32e5e3f6a353dec94675767b6319";
+  };
+
+  checkInputs = [ pytestCheckHook colorama ];
+
+  pytestFlagsArray = lib.optionals stdenv.isDarwin [ "--ignore=tests/test_multiprocessing.py" ];
+
+  disabledTests = [ "test_time_rotation_reopening" "test_file_buffering" ]
+    ++ lib.optionals stdenv.isDarwin [ "test_rotation_and_retention" "test_rotation_and_retention_timed_file" "test_renaming" "test_await_complete_inheritance" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/Delgan/loguru";
+    description = "Python logging made (stupidly) simple";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jakewaksbaum ];
+  };
+}
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..d49667d7cc8a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/logutils/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv
+, 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..015d387f27d8
--- /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.6.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1435284574e409b8ec8b680f276bca04cab41f93d6eff4dc8348b7630cddf560";
+  };
+
+  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..669f16e5f928
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lomond/default.nix
@@ -0,0 +1,27 @@
+{ buildPythonPackage, freezegun, fetchFromGitHub, lib, pytestCheckHook
+, pytest-mock, pytestrunner, six, tornado_4 }:
+
+buildPythonPackage rec {
+  pname = "lomond";
+  version = "0.3.3";
+
+  src = fetchFromGitHub {
+    owner = "wildfoundry";
+    repo = "dataplicity-${pname}";
+    rev = "b30dad3cc38d5ff210c5dd01f8c3c76aa6c616d1";
+    sha256 = "0lydq0imala08wxdyg2iwhqa6gcdrn24ah14h91h2zcxjhjk4gv8";
+  };
+
+  nativeBuildInputs = [ pytestrunner ];
+  propagatedBuildInputs = [ six ];
+  checkInputs = [ pytestCheckHook freezegun pytest-mock tornado_4 ];
+  # Makes HTTP requests
+  disabledTests = [ "test_proxy" "test_live" ];
+
+  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/loo-py/default.nix b/nixpkgs/pkgs/development/python-modules/loo-py/default.nix
new file mode 100644
index 000000000000..16060c1c030e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/loo-py/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytools
+, pymbolic
+, genpy
+, cgen
+, islpy
+, six
+, colorama
+, mako
+, pyopencl
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "loo-py";
+  version = "2017.2";
+
+  src = fetchPypi {
+    pname = "loo.py";
+    inherit version;
+    sha256 = "c656992de48b328cdaccd7d1f14eb522b9dd5a1d0d15f54623f4ab18fd219abc";
+  };
+
+  checkInputs = [ pytest ];
+  propagatedBuildInputs = [
+    pytools
+    pymbolic
+    genpy
+    cgen
+    islpy
+    six
+    colorama
+    mako
+    pyopencl
+  ];
+
+  # pyopencl._cl.LogicError: clGetPlatformIDs failed: PLATFORM_NOT_FOUND_KHR
+  doCheck = false;
+  checkPhase = ''
+    HOME=$(mktemp -d) pytest test
+  '';
+
+  meta = with lib; {
+    description = "A code generator for array-based code on CPUs and GPUs";
+    homepage = "https://mathema.tician.de/software/loopy";
+    license = licenses.mit;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/lpod/default.nix b/nixpkgs/pkgs/development/python-modules/lpod/default.nix
new file mode 100644
index 000000000000..67b48cecd62c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lpod/default.nix
@@ -0,0 +1,31 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, lxml
+, docutils
+, pillow
+, isPy3k
+}:
+
+buildPythonPackage {
+  version = "1.1.7";
+  pname = "python-lpod";
+  # lpod library currently does not support Python 3.x
+  disabled = isPy3k;
+
+  propagatedBuildInputs = [ lxml docutils pillow ];
+
+  src = fetchFromGitHub {
+    owner = "lpod";
+    repo = "lpod-python";
+    rev = "dee32120ee582ff337b0c52a95a9a87cca71fd67";
+    sha256 = "1mikvzp27wxkzpr2lii4wg1hhx8h610agckqynvsrdc8v3nw9ciw";
+  };
+
+  meta = with lib; {
+    homepage = "https://github.com/lpod/lpod-python/";
+    description = "Library implementing the ISO/IEC 26300 OpenDocument Format standard (ODF) ";
+    license = licenses.gpl3;
+  };
+
+}
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..6b1d5ec2bb4c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lsassy/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, impacket
+, netaddr
+, pypykatz
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "lsassy";
+  version = "2.1.3";
+
+  src = fetchFromGitHub {
+    owner = "Hackndo";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1zig34ymc1h18gjc2ji0w0711im5sm9xm6nydc01c13yfpvvj1rh";
+  };
+
+  propagatedBuildInputs = [
+    impacket
+    netaddr
+    pypykatz
+  ];
+
+  # 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/lsi/default.nix b/nixpkgs/pkgs/development/python-modules/lsi/default.nix
new file mode 100644
index 000000000000..0fca2f7b372f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lsi/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv
+, buildPythonPackage
+, isPy3k
+, fetchPypi
+, colored
+, boto
+, pkgs
+}:
+
+buildPythonPackage rec {
+  pname = "lsi";
+  version = "0.4.0";
+  disabled = isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b2c4a9a276a32f914a6193509503c28b3cc84bf42d58e191214811cfe78f4736";
+  };
+
+  propagatedBuildInputs = [ colored boto pkgs.openssh pkgs.which ];
+
+  meta = with lib; {
+    description = "CLI for querying and SSHing onto AWS EC2 instances";
+    homepage = "https://github.com/NarrativeScience/lsi";
+    maintainers = [maintainers.adnelson];
+    license = licenses.mit;
+  };
+
+}
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..e87146f6fbc3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ludios_wpull/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, isPy3k
+, chardet
+, dnspython
+, html5-parser
+, lxml
+, namedlist
+, sqlalchemy
+, tornado
+, Yapsy
+, pythonAtLeast
+}:
+
+buildPythonPackage rec {
+  pname = "ludios_wpull";
+  version = "3.0.7";
+
+  disabled = (!isPy3k) || (pythonAtLeast "3.8");
+
+  src = fetchFromGitHub {
+    rev = version;
+    owner = "ludios";
+    repo = "wpull";
+    sha256 = "1j96avm0ynbazypzp766wh26n4qc73y7wgsiqfrdfl6x7rx20wgf";
+  };
+
+  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/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..dbbe3d252125
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/luftdaten/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, isPy3k, fetchPypi, aiohttp, async-timeout }:
+
+buildPythonPackage rec {
+  pname = "luftdaten";
+  version = "0.6.4";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1w1f0kmiwslg1dxn7gq0ak8f5wajlwl03r5zklshjc11j34b4d5i";
+  };
+
+  propagatedBuildInputs = [ aiohttp async-timeout ];
+
+  # No tests implemented
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Python API for interacting with luftdaten.info";
+    homepage = "https://github.com/fabaff/python-luftdaten";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/lxc/default.nix b/nixpkgs/pkgs/development/python-modules/lxc/default.nix
new file mode 100644
index 000000000000..a20db9dd5034
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lxc/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, isPy3k
+, pkgs
+}:
+
+buildPythonPackage {
+  pname = "python-lxc-unstable";
+  version = "2016-08-25";
+  disabled = isPy3k;
+
+  src = fetchFromGitHub {
+    owner = "lxc";
+    repo = "python2-lxc";
+    rev = "0553f05d23b56b59bf3015fa5e45bfbfab9021ef";
+    sha256 = "0p9kb20xvq91gx2wfs3vppb7vsp8kmd90i3q95l4nl1y4aismdn4";
+  };
+
+  buildInputs = [ pkgs.lxc ];
+
+  meta = with lib; {
+    description = "Out of tree python 2.7 binding for liblxc";
+    homepage = "https://github.com/lxc/python2-lxc";
+    license = licenses.lgpl2;
+    maintainers = with maintainers; [ mic92 ];
+  };
+
+}
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..aa009e0a3e73
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lxml/default.nix
@@ -0,0 +1,34 @@
+{ lib, buildPythonPackage, fetchFromGitHub
+, cython
+, libxml2
+, libxslt
+, zlib
+}:
+
+buildPythonPackage rec {
+  pname = "lxml";
+  version = "4.5.2";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = "${pname}-${version}";
+    sha256 = "1d0cpwdjxfzwjzmnz066ibzicyj2vhx15qxmm775l8hxqi65xps4";
+  };
+
+  # setuptoolsBuildPhase needs dependencies to be passed through nativeBuildInputs
+  nativeBuildInputs = [ libxml2.dev libxslt.dev cython ];
+  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 sjourdois ];
+  };
+}
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..585c38ab33ec
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lyricwikia/default.nix
@@ -0,0 +1,23 @@
+{ lib, stdenv, fetchPypi, buildPythonPackage, pytestrunner, six, beautifulsoup4, requests, }:
+buildPythonPackage rec {
+  pname = "lyricwikia";
+  version = "0.1.11";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0l5lkvr3299x79i7skdiggp67rzgax3s00psd1zqkxfysq27jvc8";
+  };
+
+  buildInputs = [ pytestrunner ];
+  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/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..af07be47dcdc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/m2crypto/default.nix
@@ -0,0 +1,48 @@
+{ stdenv
+, 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..149e4d6ed562
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/m2r/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi,
+  mistune, docutils } :
+buildPythonPackage rec {
+  pname = "m2r";
+  version = "0.2.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "bf90bad66cda1164b17e5ba4a037806d2443f2a4d5ddc9f6a5554a0322aaed99";
+  };
+
+  propagatedBuildInputs = [ mistune docutils ];
+
+  # Some tests interfeere with each other (test.md and test.rst are
+  # deleted by some tests and not properly regenerated)
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/miyakogi/m2r";
+    description = "converts a markdown file including reST markups to a valid reST format";
+    license = licenses.mit;
+    maintainers = [ ];
+  };
+}
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..01ff1458c0fa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/m3u8/default.nix
@@ -0,0 +1,29 @@
+{ lib, buildPythonPackage, python, fetchFromGitHub, requests, iso8601, bottle, pytest, pytestcov }:
+
+buildPythonPackage rec {
+  pname = "m3u8";
+  version = "0.6.0";
+
+  src = fetchFromGitHub {
+    owner = "globocom";
+    repo = pname;
+    rev = version;
+    sha256 = "0cmg993icpsa1b19kljxvjwhs167bsqrs0ad4wnwsi8qq6na5d4p";
+  };
+
+  checkInputs = [ bottle pytest pytestcov ];
+
+  checkPhase = ''
+    pytest tests/test_{parser,model,variant_m3u8}.py
+  '';
+
+  propagatedBuildInputs = [ requests iso8601 ];
+
+  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..990545e41736
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/maestral/default.nix
@@ -0,0 +1,65 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, python
+, alembic, bugsnag, click, dropbox, fasteners, keyring, keyrings-alt, packaging, pathspec, Pyro5, requests, setuptools, sdnotify, sqlalchemy, survey, watchdog
+, importlib-metadata
+, importlib-resources
+, dbus-next
+}:
+
+buildPythonPackage rec {
+  pname = "maestral";
+  version = "1.3.1";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "SamSchott";
+    repo = "maestral";
+    rev = "v${version}";
+    sha256 = "sha256-SspyTdmAbbmWN3AqVp9bj/QfAKLVgU2bLiiHjZO0aCM=";
+  };
+
+  propagatedBuildInputs = [
+    alembic
+    bugsnag
+    click
+    dropbox
+    fasteners
+    keyring
+    keyrings-alt
+    packaging
+    pathspec
+    Pyro5
+    requests
+    setuptools
+    sdnotify
+    sqlalchemy
+    survey
+    watchdog
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ] ++ lib.optionals (pythonOlder "3.9") [
+    importlib-resources
+  ] ++ lib.optionals stdenv.isLinux [
+    dbus-next
+  ];
+
+  makeWrapperArgs = [
+    # Add the installed directories to the python path so the daemon can find them
+    "--prefix" "PYTHONPATH" ":" "${lib.concatStringsSep ":" (map (p: p + "/lib/${python.libPrefix}/site-packages") (python.pkgs.requiredPythonModules propagatedBuildInputs))}"
+    "--prefix" "PYTHONPATH" ":" "$out/lib/${python.libPrefix}/site-packages"
+  ];
+
+  # no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Open-source Dropbox client for macOS and Linux";
+    license = licenses.mit;
+    maintainers = with maintainers; [ peterhoeg ];
+    platforms = platforms.unix;
+    inherit (src.meta) homepage;
+  };
+}
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..14ae268c03a0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/magic-wormhole-mailbox-server/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, isPy27, six, attrs, twisted, pyopenssl, service-identity, autobahn, treq, mock, pytest }:
+
+buildPythonPackage rec {
+  version = "0.4.1";
+  pname = "magic-wormhole-mailbox-server";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1af10592909caaf519c00e706eac842c5e77f8d4356215fe9c61c7b2258a88fb";
+  };
+
+  propagatedBuildInputs = [ six attrs twisted pyopenssl service-identity autobahn ];
+
+  # zope.interface import issue
+  doCheck = !isPy27;
+  checkInputs = [ treq mock pytest ];
+  checkPhase = ''
+    pytest
+  '';
+
+  meta = with lib; {
+    description = "Securely transfer data between computers";
+    homepage = "https://github.com/warner/magic-wormhole-mailbox-server";
+    license = licenses.mit;
+  };
+}
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..2d6a8d969d8b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/magic-wormhole-transit-relay/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, fetchPypi, twisted, mock }:
+
+buildPythonPackage rec {
+  pname = "magic-wormhole-transit-relay";
+  version = "0.2.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0ppsx2s1ysikns1h053x67z2zmficbn3y3kf52bzzslhd2s02j6b";
+  };
+
+  propagatedBuildInputs = [ twisted ];
+
+  checkInputs = [ mock ];
+
+  checkPhase = ''
+    ${twisted}/bin/trial wormhole_transit_relay
+  '';
+
+  meta = with lib; {
+    description = "Transit Relay server for Magic-Wormhole";
+    homepage = "https://github.com/warner/magic-wormhole-transit-relay";
+    license = licenses.mit;
+  };
+}
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..0d8b3a1ec070
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/magic-wormhole/default.nix
@@ -0,0 +1,66 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, spake2
+, pynacl
+, six
+, attrs
+, twisted
+, autobahn
+, automat
+, hkdf
+, tqdm
+, click
+, humanize
+, txtorcon
+, nettools
+, glibcLocales
+, 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";
+  };
+
+  buildInputs = [ glibcLocales ];
+  propagatedBuildInputs = [ spake2 pynacl six attrs twisted autobahn automat hkdf tqdm click humanize txtorcon ];
+  checkInputs = [ mock magic-wormhole-transit-relay magic-wormhole-mailbox-server ];
+
+  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
+  '';
+
+  # zope.interface issue
+  doCheck = !isPy27;
+  preCheck = ''
+    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"))'
+  '';
+
+  meta = with lib; {
+    description = "Securely transfer data between computers";
+    homepage = "https://github.com/warner/magic-wormhole";
+    license = licenses.mit;
+    # Currently broken on Python 2.7. See
+    # https://github.com/NixOS/nixpkgs/issues/71826
+    broken = isPy27;
+    maintainers = with maintainers; [ asymmetric ];
+  };
+}
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/mahotas/default.nix b/nixpkgs/pkgs/development/python-modules/mahotas/default.nix
new file mode 100644
index 000000000000..818ff459985c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mahotas/default.nix
@@ -0,0 +1,33 @@
+{ buildPythonPackage, fetchFromGitHub, nose, pillow, scipy, numpy, imread, lib, stdenv }:
+
+buildPythonPackage rec {
+  pname = "mahotas";
+  version = "1.4.10";
+
+  src = fetchFromGitHub {
+    owner = "luispedro";
+    repo = "mahotas";
+    rev = "v${version}";
+    sha256 = "0fjiyl82wj1a6xzr9mss2y2rydl4zchl2cbdbg0jm0fcrs99q4hw";
+  };
+
+  # remove this as soon as https://github.com/luispedro/mahotas/issues/97 is fixed
+  patches = [ ./disable-impure-tests.patch ];
+
+  propagatedBuildInputs = [ numpy imread pillow scipy ];
+  checkInputs = [ nose ];
+
+  checkPhase= ''
+    python setup.py test
+  '';
+
+  disabled = stdenv.isi686; # Failing tests
+
+  meta = with lib; {
+    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/mahotas/disable-impure-tests.patch b/nixpkgs/pkgs/development/python-modules/mahotas/disable-impure-tests.patch
new file mode 100644
index 000000000000..f19bd329e662
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mahotas/disable-impure-tests.patch
@@ -0,0 +1,76 @@
+diff --git a/mahotas/tests/test_colors.py b/mahotas/tests/test_colors.py
+index 8a8183b..0d34c9f 100644
+--- a/mahotas/tests/test_colors.py
++++ b/mahotas/tests/test_colors.py
+@@ -2,7 +2,9 @@ import mahotas
+ import numpy as np
+ from mahotas.tests.utils import luispedro_jpg
+ from mahotas.colors import rgb2xyz, rgb2lab, xyz2rgb, rgb2grey, rgb2sepia
++from nose.tools import nottest
+ 
++@nottest
+ def test_colors():
+     f = luispedro_jpg()
+     lab = rgb2lab(f)
+diff --git a/mahotas/tests/test_features_shape.py b/mahotas/tests/test_features_shape.py
+index 462f467..2381793 100644
+--- a/mahotas/tests/test_features_shape.py
++++ b/mahotas/tests/test_features_shape.py
+@@ -2,6 +2,7 @@ import mahotas.features.shape
+ import numpy as np
+ import mahotas as mh
+ from mahotas.features.shape import roundness, eccentricity
++from nose.tools import nottest
+ 
+ def test_eccentricity():
+     D = mh.disk(32, 2)
+@@ -29,6 +30,7 @@ def test_zeros():
+     I[8:4:12] = 1
+     assert eccentricity(I) == 0
+ 
++@nottest
+ def test_ellipse_axes():
+     Y,X = np.mgrid[:1024,:1024]
+     Y = Y/1024.
+diff --git a/mahotas/tests/test_moments.py b/mahotas/tests/test_moments.py
+index 686c7c3..ba3487b 100644
+--- a/mahotas/tests/test_moments.py
++++ b/mahotas/tests/test_moments.py
+@@ -1,6 +1,7 @@
+ import numpy as np
+ import mahotas as mh
+ from mahotas.features.moments import moments
++from nose.tools import nottest
+ 
+ def _slow(A, p0, p1, cm):
+     c0,c1 = cm
+@@ -28,7 +29,7 @@ def test_against_slow():
+     yield perform, 1, 2, (0, 0), A
+     yield perform, 1, 0, (0, 0), A
+ 
+-
++@nottest
+ def test_normalize():
+     A,B = np.meshgrid(np.arange(128),np.arange(128))
+     for p0,p1 in [(1,1), (1,2), (2,1), (2,2)]:
+diff --git a/mahotas/tests/test_texture.py b/mahotas/tests/test_texture.py
+index 7e101ba..af1305d 100644
+--- a/mahotas/tests/test_texture.py
++++ b/mahotas/tests/test_texture.py
+@@ -2,7 +2,7 @@ import numpy as np
+ from mahotas.features import texture
+ import mahotas as mh
+ import mahotas.features._texture
+-from nose.tools import raises
++from nose.tools import raises, nottest
+ 
+ def test__cooccurence():
+     cooccurence = mahotas.features._texture.cooccurence
+@@ -149,6 +149,7 @@ def test_float_haralick():
+     A[2,2]=12
+     texture.haralick(A)
+ 
++@nottest
+ def test_haralick3d():
+     np.random.seed(22)
+     img = mahotas.stretch(255*np.random.rand(20,20,4))
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..94b575f3f468
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mail-parser/default.nix
@@ -0,0 +1,45 @@
+{ lib, buildPythonPackage, python, pythonOlder, glibcLocales, fetchFromGitHub, ipaddress, six, simplejson }:
+
+buildPythonPackage rec {
+  pname = "mail-parser";
+  version = "3.12.0";
+
+  # no tests in PyPI tarball
+  src = fetchFromGitHub {
+    owner = "SpamScope";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0p851jlly6bzcs70kd1lcjwmg4scwh1icymfc0f2y6rkh4kfsdhk";
+  };
+
+  LC_ALL = "en_US.utf-8";
+
+  # remove version bounds
+  prePatch = ''
+    sed -i -e 's/==.*//g' requirements.txt
+  ''
+  # ipaddress is part of the standard library of Python 3.3+
+  + lib.optionalString (!pythonOlder "3.3") ''
+    substituteInPlace requirements.txt \
+      --replace "ipaddress" ""
+  '';
+
+  nativeBuildInputs = [ glibcLocales ];
+  propagatedBuildInputs = [ simplejson six ] ++ lib.optional (pythonOlder "3.3") ipaddress;
+
+  # 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..08991edce4aa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mailcap-fix/default.nix
@@ -0,0 +1,23 @@
+{ lib, stdenv
+, 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/mailchimp/default.nix b/nixpkgs/pkgs/development/python-modules/mailchimp/default.nix
new file mode 100644
index 000000000000..0032caa7a0a5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mailchimp/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, docopt
+, requests
+}:
+
+buildPythonPackage rec {
+  version = "2.0.9";
+  pname = "mailchimp";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0351ai0jqv3dzx0xxm1138sa7mb42si6xfygl5ak8wnfc95ff770";
+  };
+
+  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/mailman-hyperkitty/default.nix b/nixpkgs/pkgs/development/python-modules/mailman-hyperkitty/default.nix
new file mode 100644
index 000000000000..8ab80e337179
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mailman-hyperkitty/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, mailman, mock }:
+
+buildPythonPackage rec {
+  pname = "mailman-hyperkitty";
+  version = "1.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1lfqa9admhvdv71f528jmz2wl0i5cv77v6l64px2pm4zqr9ckkjx";
+  };
+
+  propagatedBuildInputs = [ mailman ];
+  checkInputs = [ mock ];
+
+  checkPhase = ''
+    python -m nose2 -v
+  '';
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Mailman archiver plugin for HyperKitty";
+    homepage = "https://gitlab.com/mailman/mailman-hyperkitty";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ globin peti ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mailman-rss/default.nix b/nixpkgs/pkgs/development/python-modules/mailman-rss/default.nix
new file mode 100644
index 000000000000..84c97eb16e2e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mailman-rss/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv, python3Packages, withTwitter ? false}:
+
+python3Packages.buildPythonApplication rec {
+  pname = "mailman-rss";
+  version = "0.2.4";
+
+  src = python3Packages.fetchPypi {
+    inherit pname version;
+    sha256 = "1brrik70jyagxa9l0cfmlxvqpilwj1q655bphxnvjxyganxf4c00";
+  };
+
+  propagatedBuildInputs = with python3Packages; [ dateutil future requests beautifulsoup4 ]
+    ++ lib.optional withTwitter python3Packages.twitter
+  ;
+
+  # No tests in Pypi Tarball
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Mailman archive -> rss converter";
+    homepage = "https://github.com/kyamagu/mailman-rss";
+    license = licenses.mit;
+    maintainers = with maintainers; [ samueldr ];
+  };
+}
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..280ee95b8301
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mailmanclient/default.nix
@@ -0,0 +1,22 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, isPy3k, six, httplib2, requests }:
+
+buildPythonPackage rec {
+  pname = "mailmanclient";
+  version = "3.3.1";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0pjgzpvhdb6ql8asb20xr8d01m646zpghmcp9fmscks0n1k4di4g";
+  };
+
+  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; [ peti globin ];
+  };
+}
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..e23c3621c2e9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/managesieve/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestrunner
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "managesieve";
+  version = "0.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ee70e298e9b68eb81f93d52a1320a034fdc182f3927fdd551836fc93b0ed2c5f";
+  };
+
+  checkInputs = [ pytestrunner pytest ];
+
+  meta = with lib; {
+    description = "ManageSieve client library for remotely managing Sieve scripts";
+    homepage    = "https://managesieve.readthedocs.io/";
+    # PSFL for the python module, GPLv3 for sieveshell
+    license     = with licenses; [ gpl3 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..b9d57a7c0899
--- /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.6.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d4ab98198481ed54a5b95c0439f41131f56d7d3755eedaedce5a45ca7ff4aa42";
+  };
+
+  # 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/manticore/default.nix b/nixpkgs/pkgs/development/python-modules/manticore/default.nix
new file mode 100644
index 000000000000..f9ca3afc4b15
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/manticore/default.nix
@@ -0,0 +1,109 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, capstone
+, crytic-compile
+, ply
+, prettytable
+, pyelftools
+, pyevmasm
+, pysha3
+, pyyaml
+, rlp
+, stdenv
+, unicorn
+, wasm
+, yices
+, pytestCheckHook
+, z3
+}:
+
+buildPythonPackage rec {
+  pname = "manticore";
+  version = "0.3.5";
+
+  src = fetchFromGitHub {
+    owner = "trailofbits";
+    repo = "manticore";
+    rev = version;
+    sha256 = "0z2nhfcraa5dx6srbrw8s11awh2la0x7d88yw9in8g548nv6qa69";
+  };
+
+  propagatedBuildInputs = [
+    crytic-compile
+    ply
+    prettytable
+    pyevmasm
+    pysha3
+    pyyaml
+    rlp
+    wasm
+  ] ++ lib.optionals (stdenv.isLinux) [
+    capstone
+    pyelftools
+    unicorn
+  ];
+
+  # Python API is not used in the code, only z3 from PATH
+  postPatch = ''
+    sed -ie s/z3-solver// setup.py
+  '';
+
+  checkInputs = [ pytestCheckHook ];
+  preCheck = "export PATH=${yices}/bin:${z3}/bin:$PATH";
+  pytestFlagsArray = [
+    "--ignore=tests/ethereum" # TODO: enable when solc works again
+    "--ignore=tests/ethereum_bench"
+  ] ++ lib.optionals (!stdenv.isLinux) [
+    "--ignore=tests/native"
+    "--ignore=tests/other/test_locking.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"
+  ];
+
+  meta = with lib; {
+    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..59243783ecf9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/manuel/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, six
+, zope_testing
+}:
+
+buildPythonPackage rec {
+  pname = "manuel";
+  version = "1.10.1";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1bdzay7j70fly5fy6wbdi8fbrxjrrlxnxnw226rwry1c8a351rpy";
+  };
+
+  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/default.nix b/nixpkgs/pkgs/development/python-modules/mapbox/default.nix
new file mode 100644
index 000000000000..f721228ddca4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mapbox/default.nix
@@ -0,0 +1,36 @@
+{ 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 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mapsplotlib/default.nix b/nixpkgs/pkgs/development/python-modules/mapsplotlib/default.nix
new file mode 100644
index 000000000000..54d0ade40f35
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mapsplotlib/default.nix
@@ -0,0 +1,32 @@
+{ lib, stdenv
+, buildPythonPackage
+, isPy3k
+, fetchPypi
+, matplotlib
+, scipy
+, pandas
+, requests
+, pillow
+}:
+
+buildPythonPackage rec {
+  pname = "mapsplotlib";
+  version = "1.2.1";
+
+  disabled = isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "7650754e3175f13a1cb4406a62e4cfeb424036377992b9c3c2e3f6c2404d06b3";
+  };
+
+  propagatedBuildInputs = [ matplotlib scipy pandas requests pillow ];
+
+  meta = with lib; {
+    description = "Custom Python plots on a Google Maps background";
+    homepage = "https://github.com/tcassou/mapsplotlib";
+    license = licenses.mit;
+    maintainers = [ maintainers.rob ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/marionette-harness/default.nix b/nixpkgs/pkgs/development/python-modules/marionette-harness/default.nix
new file mode 100644
index 000000000000..187e3a646a02
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/marionette-harness/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+, mozprofile
+, mozversion
+, moztest
+, manifestparser
+, marionette_driver
+, browsermob-proxy
+, wptserve
+}:
+
+buildPythonPackage rec {
+  pname = "marionette-harness";
+  version = "5.0.0";
+  disabled = isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "041cd779ae383fb5c56f2bb44824f4e80ba895febd9a3f21570ac274221c82e0";
+  };
+
+  propagatedBuildInputs = [ mozprofile mozversion browsermob-proxy moztest
+    wptserve manifestparser marionette_driver ];
+
+  meta = {
+    description = "Mozilla Marionette protocol test automation harness";
+    homepage = "https://developer.mozilla.org/en-US/docs/Mozilla/QA/Marionette";
+    license = lib.licenses.mpl20;
+    maintainers = with lib.maintainers; [ raskin ];
+  };
+}
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/marionette-harness/marionette_driver.nix b/nixpkgs/pkgs/development/python-modules/marionette-harness/marionette_driver.nix
new file mode 100644
index 000000000000..28193528ed28
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/marionette-harness/marionette_driver.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+, mozversion
+, mozrunner
+}:
+
+buildPythonPackage rec {
+  pname = "marionette_driver";
+  version = "3.0.0";
+  disabled = isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "99ca2513d4e2ca29a08e550346f23947a50627a2b02f6ad36a4550e779fa0ce8";
+  };
+
+  propagatedBuildInputs = [ mozversion mozrunner ];
+
+  meta = {
+    description = "Mozilla Marionette driver";
+    homepage = "https://wiki.mozilla.org/Auto-tools/Projects/Marionette";
+    license = lib.licenses.mpl20;
+    maintainers = with lib.maintainers; [ raskin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/marionette-harness/mozcrash.nix b/nixpkgs/pkgs/development/python-modules/marionette-harness/mozcrash.nix
new file mode 100644
index 000000000000..18b39307a17e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/marionette-harness/mozcrash.nix
@@ -0,0 +1,25 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, mozfile
+, mozlog
+}:
+
+buildPythonPackage rec {
+  pname = "mozcrash";
+  version = "1.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "8c2d2f32bd6e0ba3644f5d16e427444d8cb51ec1e9baa340a33e10687307f8c4";
+  };
+
+  propagatedBuildInputs = [ mozfile mozlog ];
+
+  meta = {
+    description = "Minidump stack trace extractor";
+    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/marionette-harness/mozdevice.nix b/nixpkgs/pkgs/development/python-modules/marionette-harness/mozdevice.nix
new file mode 100644
index 000000000000..56c8fc5254d2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/marionette-harness/mozdevice.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, mozlog
+, moznetwork
+, mozprocess
+}:
+
+buildPythonPackage rec {
+  pname = "mozdevice";
+  version = "3.0.7";
+  format = "wheel";
+
+  src = fetchPypi {
+    inherit pname version format;
+    sha256 = "1n7l3drdh3rm3320v98c9hhh37ljk9l861hyw18psca7jdd717n5";
+  };
+
+  propagatedBuildInputs = [ mozlog moznetwork mozprocess ];
+
+  meta = {
+    description = "Mozilla-authored device management";
+    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/marionette-harness/mozfile.nix b/nixpkgs/pkgs/development/python-modules/marionette-harness/mozfile.nix
new file mode 100644
index 000000000000..2cce0a221244
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/marionette-harness/mozfile.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "mozfile";
+  version = "2.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "e5dc835582ea150e35ecd57e9d86cb707d3aa3b2505679db7332326dd49fd6b8";
+  };
+
+  propagatedBuildInputs = [ six ];
+
+  # mozhttpd -> moznetwork -> mozinfo -> mozfile
+  doCheck = false;
+
+  meta = {
+    description = "File utilities for Mozilla testing";
+    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/marionette-harness/mozhttpd.nix b/nixpkgs/pkgs/development/python-modules/marionette-harness/mozhttpd.nix
new file mode 100644
index 000000000000..a7cbb7ece08c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/marionette-harness/mozhttpd.nix
@@ -0,0 +1,24 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, moznetwork
+}:
+
+buildPythonPackage rec {
+  pname = "mozhttpd";
+  version = "0.7.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "3e2a9b4d6c007a1a9fb729d6e95b5404d138914727747e10155426492dced975";
+  };
+
+  propagatedBuildInputs = [ moznetwork ];
+
+  meta = {
+    description = "Webserver for Mozilla testing";
+    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/marionette-harness/mozinfo.nix b/nixpkgs/pkgs/development/python-modules/marionette-harness/mozinfo.nix
new file mode 100644
index 000000000000..b7d91cc16f52
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/marionette-harness/mozinfo.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+, mozfile
+}:
+
+buildPythonPackage rec {
+  pname = "mozinfo";
+  version = "1.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "4525c26350fb85c26b38c5f853a19f47b17b49a74de363d285d54258972a4cbc";
+  };
+
+  disabled = isPy3k;
+
+  propagatedBuildInputs = [ mozfile ];
+
+  meta = with lib; {
+    description = "System information utilities for Mozilla testing";
+    homepage = "https://wiki.mozilla.org/Auto-tools/Projects/Mozbase";
+    license = licenses.mpl20;
+    maintainers = with maintainers; [ raskin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/marionette-harness/mozlog.nix b/nixpkgs/pkgs/development/python-modules/marionette-harness/mozlog.nix
new file mode 100644
index 000000000000..ee1aed055e74
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/marionette-harness/mozlog.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+, blessings
+, mozterm
+, six
+, mozfile
+}:
+
+buildPythonPackage rec {
+  pname = "mozlog";
+  version = "5.0";
+
+  disabled = isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0h1hgs13c1w0wvz60400i37m00077li1ky28j7kgx4bl75pkd3sw";
+  };
+
+  propagatedBuildInputs = [ blessings mozterm six ];
+
+  checkInputs = [ mozfile ];
+
+  meta = {
+    description = "Mozilla logging library";
+    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/marionette-harness/moznetwork.nix b/nixpkgs/pkgs/development/python-modules/marionette-harness/moznetwork.nix
new file mode 100644
index 000000000000..6bdc93f680a7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/marionette-harness/moznetwork.nix
@@ -0,0 +1,25 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, mozlog
+, mozinfo
+}:
+
+buildPythonPackage rec {
+  pname = "moznetwork";
+  version = "1.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0ws20l4ggb6mj7ycwrk5h7hj1jmj3mj0ca48k5jzsa4n042ahwrd";
+  };
+
+  propagatedBuildInputs = [ mozlog mozinfo ];
+
+  meta = {
+    description = "Network utilities for Mozilla testing";
+    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/marionette-harness/mozprocess.nix b/nixpkgs/pkgs/development/python-modules/marionette-harness/mozprocess.nix
new file mode 100644
index 000000000000..91ed225ecb80
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/marionette-harness/mozprocess.nix
@@ -0,0 +1,24 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, mozinfo
+}:
+
+buildPythonPackage rec {
+  pname = "mozprocess";
+  version = "1.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a0fd8367e663d3cac74ee46bffa789667bc8d52f242d81a14522205fa6650cb2";
+  };
+
+  propagatedBuildInputs = [ mozinfo ];
+
+  meta = {
+    description = "Mozilla-authored process 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/marionette-harness/mozprofile.nix b/nixpkgs/pkgs/development/python-modules/marionette-harness/mozprofile.nix
new file mode 100644
index 000000000000..7075a37263b3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/marionette-harness/mozprofile.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, mozlog
+, mozfile
+, mozhttpd
+, wptserve
+}:
+
+buildPythonPackage rec {
+  pname = "mozprofile";
+  version = "2.4.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "09l18x72vahq7il9nj6qj7la2d21vvbcn9szlm3vsvsbkz68w0yk";
+  };
+
+  propagatedBuildInputs = [ mozlog mozfile mozhttpd ];
+
+  checkInputs = [ wptserve ];
+
+  meta = {
+    description = "Mozilla application profile handling library";
+    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/marionette-harness/mozrunner.nix b/nixpkgs/pkgs/development/python-modules/marionette-harness/mozrunner.nix
new file mode 100644
index 000000000000..fc1d8a7bc7c8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/marionette-harness/mozrunner.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, mozdevice
+, mozfile
+, mozinfo
+, mozlog
+, mozprocess
+, mozprofile
+, mozcrash
+}:
+
+buildPythonPackage rec {
+  pname = "mozrunner";
+  version = "7.7.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "04s6w0sp83bn3c6ym75rnlpmcy3yr7d35jxkxhgzmy75gbcps7bi";
+  };
+
+  propagatedBuildInputs = [ mozdevice mozfile mozinfo mozlog mozprocess
+    mozprofile mozcrash ];
+
+  meta = {
+    description = "Mozilla application start/stop helpers";
+    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/marionette-harness/moztest.nix b/nixpkgs/pkgs/development/python-modules/marionette-harness/moztest.nix
new file mode 100644
index 000000000000..1c9f9259d995
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/marionette-harness/moztest.nix
@@ -0,0 +1,24 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, mozinfo
+}:
+
+buildPythonPackage rec {
+  pname = "moztest";
+  version = "0.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1pg9pqq4xnn14k1jqbyqg81zag2v66y725537v6hixi41yiqkdas";
+  };
+
+  propagatedBuildInputs = [ mozinfo ];
+
+  meta = {
+    description = "Mozilla test result storage and output";
+    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/marionette-harness/mozversion.nix b/nixpkgs/pkgs/development/python-modules/marionette-harness/mozversion.nix
new file mode 100644
index 000000000000..9717a847d359
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/marionette-harness/mozversion.nix
@@ -0,0 +1,25 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, mozlog
+, mozdevice
+}:
+
+buildPythonPackage rec {
+  pname = "mozversion";
+  version = "2.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0jczc1yr2yi3mf1qdgpvg9sidp5hf3jplzs4917j65ymvk2zw9na";
+  };
+
+  propagatedBuildInputs = [ mozlog mozdevice ];
+
+  meta = {
+    description = "Application version information library";
+    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..031f7b04021b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/marisa-trie/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestrunner
+, pytest
+, hypothesis
+}:
+
+buildPythonPackage rec {
+  pname = "marisa-trie";
+  version = "0.7.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "c73bc25d868e8c4ea7aa7f1e19892db07bba2463351269b05340ccfa06eb2baf";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "hypothesis==" "hypothesis>="
+  '';
+
+  nativeBuildInputs = [ pytestrunner ];
+
+  checkInputs = [ pytest hypothesis ];
+
+  meta = with lib; {
+    description = "Static memory-efficient Trie-like structures for Python (2.x and 3.x) 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/marisa/default.nix b/nixpkgs/pkgs/development/python-modules/marisa/default.nix
new file mode 100644
index 000000000000..a30f7062df0a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/marisa/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub, marisa, swig
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "marisa";
+  version = "1.3.40";
+
+  disabled = isPy3k;
+
+  src = fetchFromGitHub {
+    owner = "s-yata";
+    repo  = "marisa-trie";
+    rev   = "8dba9850b89d7828ebf33b8ab84df2b54d31260b";
+    sha256 = "0pkp9fggk53lxlicfwrskgx33qplc4v6njbavlnz4x4z63zd4933";
+  };
+
+  nativeBuildInputs = [ swig marisa ];
+  buildInputs = [ marisa ];
+
+  sourceRoot = "${src.name}/bindings/python";
+
+  meta = with lib; {
+    description = "Python binding for marisa package (do not confuse with marisa-trie python bindings)";
+    homepage    = "https://github.com/s-yata/marisa-trie";
+    license     = with licenses; [ bsd2 lgpl2 ];
+    maintainers = with maintainers; [ vanzef ];
+  };
+}
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..2d915762fca2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/markdown-it-py/default.nix
@@ -0,0 +1,47 @@
+{ lib, buildPythonPackage, fetchFromGitHub, pytestCheckHook, pythonOlder
+, attrs
+, coverage
+, psutil
+, pytest-benchmark
+}:
+
+buildPythonPackage rec {
+  pname = "markdown-it-py";
+  version = "0.5.6";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "executablebooks";
+    repo = "markdown-it-py";
+    rev = "v${version}";
+    sha256 = "1m9g8xvd7jiz80x9hl8bw9x0ppndqq5nlcn5y8bjxnfj5s31vpbi";
+  };
+
+  propagatedBuildInputs = [ attrs ];
+
+  checkInputs = [
+    coverage
+    pytest-benchmark
+    psutil
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # Requires the unpackaged pytest-regressions fixture plugin
+    "test_amsmath"
+    "test_container"
+    "test_deflist"
+    "test_dollarmath"
+    "test_spec"
+    "test_texmath"
+  ];
+
+  meta = with lib; {
+    description = "Markdown parser done right";
+    homepage = "https://markdown-it-py.readthedocs.io/en/latest";
+    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..e248bfe60cc4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/markdown-macros/default.nix
@@ -0,0 +1,40 @@
+{ lib, stdenv
+, 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/3_1.nix b/nixpkgs/pkgs/development/python-modules/markdown/3_1.nix
new file mode 100644
index 000000000000..eb9b2e59ec81
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/markdown/3_1.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools
+, nose
+, pyyaml
+, pythonOlder
+, importlib-metadata
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "Markdown";
+  version = "3.1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "2e50876bcdd74517e7b71f3e7a76102050edec255b3983403f1a63e7c8a41e7a";
+  };
+
+  propagatedBuildInputs = [
+    setuptools
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  checkInputs = [ nose pyyaml ];
+
+  meta = {
+    description = "A Python implementation of John Gruber's Markdown with Extension support";
+    homepage = "https://github.com/Python-Markdown/markdown";
+    license = lib.licenses.bsd3;
+  };
+}
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..22b0d5c27f89
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/markdown/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools
+, nose
+, pyyaml
+, pythonOlder
+, importlib-metadata
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "Markdown";
+  version = "3.3.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "5d9f2b5ca24bc4c7a390d22323ca4bad200368612b5aaa7796babf971d2b2f18";
+  };
+
+  propagatedBuildInputs = [
+    setuptools
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  disabled = !isPy3k;
+
+  checkInputs = [ nose pyyaml ];
+
+  meta = {
+    description = "A Python implementation of John Gruber's Markdown with Extension support";
+    homepage = "https://github.com/Python-Markdown/markdown";
+    license = lib.licenses.bsd3;
+  };
+}
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..2f929012df89
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/markdown2/default.nix
@@ -0,0 +1,19 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "markdown2";
+  version = "2.3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "08a124043aa0ad36ba2136239547d5011a2b770278abb11a5609611e0040ea05";
+  };
+
+  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..94cfb637a15e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/markdownsuperscript/default.nix
@@ -0,0 +1,31 @@
+{ lib, buildPythonPackage, fetchPypi, markdown,
+  pytest, pytestrunner, pytestcov, 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 pytestrunner pytestcov 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..d039198b3938
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/markerlib/default.nix
@@ -0,0 +1,30 @@
+{ lib, stdenv
+, 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/markupsafe/default.nix b/nixpkgs/pkgs/development/python-modules/markupsafe/default.nix
new file mode 100644
index 000000000000..6a6e06cd3177
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/markupsafe/default.nix
@@ -0,0 +1,22 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "MarkupSafe";
+  version = "1.1.1";
+
+ src = fetchPypi {
+    inherit pname version;
+    sha256 = "29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b";
+  };
+
+  meta = with lib; {
+    description = "Implements a XML/HTML/XHTML Markup safe string";
+    homepage = "http://dev.pocoo.org";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ domenkozar ];
+  };
+
+}
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..16af840b036b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/marshmallow-enum/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, marshmallow
+, pytestCheckHook
+, isPy27
+, enum34
+, pytest-flake8
+}:
+
+buildPythonPackage rec {
+  pname = "marshmallow-enum";
+  version = "1.5.1";
+
+  src = fetchFromGitHub {
+    owner = "justanr";
+    repo = "marshmallow_enum";
+    rev = "v${version}";
+    sha256 = "1ihrcmyfjabivg6hc44i59hnw5ijlg1byv3zs1rqxfynp8xr7398";
+  };
+
+  propagatedBuildInputs = [
+    marshmallow
+  ] ++ lib.optionals isPy27 [ enum34 ];
+
+  checkInputs = [
+    pytestCheckHook
+    pytest-flake8
+  ];
+
+  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-polyfield/default.nix b/nixpkgs/pkgs/development/python-modules/marshmallow-polyfield/default.nix
new file mode 100644
index 000000000000..e3b629b3034e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/marshmallow-polyfield/default.nix
@@ -0,0 +1,34 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, lib
+, marshmallow
+  # Check Inputs
+, pytestCheckHook
+, pytestcov
+}:
+
+buildPythonPackage rec {
+  pname = "marshmallow-polyfield";
+  version = "5.9";
+
+  src = fetchFromGitHub {
+    owner = "Bachmann1234";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "15yx8ib5yx1xx6kq8wnfdmv9zm43k7y33c6zpq5rba6a30v4lcnd";
+  };
+
+  propagatedBuildInputs = [
+    marshmallow
+  ];
+
+  # setuptools check can run, but won't find tests
+  checkInputs = [ pytestCheckHook pytestcov ];
+
+  meta = with lib; {
+    description = "An unofficial 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..4bf670082b61
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/marshmallow-sqlalchemy/default.nix
@@ -0,0 +1,23 @@
+{ lib, buildPythonPackage, fetchPypi,
+  marshmallow, sqlalchemy
+}:
+
+buildPythonPackage rec {
+  pname = "marshmallow-sqlalchemy";
+  version = "0.24.1";
+
+  meta = {
+    homepage = "https://github.com/marshmallow-code/marshmallow-sqlalchemy";
+    description = "SQLAlchemy integration with marshmallow ";
+    license = lib.licenses.mit;
+  };
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d051cf013c075c43e1ee5c4b01f8fab6dd6b140dab6825be45875f674a0d289c";
+  };
+
+  propagatedBuildInputs = [ marshmallow sqlalchemy ];
+
+  doCheck = false;
+}
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..afc378d4aaa8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/marshmallow/default.nix
@@ -0,0 +1,27 @@
+{ lib, buildPythonPackage, fetchPypi,
+  dateutil, simplejson, isPy27
+}:
+
+buildPythonPackage rec {
+  pname = "marshmallow";
+  version = "3.9.1";
+  disabled = isPy27;
+
+  meta = {
+    homepage = "https://github.com/marshmallow-code/marshmallow";
+    description = ''
+      A lightweight library for converting complex objects to and from
+      simple Python datatypes.
+    '';
+    license = lib.licenses.mit;
+  };
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "73facc37462dfc0b27f571bdaffbef7709e19f7a616beb3802ea425b07843f4e";
+  };
+
+  propagatedBuildInputs = [ dateutil simplejson ];
+
+  doCheck = false;
+}
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..4c500a18515a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mask-rcnn/default.nix
@@ -0,0 +1,51 @@
+{ buildPythonPackage
+, cython
+, fetchFromGitHub
+, h5py
+, imgaug
+, ipython
+, Keras
+, lib
+, matplotlib
+, numpy
+, opencv3
+, pillow
+, scikitimage
+, scipy
+, tensorflow_2
+}:
+
+buildPythonPackage rec {
+  pname = "mask-rcnn";
+  version = "2.1";
+
+  src = fetchFromGitHub {
+    owner = "matterport";
+    repo = "Mask_RCNN";
+    rev = "3deaec5d902d16e1daf56b62d5971d428dc920bc";
+    sha256 = "13s3q9yh2q9m9vyksd269mww3bni4q2w7q5l419q70ca075qp8zp";
+  };
+
+  nativeBuildInputs = [ cython ];
+
+  propagatedBuildInputs = [
+    h5py
+    imgaug
+    ipython
+    Keras
+    matplotlib
+    numpy
+    opencv3
+    pillow
+    scikitimage
+    scipy
+    tensorflow_2 # Keras only supports tensorflow 2 now
+  ];
+
+  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/matchpy/default.nix b/nixpkgs/pkgs/development/python-modules/matchpy/default.nix
new file mode 100644
index 000000000000..132be56f19b3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/matchpy/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchpatch
+, fetchPypi
+, hopcroftkarp
+, multiset
+, pytest
+, pytestrunner
+, hypothesis
+, setuptools_scm
+, isPy27
+}:
+
+buildPythonPackage rec {
+  pname = "matchpy";
+  version = "0.5.1";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1vvf1cd9kw5z1mzvypc9f030nd18lgvvjc8j56b1s9b7dyslli2r";
+  };
+
+  patches = [
+    # Fix tests for pytest 4. Remove with the next release
+    (fetchpatch {
+      url = "https://github.com/HPAC/matchpy/commit/b405a2717a7793d58c47b2e2197d9d00c06fb13c.patch";
+      includes = [ "tests/conftest.py" ];
+      sha256 = "1b6gqf2vy9qxg384nqr9k8il335afhbdmlyx4vhd8r8rqpv7gax9";
+    })
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+       --replace "hypothesis>=3.6,<4.0" "hypothesis" \
+       --replace "pytest>=3.0,<4.0" "pytest"
+  '';
+
+  buildInputs = [ setuptools_scm pytestrunner ];
+  checkInputs = [ pytest hypothesis ];
+  propagatedBuildInputs = [ hopcroftkarp multiset ];
+
+  meta = with lib; {
+    description = "A library for pattern matching on symbolic expressions";
+    homepage = "https://github.com/HPAC/matchpy";
+    license = licenses.mit;
+    maintainers = [ 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..969a91870b0f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mathlibtools/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, fetchPypi, PyGithub, GitPython, toml, click, tqdm,
+  paramiko, networkx, pydot, pyyaml }:
+
+buildPythonPackage rec {
+  pname = "mathlibtools";
+  version = "1.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "da41c65e206f55b1faea303581fc11215e52d6e6990b827336b2e1eb82aad96c";
+  };
+
+  propagatedBuildInputs = [
+    PyGithub GitPython toml click tqdm paramiko networkx pydot pyyaml
+  ];
+
+  # 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/matplotlib/2.nix b/nixpkgs/pkgs/development/python-modules/matplotlib/2.nix
new file mode 100644
index 000000000000..2c929d9a694e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/matplotlib/2.nix
@@ -0,0 +1,85 @@
+{ lib, stdenv, fetchPypi, python, buildPythonPackage, pycairo, backports_functools_lru_cache
+, which, cycler, dateutil, nose, numpy, pyparsing, sphinx, tornado, kiwisolver
+, freetype, libpng, pkg-config, mock, pytz, pygobject3, gobject-introspection, functools32, subprocess32
+, fetchpatch
+, enableGhostscript ? false, ghostscript ? null, gtk3
+, enableGtk3 ? false, cairo
+# darwin has its own "MacOSX" backend
+, enableTk ? !stdenv.isDarwin, tcl ? null, tk ? null, tkinter ? null, libX11 ? null
+, enableQt ? false, pyqt4
+, Cocoa
+, pythonOlder
+}:
+
+assert enableGhostscript -> ghostscript != null;
+assert enableTk -> (tcl != null)
+                && (tk != null)
+                && (tkinter != null)
+                && (libX11 != null)
+                ;
+assert enableQt -> pyqt4 != null;
+
+buildPythonPackage rec {
+  version = "2.2.3";
+  pname = "matplotlib";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "7355bf757ecacd5f0ac9dd9523c8e1a1103faadf8d33c22664178e17533f8ce5";
+  };
+
+  patches = [
+    # https://github.com/matplotlib/matplotlib/pull/12478
+    (fetchpatch {
+      name = "numpy-1.16-compat.patch";
+      url = "https://github.com/matplotlib/matplotlib/commit/2980184d092382a40ab21f95b79582ffae6e19d6.patch";
+      sha256 = "1c0wj28zy8s5h6qiavx9zzbhlmhjwpzbc3fyyw9039mbnqk0spg2";
+    })
+  ];
+
+  XDG_RUNTIME_DIR = "/tmp";
+
+  nativeBuildInputs = [ pkg-config ];
+
+  buildInputs = [ which sphinx ]
+    ++ lib.optional enableGhostscript ghostscript
+    ++ lib.optional stdenv.isDarwin [ Cocoa ];
+
+  propagatedBuildInputs =
+    [ cycler dateutil nose numpy pyparsing tornado freetype kiwisolver
+      libpng mock pytz ]
+    ++ lib.optional (pythonOlder "3.3") backports_functools_lru_cache
+    ++ lib.optionals enableGtk3 [ cairo pycairo gtk3 gobject-introspection pygobject3 ]
+    ++ lib.optionals enableTk [ tcl tk tkinter libX11 ]
+    ++ lib.optionals enableQt [ pyqt4 ]
+    ++ lib.optionals python.isPy2 [ functools32 subprocess32 ];
+
+  setup_cfg = ./setup.cfg;
+  preBuild = ''
+    cp "$setup_cfg" ./setup.cfg
+  '';
+
+  # 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";
+
+  # 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/";
+    maintainers = with maintainers; [ lovek323 veprbl ];
+  };
+
+}
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..bf21422b7721
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/matplotlib/default.nix
@@ -0,0 +1,76 @@
+{ lib, stdenv, fetchPypi, python, buildPythonPackage, isPy3k, pycairo, backports_functools_lru_cache
+, which, cycler, dateutil, nose, numpy, pyparsing, sphinx, tornado, kiwisolver
+, freetype, libpng, pkg-config, mock, pytz, pygobject3, gobject-introspection
+, certifi, pillow
+, enableGhostscript ? true, ghostscript ? null, gtk3
+, enableGtk3 ? false, cairo
+# darwin has its own "MacOSX" backend
+, enableTk ? !stdenv.isDarwin, tcl ? null, tk ? null, tkinter ? null, libX11 ? null
+, enableQt ? false, pyqt5 ? null
+, Cocoa
+, pythonOlder
+}:
+
+assert enableGhostscript -> ghostscript != null;
+assert enableTk -> (tcl != null)
+                && (tk != null)
+                && (tkinter != null)
+                && (libX11 != null)
+                ;
+assert enableQt -> pyqt5 != null;
+
+buildPythonPackage rec {
+  version = "3.3.3";
+  pname = "matplotlib";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b1b60c6476c4cfe9e5cf8ab0d3127476fd3d5f05de0f343a452badaad0e4bdec";
+  };
+
+  XDG_RUNTIME_DIR = "/tmp";
+
+  nativeBuildInputs = [ pkg-config ];
+
+  buildInputs = [ which sphinx ]
+    ++ lib.optional enableGhostscript ghostscript
+    ++ lib.optional stdenv.isDarwin [ Cocoa ];
+
+  propagatedBuildInputs =
+    [ cycler dateutil numpy pyparsing tornado freetype kiwisolver
+      certifi libpng mock pytz pillow ]
+    ++ lib.optionals enableGtk3 [ cairo pycairo gtk3 gobject-introspection pygobject3 ]
+    ++ lib.optionals enableTk [ tcl tk tkinter libX11 ]
+    ++ lib.optionals enableQt [ pyqt5 ];
+
+  setup_cfg = if stdenv.isDarwin then ./setup-darwin.cfg else ./setup.cfg;
+  preBuild = ''
+    cp "$setup_cfg" ./setup.cfg
+  '';
+
+  # 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";
+
+  # 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/";
+    maintainers = with maintainers; [ lovek323 veprbl ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/matplotlib/setup-darwin.cfg b/nixpkgs/pkgs/development/python-modules/matplotlib/setup-darwin.cfg
new file mode 100644
index 000000000000..f6463d9c574a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/matplotlib/setup-darwin.cfg
@@ -0,0 +1,7 @@
+[directories]
+basedirlist = .
+
+[libs]
+system_freetype = true
+# LTO not working in darwin stdenv, see #19312
+enable_lto = false
diff --git a/nixpkgs/pkgs/development/python-modules/matplotlib/setup.cfg b/nixpkgs/pkgs/development/python-modules/matplotlib/setup.cfg
new file mode 100644
index 000000000000..6a7738627651
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/matplotlib/setup.cfg
@@ -0,0 +1,5 @@
+[directories]
+basedirlist = .
+
+[libs]
+system_freetype = true
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..34c99a1ebe1c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/matrix-client/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, requests
+, pytest, pytestrunner, responses
+}:
+
+buildPythonPackage rec {
+  pname = "matrix_client";
+  version = "0.3.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1mgjd0ymf9mvqjkvgx3xjhxap7rzdmpa21wfy0cxbw2xcswcrqyw";
+  };
+
+  checkInputs = [ pytest pytestrunner responses ];
+
+  propagatedBuildInputs = [ requests ];
+
+  meta = with lib; {
+    description = "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-nio/default.nix b/nixpkgs/pkgs/development/python-modules/matrix-nio/default.nix
new file mode 100644
index 000000000000..69774b58eb69
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/matrix-nio/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, git
+, attrs
+, future
+, aiohttp
+, aiofiles
+, h11
+, h2
+, Logbook
+, jsonschema
+, unpaddedbase64
+, pycryptodome
+, python-olm
+, peewee
+, cachetools
+, atomicwrites
+}:
+
+buildPythonPackage rec {
+  pname = "matrix-nio";
+  version = "0.15.2";
+
+  src = fetchFromGitHub {
+    owner = "poljar";
+    repo = "matrix-nio";
+    rev = version;
+    sha256 = "190xw3cvk4amr9pl8ip2i7k3xdjd0231kn2zl6chny5axx22p1dv";
+  };
+
+  nativeBuildInputs = [
+    git
+  ];
+
+  propagatedBuildInputs = [
+    attrs
+    future
+    aiohttp
+    aiofiles
+    h11
+    h2
+    Logbook
+    jsonschema
+    unpaddedbase64
+    pycryptodome
+    python-olm
+    peewee
+    cachetools
+    atomicwrites
+  ];
+
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A Python Matrix client library, designed according to sans I/O principles";
+    homepage = "https://github.com/poljar/matrix-nio";
+    license = licenses.isc;
+    maintainers = with maintainers; [ tilpner emily symphorien ];
+  };
+}
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..2d890115a51d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mautrix/default.nix
@@ -0,0 +1,35 @@
+{ lib, buildPythonPackage, fetchPypi, aiohttp, pythonOlder
+, sqlalchemy, ruamel_yaml, CommonMark, lxml, fetchpatch
+}:
+
+buildPythonPackage rec {
+  pname = "mautrix";
+  version = "0.8.9";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "13669a0150370c96cabcff859fb4d17f4a539dc7c707ff0c99c00612e24f5447";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+
+    # defined in optional-requirements.txt
+    sqlalchemy
+    ruamel_yaml
+    CommonMark
+    lxml
+  ];
+
+  disabled = pythonOlder "3.7";
+
+  # no tests available
+  doCheck = false;
+
+  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 ];
+  };
+}
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..d101cdfd0c2e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/maxminddb/default.nix
@@ -0,0 +1,34 @@
+{ stdenv, lib, buildPythonPackage, pythonOlder, pythonAtLeast
+, fetchPypi
+, libmaxminddb
+, ipaddress
+, mock
+, nose
+}:
+
+buildPythonPackage rec {
+  version = "2.0.3";
+  pname = "maxminddb";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "47e86a084dd814fac88c99ea34ba3278a74bc9de5a25f4b815b608798747c7dc";
+  };
+
+  buildInputs = [ libmaxminddb ];
+
+  propagatedBuildInputs = [ ipaddress ];
+
+  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://www.maxmind.com/en/home";
+    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..9cd1019a0301
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/maya/default.nix
@@ -0,0 +1,32 @@
+{ lib, stdenv, 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..2fd536609076
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mayavi/default.nix
@@ -0,0 +1,45 @@
+{ lib, buildPythonPackage, isPy27, fetchPypi, wrapQtAppsHook
+, pyface, pygments, numpy, vtk, traitsui, envisage, apptools, pyqt5
+}:
+
+buildPythonPackage rec {
+  pname = "mayavi";
+  version = "4.7.1";
+
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "tar.bz2";
+    sha256 = "095p7mds6kqqrp7xqv24iygr3mw85rm7x41wb5y4yc3gi1pznldy";
+  };
+
+  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 = [
+    pyface pygments numpy vtk traitsui envisage apptools pyqt5
+  ];
+
+  doCheck = false; # Needs X server
+
+  preFixup = ''
+    makeWrapperArgs+=("''${qtWrapperArgs[@]}")
+  '';
+
+  meta = with lib; {
+    description = "3D visualization of scientific data in Python";
+    homepage = "https://github.com/enthought/mayavi";
+    maintainers = with maintainers; [ knedlsepp ];
+    license = licenses.bsdOriginal;
+  };
+}
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..2886a436a00d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mccabe/default.nix
@@ -0,0 +1,20 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, pytest, pytestrunner }:
+
+buildPythonPackage rec {
+  pname = "mccabe";
+  version = "0.6.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "07w3p1qm44hgxf3vvwz84kswpsx6s7kvaibzrsx5dzm0hli1i3fx";
+  };
+
+  buildInputs = [ pytest pytestrunner ];
+
+  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/mdp/default.nix b/nixpkgs/pkgs/development/python-modules/mdp/default.nix
new file mode 100644
index 000000000000..5313cd8e89aa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mdp/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, pytest, future, numpy }:
+
+buildPythonPackage rec {
+  pname = "MDP";
+  version = "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ac52a652ccbaed1857ff1209862f03bf9b06d093b12606fb410787da3aa65a0e";
+  };
+
+  checkInputs = [ pytest ];
+  propagatedBuildInputs = [ future numpy ];
+
+  # Tests disabled because of missing dependencies not in nix
+  doCheck = false;
+
+  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/measurement/default.nix b/nixpkgs/pkgs/development/python-modules/measurement/default.nix
new file mode 100644
index 000000000000..6b7a02a76eb5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/measurement/default.nix
@@ -0,0 +1,31 @@
+{ lib, fetchFromGitHub, buildPythonPackage, isPy3k
+, sympy, pytest, pytestrunner, 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 pytestrunner ];
+  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/mecab-python3/default.nix b/nixpkgs/pkgs/development/python-modules/mecab-python3/default.nix
new file mode 100644
index 000000000000..e3abdaa70916
--- /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.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "62abe28a1155398325372291483608427bc82681fef80e7d132904415f9fd42e";
+  };
+
+  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/mechanize/default.nix b/nixpkgs/pkgs/development/python-modules/mechanize/default.nix
new file mode 100644
index 000000000000..e2d2269a43c0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mechanize/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, html5lib
+}:
+
+buildPythonPackage rec {
+  pname = "mechanize";
+  version = "0.4.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "6355c11141f6d4b54a17fc2106944806b5db2711e60b120d15d83db438c333fd";
+  };
+
+  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..5d11d253b6d9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mediafile/default.nix
@@ -0,0 +1,44 @@
+{ buildPythonPackage
+, enum34
+, fetchpatch
+, fetchPypi
+, isPy27
+, lib
+, mutagen
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "mediafile";
+  version = "0.6.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-o/tSAHu8FTr6LZoMHvegr9uCZovNLHS9KkP2U9y4uko=";
+  };
+
+  propagatedBuildInputs = [ mutagen six ] ++ lib.optional isPy27 enum34;
+
+  # NB: Remove in the next release
+  patches = [
+    (fetchpatch {
+      url = "https://github.com/beetbox/mediafile/commit/0ff753d493a1a7f406cb3378545ffe2c85a9afa3.patch";
+      sha256 = "sha256-AQ7YedoYPmLqt4a/odgghIKOY61i9YfA0To0RVFqlk8=";
+    })
+    (fetchpatch {
+      url = "https://github.com/beetbox/mediafile/commit/f0fb4e5111d9dfaa3b38d196ec41fcd237d97953.patch";
+      sha256 = "sha256-5O6RiAqkQEz3Bvqjwwv/LOS33nSIBnT2H/vasGGVrpI=";
+    })
+    (fetchpatch {
+      url = "https://github.com/beetbox/mediafile/commit/d2fc3b59f77c515b02dfe7ad936f89264375d2b4.patch";
+      sha256 = "sha256-SMH0XhCaKLDNB4M8VmZWfGuuelfY5xladZyQYtXtP18=";
+    })
+  ];
+
+  meta = with lib; {
+    description = "MediaFile is a simple 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/meinheld/default.nix b/nixpkgs/pkgs/development/python-modules/meinheld/default.nix
new file mode 100644
index 000000000000..ce7f23168007
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/meinheld/default.nix
@@ -0,0 +1,22 @@
+{ lib, stdenv, fetchPypi, buildPythonPackage, greenlet }:
+
+buildPythonPackage rec {
+  pname = "meinheld";
+  version = "1.0.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "008c76937ac2117cc69e032dc69cea9f85fc605de9bac1417f447c41c16a56d6";
+  };
+
+  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..8871bfdda463
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/meld3/default.nix
@@ -0,0 +1,23 @@
+{ lib, stdenv
+, 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/meliae/default.nix b/nixpkgs/pkgs/development/python-modules/meliae/default.nix
new file mode 100644
index 000000000000..d602e3d94fdc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/meliae/default.nix
@@ -0,0 +1,41 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, cython
+, isPy3k
+, simplejson
+}:
+
+buildPythonPackage rec {
+  pname = "meliae";
+  version = "0.4.0";
+
+  src = fetchPypi {
+    inherit pname;
+    # FIXME when updating to the next version: The tarball on pypi is called
+    # "meliae-0.4.0.tar.gz" while the version within that tarball is
+    # "0.4.0.final.0".
+    version = "0.4.0";
+    sha256 = "976519ab02aaa6a8fb5f596dc4dd9f64fc9510b00e054979566e51c9be7cec99";
+  };
+
+  disabled = isPy3k;
+
+  doCheck = true;
+
+  checkPhase = ''
+    python setup.py build_ext -i
+    python run_tests.py
+  '';
+
+  checkInputs = [ simplejson ];
+
+  propagatedBuildInputs = [ cython ];
+
+  meta = with lib; {
+    description = "Python Memory Usage Analyzer";
+    homepage = "https://launchpad.net/meliae";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ xvapx ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/memcached/default.nix b/nixpkgs/pkgs/development/python-modules/memcached/default.nix
new file mode 100644
index 000000000000..b75bd31361de
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/memcached/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchurl
+, fetchPypi
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "memcached";
+  version = "1.51";
+
+  src = if isPy3k then fetchPypi {
+    inherit version;
+    pname = "python3-${pname}";
+    sha256 = "0na8b369q8fivh3y0nvzbvhh3lgvxiyyv9xp93cnkvwfsr8mkgkw";
+  } else fetchurl {
+    url = "http://ftp.tummy.com/pub/python-memcached/old-releases/python-${pname}-${version}.tar.gz";
+    sha256 = "124s98m6hvxj6x90d7aynsjfz878zli771q96ns767r2mbqn7192";
+  };
+
+  meta = with lib; {
+    description = "Python API for communicating with the memcached distributed memory object cache daemon";
+    homepage = "http://www.tummy.com/Community/software/python-memcached/";
+    license = licenses.psfl;
+  };
+
+}
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..28ff6b7c5e31
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/memory_profiler/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv
+, 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/mergedeep/default.nix b/nixpkgs/pkgs/development/python-modules/mergedeep/default.nix
new file mode 100644
index 000000000000..bcbca3475485
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mergedeep/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv, buildPythonPackage, isPy27, fetchFromGitHub, pytest }:
+
+buildPythonPackage rec {
+  pname = "mergedeep";
+  version = "1.3.1";
+  disabled = isPy27;
+
+  # PyPI tarball doesn't include tests directory
+  src = fetchFromGitHub {
+    owner = "clarketm";
+    repo = "mergedeep";
+    rev = "v${version}";
+    sha256 = "1ryccb64hg438y1wsjlfp4ciq05q4c6khwhllwdnndm8cbkbrgph";
+  };
+
+  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/merkletools/default.nix b/nixpkgs/pkgs/development/python-modules/merkletools/default.nix
new file mode 100644
index 000000000000..92acdaf58ed4
--- /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; [ chiiruno ];
+  };
+}
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..5b97f972dad1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mesa/default.nix
@@ -0,0 +1,34 @@
+{ lib, stdenv, 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/meshlabxml/default.nix b/nixpkgs/pkgs/development/python-modules/meshlabxml/default.nix
new file mode 100644
index 000000000000..c1091296d2e1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/meshlabxml/default.nix
@@ -0,0 +1,29 @@
+{
+  buildPythonPackage,
+  fetchPypi,
+  pythonOlder,
+  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/mesonpep517/default.nix b/nixpkgs/pkgs/development/python-modules/mesonpep517/default.nix
new file mode 100644
index 000000000000..fd44f3e4480e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mesonpep517/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, meson
+, ninja
+, intreehooks
+, pytoml
+, pythonOlder
+}:
+
+# TODO: offer meson as a Python package so we have dist-info folder.
+
+buildPythonPackage rec {
+  pname = "mesonpep517";
+  version = "0.1.9999994";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b5bcca61024164c4a51d29e6921ea1f756d54197c8f052e4c66a2b8399aa9349";
+  };
+
+  nativeBuildInputs = [ intreehooks  ];
+
+  propagatedBuildInputs = [ pytoml ];
+
+  # 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/metaphone/default.nix b/nixpkgs/pkgs/development/python-modules/metaphone/default.nix
new file mode 100644
index 000000000000..1c8557f15c41
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/metaphone/default.nix
@@ -0,0 +1,23 @@
+{ lib, stdenv, buildPythonPackage, isPy3k, fetchPypi, nose }:
+
+buildPythonPackage rec {
+  pname = "metaphone";
+  version = "0.6";
+
+  src = fetchPypi {
+    pname = "Metaphone";
+    inherit version;
+    sha256 = "09ysaczwh2rlsqq9j5fz7m4pq2fs0axp5vvivrpfrdvclvffl2xd";
+  };
+
+  disabled = isPy3k;
+
+  buildInputs = [ nose ];
+
+  meta = with lib; {
+    homepage = "https://github.com/oubiwann/metaphone";
+    description = "A Python implementation of the metaphone and double metaphone algorithms";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ris ];
+  };
+}
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..86deecb5d4f2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mezzanine/default.nix
@@ -0,0 +1,74 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPyPy
+, pyflakes
+, pep8
+, django
+, django_contrib_comments
+, filebrowser_safe
+, grappelli_safe
+, bleach
+, tzlocal
+, beautifulsoup4
+, requests
+, requests_oauthlib
+, future
+, pillow
+, chardet
+}:
+
+buildPythonPackage rec {
+  version = "4.3.1";
+  pname = "Mezzanine";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "42c7909953cc5aea91921b47d804b61e14893bf48a2a476ce49a96559a0fa1d3";
+  };
+
+  disabled = isPyPy || lib.versionOlder django.version "1.11"
+    || lib.versionAtLeast django.version "2.0";
+
+  buildInputs = [ pyflakes pep8 ];
+  propagatedBuildInputs = [ django django_contrib_comments filebrowser_safe grappelli_safe bleach tzlocal beautifulsoup4 requests requests_oauthlib future pillow chardet ];
+
+  # 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 = ''
+      A 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.free;
+    maintainers = with maintainers; [ prikhi ];
+    platforms = platforms.unix;
+    # mezzanine requires django-1.11. Consider overriding python package set to use django_1_11"
+    broken = versionOlder django.version "1.11" || versionAtLeast django.version "2.0";
+  };
+
+}
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..9d31dd378ac4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/micawber/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, beautifulsoup4 }:
+
+buildPythonPackage rec {
+  pname = "micawber";
+  version = "0.5.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ac2d737d8ff27ed01ea3825ed8806970e8137d7b342cef37b39b6dd17e6eb3a4";
+  };
+
+  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/midiutil/default.nix b/nixpkgs/pkgs/development/python-modules/midiutil/default.nix
new file mode 100644
index 000000000000..5ac8d917d75d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/midiutil/default.nix
@@ -0,0 +1,18 @@
+{ lib, stdenv, 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 = [ maintainers.gnidorah ];
+  };
+}
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..8312ea783cb4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mido/default.nix
@@ -0,0 +1,39 @@
+{ stdenv, lib, buildPythonPackage, fetchPypi, substituteAll
+, portmidi, pygame, python-rtmidi, rtmidi-python
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "mido";
+  version = "1.2.9";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1k3sgkxc7j49bapib3b5jnircb1yhyyd8mi0mbfd78zgix9db9y4";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./libportmidi-cdll.patch;
+      libportmidi = "${portmidi.out}/lib/libportmidi${stdenv.targetPlatform.extensions.sharedLibrary}";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    pygame
+    python-rtmidi
+    rtmidi-python
+  ];
+
+  checkInputs = [ pytest ];
+  checkPhase = ''
+    py.test . -rs -q
+  '';
+
+  meta = with lib; {
+    description = "MIDI Objects for Python";
+    homepage = "https://mido.readthedocs.io";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
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/milc/default.nix b/nixpkgs/pkgs/development/python-modules/milc/default.nix
new file mode 100644
index 000000000000..dc824d565474
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/milc/default.nix
@@ -0,0 +1,38 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, appdirs
+, argcomplete
+, colorama
+, gnugrep
+}:
+
+buildPythonPackage rec {
+  pname = "milc";
+  version = "1.0.10";
+
+  src = fetchFromGitHub {
+    owner = "clueboard";
+    repo = "milc";
+    rev = version;
+    sha256 = "04mk057b6jh0k4maqkg80kpilxak9r7vlr9xqwzczh2gs3g2x573";
+  };
+
+  checkInputs = [ gnugrep ];
+  propagatedBuildInputs = [ appdirs argcomplete colorama ];
+
+  # Upstream has a nose2 test suite that runs this hello script in a handful of
+  # ways, but it's not in setup.py and makes assumptions about relative paths in
+  # the src repo, so just sanity-check basic functionality.
+  checkPhase = ''
+    patchShebangs ./hello
+    ./hello | grep "Hello, World"
+  '';
+
+  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/minidb/default.nix b/nixpkgs/pkgs/development/python-modules/minidb/default.nix
new file mode 100644
index 000000000000..dbe9597ea0cc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/minidb/default.nix
@@ -0,0 +1,32 @@
+{ lib, buildPythonPackage, fetchFromGitHub, isPy3k
+, nose
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "minidb";
+  version = "2.0.4";
+  disabled = !isPy3k;
+
+  src = fetchFromGitHub {
+    owner = "thp";
+    repo = "minidb";
+    rev = version;
+    sha256 = "0i607rkfx0rkyllcx4vf3w2z0wxzs1gqigfw87q90pjrbbh2q4sb";
+  };
+
+  # module imports are incompatible with python2
+  doCheck = isPy3k;
+  checkInputs = [ nose pytest ];
+  checkPhase = ''
+    pytest
+  '';
+
+  meta = with lib; {
+    description = "A simple SQLite3-based store for Python objects";
+    homepage = "https://thp.io/2010/minidb/";
+    license = licenses.isc;
+    maintainers = [ 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..346430d23926
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/minidump/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "minidump";
+  version = "0.0.13";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1w93yh2dz7llxjgv0jn7gf9praz7d5952is7idgh0lsyj67ri2ms";
+  };
+
+  # 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 = [ maintainers.fab ];
+  };
+}
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..51ee529e234b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/minikerberos/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, asn1crypto
+, asysocks
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "minikerberos";
+  version = "0.2.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "16bbyihap2ygsi7xg58rwdn14ms1j0jy2kxbdljpg39s9q1rz6ps";
+  };
+
+  propagatedBuildInputs = [
+    asn1crypto
+    asysocks
+  ];
+
+  # 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..f154eabb744c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/minimock/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv
+, 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..00ea5b06c646
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/minio/default.nix
@@ -0,0 +1,41 @@
+{ lib, buildPythonPackage, isPy3k, fetchPypi
+, configparser
+, faker
+, future
+, mock
+, nose
+, python-dateutil
+, pytz
+, pytestCheckHook
+, urllib3
+}:
+
+buildPythonPackage rec {
+  pname = "minio";
+  version = "6.0.2";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "acae9bfae0aec1b92025bd63e18135ebb4994c84600716c5323e14cb0c9a0b03";
+  };
+
+  propagatedBuildInputs = [
+    configparser
+    future
+    python-dateutil
+    pytz
+    urllib3
+  ];
+
+  checkInputs = [ faker mock nose pytestCheckHook ];
+  # example credentials aren't present
+  pytestFlagsArray = [ "--ignore=tests/unit/credentials_test.py" ];
+
+  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..7178405ab74c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/miniupnpc/default.nix
@@ -0,0 +1,18 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "miniupnpc";
+  version = "2.0.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0ca94zz7sr2x57j218aypxqcwkr23n8js30f3yrvvqbg929nr93y";
+  };
+
+  meta = with lib; {
+    description = "miniUPnP client";
+    homepage = "http://miniupnp.free.fr/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ peterhoeg ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/misaka/default.nix b/nixpkgs/pkgs/development/python-modules/misaka/default.nix
new file mode 100644
index 000000000000..07f251f75b5f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/misaka/default.nix
@@ -0,0 +1,22 @@
+{ lib, fetchPypi, buildPythonPackage, cffi }:
+buildPythonPackage rec {
+  pname = "misaka";
+  version = "2.1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1mzc29wwyhyardclj1vg2xsfdibg2lzb7f1azjcxi580ama55wv2";
+  };
+
+  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..29666254e7f0
--- /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.7.2";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "18z6hqfnfjqnrcgfgl5pkj9ggf9yx0yyy94azcn1qf7hqn6g3l14";
+  };
+
+  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..cde668bd5fbe
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mistune/default.nix
@@ -0,0 +1,23 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, nose
+}:
+
+buildPythonPackage rec {
+  pname = "mistune";
+  version = "0.8.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "59a3429db53c50b5c6bcc8a07f8848cb00d7dc8bdb431a4ab41920d201d4756e";
+  };
+
+  buildInputs = [ nose ];
+
+  meta = with lib; {
+    description = "The fastest markdown parser in pure Python";
+    homepage = "https://github.com/lepture/mistune";
+    license = licenses.bsd3;
+  };
+}
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..dd351931e062
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mitmproxy/default.nix
@@ -0,0 +1,116 @@
+{ lib, stdenv
+, fetchFromGitHub
+, buildPythonPackage
+, isPy27
+, fetchpatch
+# Mitmproxy requirements
+, blinker
+, brotli
+, certifi
+, click
+, cryptography
+, flask
+, h2
+, hyperframe
+, kaitaistruct
+, ldap3
+, passlib
+, protobuf
+, pyasn1
+, pyopenssl
+, pyparsing
+, pyperclip
+, ruamel_yaml
+, setuptools
+, sortedcontainers
+, tornado
+, urwid
+, wsproto
+, publicsuffix2
+, zstandard
+# Additional check requirements
+, beautifulsoup4
+, glibcLocales
+, pytest
+, requests
+, asynctest
+, parver
+, pytest-asyncio
+, hypothesis
+, asgiref
+, msgpack
+}:
+
+buildPythonPackage rec {
+  pname = "mitmproxy";
+  version = "5.3.0";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner  = pname;
+    repo   = pname;
+    rev    = "v${version}";
+    sha256 = "04y7fxxssrs14i7zl7fwlwrpnms39i7a6m18481sg8vlrkbagxjr";
+  };
+
+  postPatch = ''
+    # remove dependency constraints
+    sed 's/>=\([0-9]\.\?\)\+\( \?, \?<\([0-9]\.\?\)\+\)\?\( \?, \?!=\([0-9]\.\?\)\+\)\?//' -i setup.py
+  '';
+
+  doCheck = (!stdenv.isDarwin);
+
+  checkPhase = ''
+    export HOME=$(mktemp -d)
+    pytest -k 'not test_get_version' # expects a Git repository
+  '';
+
+  propagatedBuildInputs = [
+    setuptools
+    # setup.py
+    asgiref
+    blinker
+    brotli
+    certifi
+    click
+    cryptography
+    flask
+    h2
+    hyperframe
+    kaitaistruct
+    ldap3
+    msgpack
+    passlib
+    protobuf
+    publicsuffix2
+    pyasn1
+    pyopenssl
+    pyparsing
+    pyperclip
+    ruamel_yaml
+    sortedcontainers
+    tornado
+    urwid
+    wsproto
+    zstandard
+  ];
+
+  checkInputs = [
+    asynctest
+    beautifulsoup4
+    flask
+    glibcLocales
+    hypothesis
+    parver
+    pytest
+    pytest-asyncio
+    requests
+  ];
+
+  meta = with lib; {
+    description = "Man-in-the-middle proxy";
+    homepage    = "https://mitmproxy.org/";
+    license     = licenses.mit;
+    maintainers = with maintainers; [ fpletz kamilchm ];
+  };
+}
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/mkl-service/default.nix b/nixpkgs/pkgs/development/python-modules/mkl-service/default.nix
new file mode 100644
index 000000000000..c8531299620e
--- /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.3.0";
+
+  src = fetchFromGitHub {
+    owner = "IntelPython";
+    repo = "mkl-service";
+    rev = "v${version}";
+    sha256 = "1b4dkkl439rfaa86ywzc2zf9ifawhvdlaiqcg0il83cn5bzs7g5z";
+  };
+
+  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/mlflow/default.nix b/nixpkgs/pkgs/development/python-modules/mlflow/default.nix
new file mode 100644
index 000000000000..89cc8f991466
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mlflow/default.nix
@@ -0,0 +1,72 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, isPy27
+, alembic
+, click
+, cloudpickle
+, requests
+, six
+, flask
+, numpy
+, pandas
+, python-dateutil
+, protobuf
+, GitPython
+, pyyaml
+, querystring_parser
+, simplejson
+, docker
+, databricks-cli
+, entrypoints
+, sqlparse
+, sqlalchemy
+, gorilla
+, gunicorn
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "mlflow";
+  version = "1.12.1";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "9b8af18d6e779fbbb094edfeb963691e485bba62eeec39fd62dfbe34bc12afeb";
+  };
+
+  # 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;
+
+  propagatedBuildInputs = [
+    alembic
+    click
+    cloudpickle
+    requests
+    six
+    flask
+    numpy
+    pandas
+    python-dateutil
+    protobuf
+    GitPython
+    pyyaml
+    querystring_parser
+    simplejson
+    docker
+    databricks-cli
+    entrypoints
+    sqlparse
+    sqlalchemy
+    gorilla
+    gunicorn
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/mlflow/mlflow";
+    description = "Open source platform for the machine learning lifecycle";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ tbenst ];
+    # missing prometheus-flask-exporter, not packaged in nixpkgs
+    broken = true; # 2020-08-15
+  };
+}
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..c3c7c55f292d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mlrose/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv, isPy27, buildPythonPackage, fetchPypi, scikitlearn }:
+
+buildPythonPackage rec {
+  pname = "mlrose";
+  version = "1.3.0";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "cec83253bf6da67a7fb32b2c9ae13e9dbc6cfbcaae2aa3107993e69e9788f15e";
+  };
+
+  propagatedBuildInputs = [ scikitlearn ];
+
+  postPatch = ''
+    sed -i 's,sklearn,scikit-learn,g' setup.py
+  '';
+
+  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..94af156d9afb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mlxtend/default.nix
@@ -0,0 +1,49 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, isPy27
+, pytestCheckHook
+, scipy
+, numpy
+, scikitlearn
+, pandas
+, matplotlib
+, joblib
+}:
+
+buildPythonPackage rec {
+  pname = "mlxtend";
+  version = "0.17.3";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "rasbt";
+    repo = pname;
+    rev = version;
+    sha256 = "1515wgmj5rhwpmky7apmmvys1630sfg534fai6559s13hp11pdcl";
+  };
+
+  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
+    scikitlearn
+    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;
+  };
+}
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..8ac241880039
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mmh3/default.nix
@@ -0,0 +1,23 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+}:
+
+buildPythonPackage rec {
+  pname = "mmh3";
+  version = "2.5.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0265pvfbcsijf51szsh14qk3l3zgs0rb5rbrw11zwan52yi0jlhq";
+  };
+
+  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;
+    maintainers = [ maintainers.danieldk ];
+  };
+}
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..e40fc197a5bf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mmpython/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv
+, 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..84babe171897
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mne-python/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, isPy27
+, numpy
+, scipy
+, pytestCheckHook
+, pytestcov
+, pytest-timeout
+, h5py
+, matplotlib
+, nibabel
+, pandas
+, scikitlearn
+}:
+
+buildPythonPackage rec {
+  pname = "mne-python";
+  version = "0.21.2";
+
+  disabled = isPy27;
+
+  # PyPI dist insufficient to run tests
+  src = fetchFromGitHub {
+    owner = "mne-tools";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "18nfdbkffmxzkkbp3d4w8r2kfi0sxip3hy997d3mx6dy74jc7nmg";
+  };
+
+  propagatedBuildInputs = [ numpy scipy ];
+
+  # all tests pass, but Pytest hangs afterwards - probably some thread hasn't terminated
+  doCheck = false;
+  checkInputs = [
+    pytestCheckHook
+    pytestcov
+    pytest-timeout
+    h5py
+    matplotlib
+    nibabel
+    pandas
+    scikitlearn
+  ];
+  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..2811d0ecda54
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mnemonic/default.nix
@@ -0,0 +1,20 @@
+{ lib, fetchPypi, buildPythonPackage, pbkdf2 }:
+
+buildPythonPackage rec {
+  pname = "mnemonic";
+  version = "0.19";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "4e37eb02b2cbd56a0079cabe58a6da93e60e3e4d6e757a586d9f23d96abea931";
+  };
+
+  propagatedBuildInputs = [ pbkdf2 ];
+
+  meta = {
+    description = "Implementation of Bitcoin BIP-0039";
+    homepage = "https://github.com/trezor/python-mnemonic";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ np ];
+  };
+}
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/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/2.nix b/nixpkgs/pkgs/development/python-modules/mock/2.nix
new file mode 100644
index 000000000000..190297b41a2d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mock/2.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, funcsigs
+, six
+, pbr
+, python
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "mock";
+  version = "3.0.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "83657d894c90d5681d62155c82bda9c1187827525880eda8ff5df4ec813437c3";
+  };
+
+  propagatedBuildInputs = [ six pbr ] ++ lib.optionals isPy27 [ funcsigs ];
+
+  # On PyPy for Python 2.7 in particular, Mock's tests have a known failure.
+  # Mock upstream has a decoration to disable the failing test and make
+  # everything pass, but it is not yet released. The commit:
+  # https://github.com/testing-cabal/mock/commit/73bfd51b7185#diff-354f30a63fb0907d4ad57269548329e3L12
+  #doCheck = !(python.isPyPy && python.isPy27);
+  doCheck = false; # Infinite recursion pytest
+
+  checkPhase = ''
+    ${python.interpreter} -m unittest discover
+  '';
+
+  checkInputs = [
+    pytest
+  ];
+
+  meta = with lib; {
+    description = "Mock objects for Python";
+    homepage = "http://python-mock.sourceforge.net/";
+    license = licenses.bsd2;
+  };
+
+}
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..e905add00f5f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mock/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, funcsigs
+, six
+, pbr
+, python
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "mock";
+  version = "4.0.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "dd33eb70232b6118298d516bbcecd26704689c386594f0f3c4f13867b2c56f72";
+  };
+
+  propagatedBuildInputs = [ six pbr ] ++ lib.optionals isPy27 [ funcsigs ];
+
+  # On PyPy for Python 2.7 in particular, Mock's tests have a known failure.
+  # Mock upstream has a decoration to disable the failing test and make
+  # everything pass, but it is not yet released. The commit:
+  # https://github.com/testing-cabal/mock/commit/73bfd51b7185#diff-354f30a63fb0907d4ad57269548329e3L12
+  #doCheck = !(python.isPyPy && python.isPy27);
+  doCheck = false; # Infinite recursion pytest
+
+  checkPhase = ''
+    ${python.interpreter} -m unittest discover
+  '';
+
+  checkInputs = [
+    pytest
+  ];
+
+  meta = with lib; {
+    description = "Mock objects for Python";
+    homepage = "http://python-mock.sourceforge.net/";
+    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..2102718ab6ef
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mocket/default.nix
@@ -0,0 +1,74 @@
+{ lib, buildPythonPackage, fetchPypi, pythonOlder, isPy27
+, decorator
+, http-parser
+, importlib-metadata
+, python
+, python_magic
+, six
+, urllib3
+, pytestCheckHook
+, pytest-mock
+, aiohttp
+, gevent
+, redis
+, requests
+, sure
+}:
+
+buildPythonPackage rec {
+  pname = "mocket";
+  version = "3.9.39";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1mbcgfy1vfwwzn54vkq8xmfzdyc28brfpqk4d55r3a6abwwsn6a4";
+  };
+
+  propagatedBuildInputs = [
+    decorator
+    http-parser
+    python_magic
+    urllib3
+    six
+  ] ++ lib.optionals (isPy27) [ six ];
+
+  checkInputs = [
+    pytestCheckHook
+    pytest-mock
+    aiohttp
+    gevent
+    redis
+    requests
+    sure
+  ];
+
+  pytestFlagsArray = [
+    "--ignore=tests/main/test_pook.py" # pook is not packaged
+    "--ignore=tests/main/test_redis.py" # requires a live redis instance
+  ] ++ 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"
+  ];
+
+  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..d7ca86b8ea30
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mockito/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, isPy3k, funcsigs, pytest, numpy }:
+
+buildPythonPackage rec {
+  version = "1.2.2";
+  pname = "mockito";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d6b3aca6cdb92bbd47e19ebdb1a0b84ef23ab874eae5c6d505323c8657257c06";
+  };
+
+  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/modeled/default.nix b/nixpkgs/pkgs/development/python-modules/modeled/default.nix
new file mode 100644
index 000000000000..66fe63e3daf1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/modeled/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, zetup
+, six
+, moretools
+, pathpy
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "modeled";
+  version = "0.1.8";
+
+  src = fetchPypi {
+    extension = "zip";
+    inherit pname version;
+    sha256 = "1wcl3r02q10gxy4xw7g8x2wg2sx4sbawzbfcl7a5xdydrxl4r4v4";
+  };
+
+  buildInputs = [ zetup ];
+
+  propagatedBuildInputs = [ six moretools pathpy ];
+
+  checkInputs = [ pytestCheckHook ];
+
+  meta = with lib; {
+    description = "Universal data modeling for Python";
+    homepage = "https://bitbucket.org/userzimmermann/python-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..48abc30c9f7d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/moderngl/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+, libGL
+, libX11
+}:
+
+buildPythonPackage rec {
+  pname = "moderngl";
+  version = "5.5.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "08badabb6a1bbc9aa9e65fae8ecd3275d8342cb45d9c457b19e32b3312a8b663";
+  };
+
+  disabled = !isPy3k;
+
+  buildInputs = [ libGL libX11 ];
+
+  # 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..b4aee8c61cf7
--- /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
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "moderngl_window";
+  version = "2.1.0";
+
+  src = fetchFromGitHub {
+    owner = "moderngl";
+    repo = pname;
+    rev = version;
+    sha256 = "1p03j91pk2bwycd13p0qi8kns1sf357180hd2mkaip8mfaf33x3q";
+  };
+
+  propagatedBuildInputs = [ numpy moderngl pyglet pillow pyrr ];
+
+  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..a7862ef5c678
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/modestmaps/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv
+, 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..e260bb7b54a3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mohawk/default.nix
@@ -0,0 +1,27 @@
+{ lib, buildPythonPackage, fetchPypi, python, 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/moinmoin/default.nix b/nixpkgs/pkgs/development/python-modules/moinmoin/default.nix
new file mode 100644
index 000000000000..cc00643b71ae
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/moinmoin/default.nix
@@ -0,0 +1,35 @@
+{ lib, buildPythonPackage, fetchurl, isPy3k
+, pytest, werkzeug, pygments
+}:
+
+buildPythonPackage rec {
+  pname = "moinmoin";
+  version = "1.9.10";
+
+  # SyntaxError in setup.py
+  disabled = isPy3k;
+
+  src = fetchurl {
+    url = "http://static.moinmo.in/files/moin-${version}.tar.gz";
+    sha256 = "0g05lnl1s8v61phi3z1g3b6lfj4g98grj9kw8nyjl246x0c489ja";
+  };
+
+  patches = [
+    # Recommended to install on their download page.
+    ./fix_tests.patch
+  ];
+
+  prePatch = ''
+    sed -i "s/\xfc/ü/" setup.cfg
+  '';
+
+  checkInputs = [ pytest werkzeug pygments ];
+
+  meta = with lib; {
+    description = "Advanced, easy to use and extensible WikiEngine";
+
+    homepage = "https://moinmo.in/";
+
+    license = licenses.gpl2Plus;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/moinmoin/fix_tests.patch b/nixpkgs/pkgs/development/python-modules/moinmoin/fix_tests.patch
new file mode 100644
index 000000000000..e9856eeffca6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/moinmoin/fix_tests.patch
@@ -0,0 +1,16 @@
+diff -ru3 moin-1.9.9-old/MoinMoin/conftest.py moin-1.9.9-new/MoinMoin/conftest.py
+--- moin-1.9.9-old/MoinMoin/conftest.py	2016-10-31 23:44:02.000000000 +0300
++++ moin-1.9.9-new/MoinMoin/conftest.py	2018-02-18 12:13:19.551929093 +0300
+@@ -22,10 +22,11 @@
+ 
+ import atexit
+ import sys
++import os
+ 
+ import py
+ 
+-rootdir = py.magic.autopath().dirpath()
++rootdir = os.path.abspath(os.path.dirname(__file__))
+ moindir = rootdir.join("..")
+ sys.path.insert(0, str(moindir))
+ 
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..467093e84ceb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mongodict/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv
+, 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..c8969d9e2d4d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mongoengine/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pymongo
+, isPy27
+, six
+, blinker
+, nose
+, pillow
+, coverage
+}:
+
+buildPythonPackage rec {
+  pname = "mongoengine";
+  version = "0.22.0";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "MongoEngine";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "14n9rl8w3i1fq96f3jzsg7gy331d7fmrapva6m38ih53rnf38bdf";
+  };
+
+  propagatedBuildInputs = [
+    pymongo
+    six
+  ];
+
+  checkInputs = [
+    nose
+    pillow
+    coverage
+    blinker
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "coverage==4.2" "coverage"
+  '';
+
+  # tests require mongodb running in background
+  doCheck = false;
+
+  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/monkeyhex/default.nix b/nixpkgs/pkgs/development/python-modules/monkeyhex/default.nix
new file mode 100644
index 000000000000..715665f1b1ba
--- /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.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "5ba913df664c34f3ce53916c83872fddf750adc78a0b0ecdd316ac3e728bb019";
+  };
+
+  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..e93bf206edaa
--- /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.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "23953d55076df038541e648a53676fb24980f7a1be290cdda21300b3bc21dfb0";
+  };
+
+  __propagatedImpureHostDeps = lib.optional stdenv.isDarwin "/usr/lib/libc.dylib";
+
+  patchPhase = lib.optionalString stdenv.isLinux ''
+    substituteInPlace monotonic.py --replace \
+      "ctypes.util.find_library('c')" "'${stdenv.glibc.out}/lib/libc.so.6'"
+  '';
+
+  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..77448d0e15fe
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/monty/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, isPy27
+, nose
+, numpy
+, six
+, ruamel_yaml
+, msgpack
+, coverage
+, coveralls
+, pymongo
+, lsof
+}:
+
+buildPythonPackage rec {
+  pname = "monty";
+  version = "3.0.2";
+  disabled = isPy27; # uses type annotations
+
+  # No tests in Pypi
+  src = fetchFromGitHub {
+    owner = "materialsvirtuallab";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1wxqxp0j7i6czdpr2r1imgmy3qbgn2l7d4za2h1lg3hllvx6jra1";
+  };
+
+  checkInputs = [ lsof nose numpy msgpack coverage coveralls pymongo];
+  propagatedBuildInputs = [ six ruamel_yaml ];
+
+  # test suite tries to decode bytes, but msgpack now returns a str
+  # https://github.com/materialsvirtuallab/monty/pull/121
+  postPatch = ''
+    substituteInPlace tests/test_serialization.py \
+      --replace ".decode('utf-8')" ""
+  '';
+
+  preCheck = ''
+    substituteInPlace tests/test_os.py \
+      --replace 'self.assertEqual("/usr/bin/find", which("/usr/bin/find"))' '#'
+  '';
+
+  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/more-itertools/2.7.nix b/nixpkgs/pkgs/development/python-modules/more-itertools/2.7.nix
new file mode 100644
index 000000000000..f9a6ac732e2e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/more-itertools/2.7.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, nose
+, six
+, stdenv
+}:
+
+
+buildPythonPackage rec {
+  pname = "more-itertools";
+  version = "5.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "38a936c0a6d98a38bcc2d03fdaaedaba9f412879461dd2ceff8d37564d6522e4";
+  };
+
+  checkInputs = [ nose ];
+  propagatedBuildInputs = [ six ];
+
+  # iterable = range(10 ** 10)  # Is efficiently reversible
+  # OverflowError: Python int too large to convert to C long
+  doCheck = !stdenv.hostPlatform.is32bit;
+
+  meta = {
+    homepage = "https://more-itertools.readthedocs.org";
+    description = "Expansion of the itertools module";
+    license = lib.licenses.mit;
+  };
+}
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..74c214d9231d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/more-itertools/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, nose
+, six
+, stdenv
+}:
+
+
+buildPythonPackage rec {
+  pname = "more-itertools";
+  version = "8.6.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b3a9005928e5bed54076e6e549c792b306fddfe72b2d1d22dd63d42d5d3899cf";
+  };
+
+  checkInputs = [ nose ];
+  propagatedBuildInputs = [ six ];
+
+  # iterable = range(10 ** 10)  # Is efficiently reversible
+  # OverflowError: Python int too large to convert to C long
+  doCheck = !stdenv.hostPlatform.is32bit;
+
+  meta = {
+    homepage = "https://more-itertools.readthedocs.org";
+    description = "Expansion of the itertools module";
+    license = lib.licenses.mit;
+  };
+}
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..d39f67a73113
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/moretools/default.nix
@@ -0,0 +1,30 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi
+, six, pathpy, 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 pathpy 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/moto/default.nix b/nixpkgs/pkgs/development/python-modules/moto/default.nix
new file mode 100644
index 000000000000..3efc09bc0017
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/moto/default.nix
@@ -0,0 +1,102 @@
+{ lib, buildPythonPackage, fetchPypi, isPy27, fetchpatch
+, aws-xray-sdk
+, backports_tempfile
+, boto
+, boto3
+, botocore
+, cfn-lint
+, docker
+, flask
+, freezegun
+, jinja2
+, jsondiff
+, mock
+, nose
+, pyaml
+, python-jose
+, pytz
+, requests
+, responses
+, six
+, sshpubkeys
+, sure
+, werkzeug
+, xmltodict
+, parameterized
+, idna
+}:
+
+buildPythonPackage rec {
+  pname = "moto";
+  version = "1.3.14";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0fm09074qic24h8rw9a0paklygyb7xd0ch4890y4v8lj2pnsxbkr";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "jsondiff==1.1.2" "jsondiff~=1.1"
+    sed -i '/datetime/d' setup.py # should be taken care of by std library
+  '';
+
+  patches = [
+    # loosen idna upper limit
+    (fetchpatch {
+      url = "https://github.com/spulec/moto/commit/649b497f71cce95a6474a3ff6f3c9c3339efb68f.patch";
+      sha256 = "03qdybzlskgbdadmlcg6ayxfp821b5iaa8q2542cwkcq7msqbbqc";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    aws-xray-sdk
+    boto
+    boto3
+    botocore
+    cfn-lint
+    docker
+    flask # required for server
+    jinja2
+    jsondiff
+    mock
+    pyaml
+    python-jose
+    pytz
+    six
+    requests
+    responses
+    sshpubkeys
+    werkzeug
+    xmltodict
+    idna
+  ] ++ lib.optionals isPy27 [ backports_tempfile ];
+
+  checkInputs = [ boto3 freezegun nose sure parameterized ];
+
+  checkPhase = ''
+    nosetests -v ./tests/ \
+              -e test_invoke_function_from_sns \
+              -e test_invoke_requestresponse_function \
+              -e test_context_manager \
+              -e test_decorator_start_and_stop \
+              -e test_invoke_event_function \
+              -e test_invoke_function_from_dynamodb \
+              -e test_invoke_function_from_sqs \
+              -e test_invoke_lambda_error \
+              -e test_invoke_async_function \
+              -e test_passthrough_requests
+  '';
+
+  # Disabling because of 20 failing tests due to https://github.com/spulec/moto/issues/2728
+  # We should enable these as soon as possible again though. Note the issue
+  # is unrelated to the docutils 0.16 bump.
+  doCheck = false;
+
+  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/moviepy/default.nix b/nixpkgs/pkgs/development/python-modules/moviepy/default.nix
new file mode 100644
index 000000000000..8bc984a52879
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/moviepy/default.nix
@@ -0,0 +1,52 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, pythonAtLeast
+, numpy
+, decorator
+, imageio
+, imageio-ffmpeg
+, proglog
+, requests
+, tqdm
+# Advanced image processing (triples size of output)
+, advancedProcessing ? false
+, opencv3 ? null
+, scikitimage ? null
+, scikitlearn ? null
+, scipy ? null
+, matplotlib ? null
+, youtube-dl ? null
+}:
+
+assert advancedProcessing -> (
+  opencv3 != null && scikitimage != null && scikitlearn != null
+  && scipy != null && matplotlib != null && youtube-dl != null);
+
+buildPythonPackage rec {
+  pname = "moviepy";
+  version = "1.0.3";
+
+  disabled = !(pythonAtLeast "3.4");
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "2884e35d1788077db3ff89e763c5ba7bfddbd7ae9108c9bc809e7ba58fa433f5";
+  };
+
+  # No tests, require network connection
+  doCheck = false;
+
+  propagatedBuildInputs = [
+    numpy decorator imageio imageio-ffmpeg tqdm requests proglog
+  ] ++ (lib.optionals advancedProcessing [
+    opencv3 scikitimage scikitlearn scipy matplotlib youtube-dl
+  ]);
+
+  meta = with lib; {
+    description = "Video editing with Python";
+    homepage = "https://zulko.github.io/moviepy/";
+    license = licenses.mit;
+  };
+
+}
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..94d4791224df
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mox/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchurl
+}:
+
+buildPythonPackage rec {
+  pname = "mox";
+  version = "0.5.3";
+
+  src = fetchurl {
+    url = "http://pymox.googlecode.com/files/${pname}-${version}.tar.gz";
+    sha256 = "4d18a4577d14da13d032be21cbdfceed302171c275b72adaa4c5997d589a5030";
+  };
+
+  # error: invalid command 'test'
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://pymox.readthedocs.io/";
+    description = "A mock object framework for Python";
+    license = licenses.asl20;
+  };
+
+}
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..77a02ae8a733
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mox3/default.nix
@@ -0,0 +1,38 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, python
+, subunit
+, testrepository
+, testtools
+, six
+, pbr
+, fixtures
+, isPy36
+}:
+
+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 depdencies 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/mozsvc/default.nix b/nixpkgs/pkgs/development/python-modules/mozsvc/default.nix
new file mode 100644
index 000000000000..55afb1773fe3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mozsvc/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, pyramid
+, simplejson
+, konfig
+}:
+
+buildPythonPackage rec {
+  pname = "mozsvc";
+  version = "0.10";
+
+  src = fetchFromGitHub {
+    owner = "mozilla-services";
+    repo = "mozservices";
+    rev = version;
+    sha256 = "0a0558g8j55pd1nnhnnf3k377jv6cah8lxb24v98rq8kxr5960cg";
+  };
+
+  doCheck = false; # too many dependencies and conflicting versions; I (nadrieril) gave up
+  propagatedBuildInputs = [ pyramid simplejson konfig ];
+
+  meta = with lib; {
+    homepage = "https://github.com/mozilla-services/mozservices";
+    description = "Various utilities for Mozilla apps";
+    license = licenses.mpl20;
+    maintainers = with maintainers; [ nadrieril ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mozterm/default.nix b/nixpkgs/pkgs/development/python-modules/mozterm/default.nix
new file mode 100644
index 000000000000..c7f2b4cbc349
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mozterm/default.nix
@@ -0,0 +1,21 @@
+{ lib, buildPythonPackage, fetchPypi, isPy3k, six }:
+
+buildPythonPackage rec {
+  pname = "mozterm";
+  version = "1.0.0";
+
+  # name 'unicode' is not defined
+  disabled = isPy3k;
+
+  propagatedBuildInputs = [six];
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b1e91acec188de07c704dbb7b0100a7be5c1e06567b3beb67f6ea11d00a483a4";
+  };
+
+  meta = with lib; {
+    description = "Terminal abstractions built around the blessings module";
+    license = licenses.mpl20;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mpd/default.nix b/nixpkgs/pkgs/development/python-modules/mpd/default.nix
new file mode 100644
index 000000000000..212e6b5f13c4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mpd/default.nix
@@ -0,0 +1,23 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "python-mpd";
+  version = "0.3.0";
+  disabled = isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "02812eba1d2e0f46e37457f5a6fa23ba203622e4bcab0a19b265e66b08cd21b4";
+  };
+
+  meta = with lib; {
+    description = "An MPD (Music Player Daemon) client library written in pure Python";
+    homepage = "http://jatreuman.indefero.net/p/python-mpd/";
+    license = licenses.gpl3;
+  };
+
+}
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..7fdf64c0e4b7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mpd2/default.nix
@@ -0,0 +1,33 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, python
+, mock
+}:
+
+buildPythonPackage rec {
+  pname = "python-mpd2";
+  version = "3.0.3";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1ikvn2qv6cnbjscpbk6hhsqg34h832mxgg6hp1mf4d8d6nwdx4sn";
+  };
+
+  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..058133665f4a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mpi4py/default.nix
@@ -0,0 +1,51 @@
+{ lib, fetchPypi, python, buildPythonPackage, mpi, openssh }:
+
+buildPythonPackage rec {
+  pname = "mpi4py";
+  version = "3.0.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "012d716c8b9ed1e513fcc4b18e5af16a8791f51e6d1716baccf988ad355c5a1f";
+  };
+
+  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/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..86d55b34f044
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mpmath/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "mpmath";
+  version = "1.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "fc17abe05fbab3382b61a123c398508183406fa132e0223874578e20946499f6";
+  };
+
+  # error: invalid command 'test'
+  doCheck = false;
+
+  meta = with lib; {
+    homepage    = "http://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..0ff66fa8132e
--- /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.4.7";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "jaseg";
+    repo = "python-mpv";
+    rev = "v${version}";
+    sha256 = "1gq2ynzbpmc7bv066ddv2f4rnmvfsi7034vhf9ffp7yzbixf6ys8";
+  };
+
+  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.agpl3;
+  };
+}
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..5660e1b0dc5c
--- /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; [ danharaj ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mrbob/default.nix b/nixpkgs/pkgs/development/python-modules/mrbob/default.nix
new file mode 100644
index 000000000000..64d0ce13a86d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mrbob/default.nix
@@ -0,0 +1,29 @@
+{ buildPythonPackage, lib, stdenv, glibcLocales, mock, nose, isPy3k, jinja2, six
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "mr-bob";
+  version = "0.1.2";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "mr.bob";
+    sha256 = "6737eaf98aaeae85e07ebef844ee5156df2f06a8b28d7c3dcb056f811c588121";
+  };
+
+  disabled = isPy3k;
+
+  checkInputs = [ nose glibcLocales mock ];
+  checkPhase = ''
+    LC_ALL="en_US.UTF-8" nosetests
+  '';
+
+  propagatedBuildInputs = [ jinja2 six ];
+
+  meta = with lib; {
+    homepage = "https://github.com/domenkozar/mr.bob";
+    description = "A tool to generate code skeletons from templates";
+    license = licenses.bsd3;
+  };
+}
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..82ef6fc77f03
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/msal-extensions/default.nix
@@ -0,0 +1,39 @@
+{ buildPythonPackage
+, fetchPypi
+, lib
+, isPy27
+
+# pythonPackages
+, msal
+, pathlib2
+, portalocker
+}:
+
+buildPythonPackage rec {
+  pname = "msal-extensions";
+  version = "0.3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0qbq5qn46053aclpwyzac5zs2xgqirn4hwrf1plrg0m8bnhxy8sm";
+  };
+
+  propagatedBuildInputs = [
+    msal
+    portalocker
+  ] ++ lib.optionals isPy27 [
+    pathlib2
+  ];
+
+  # 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-library-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..37266df5f216
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/msal/default.nix
@@ -0,0 +1,36 @@
+{ buildPythonPackage
+, fetchPypi
+, lib
+
+# pythonPackages
+, pyjwt
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "msal";
+  version = "1.8.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1dcc737ca517df53438bc9a3fae97f17d93d7a93fa1389e6bc44e82eee81ab83";
+  };
+
+  propagatedBuildInputs = [
+    pyjwt
+    requests
+  ];
+
+  # Tests assume Network Connectivity:
+  #   https://github.com/AzureAD/microsoft-authentication-library-for-python/blob/e2958961e8ec16d0af4199f60c36c3f913497e48/tests/test_authority.py#L73
+  doCheck = false;
+
+  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..56bfa06a628a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/msgpack-numpy/default.nix
@@ -0,0 +1,38 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, cython
+, msgpack
+, numpy
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "msgpack-numpy";
+  version = "0.4.7.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "7eaf51acf82d7c467d21aa71df94e1c051b2055e54b755442051b474fa7cf5e1";
+  };
+
+  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..262e5d5ecd0e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/msgpack/default.nix
@@ -0,0 +1,29 @@
+{ buildPythonPackage
+, fetchPypi
+, pytest
+, lib
+}:
+
+buildPythonPackage rec {
+  pname = "msgpack";
+  version = "1.0.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1109s2yynrahwi64ikax68hx0mbclz8p35afmpphw5dwynb49q7s";
+  };
+
+  checkPhase = ''
+    py.test
+  '';
+
+  checkInputs = [ pytest ];
+
+  meta = {
+    homepage = "https://github.com/msgpack/msgpack-python";
+    description = "MessagePack serializer implementation for Python";
+    changelog = "https://github.com/msgpack/msgpack-python/blob/master/ChangeLog.rst";
+    license = lib.licenses.asl20;
+    # maintainers =  ?? ;
+  };
+}
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..ea2ae26c96bc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/msldap/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, asn1crypto
+, asysocks
+, minikerberos
+, prompt_toolkit
+, tqdm
+, winacl
+, winsspi
+}:
+
+buildPythonPackage rec {
+  pname = "msldap";
+  version = "0.3.24";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0q9bhw0lfw9iykjdsqz62ipy3ihfz6kprzw5sc7v1678l2pvs84j";
+  };
+
+  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/msrest/default.nix b/nixpkgs/pkgs/development/python-modules/msrest/default.nix
new file mode 100644
index 000000000000..21b93bf5bfe3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/msrest/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, isPy3k
+, requests
+, requests_oauthlib
+, isodate
+, certifi
+, enum34
+, typing
+, aiohttp
+, aiodns
+, pytest
+, httpretty
+, mock
+, futures
+, trio
+}:
+
+buildPythonPackage rec {
+  version = "0.6.19";
+  pname = "msrest";
+
+  # no tests in PyPI tarball
+  # see https://github.com/Azure/msrest-for-python/pull/152
+  src = fetchFromGitHub {
+    owner = "Azure";
+    repo = "msrest-for-python";
+    rev = "v${version}";
+    sha256 = "sha256-hcUJrWw5EU0aO5Gyhn5+LmuRQN9Bom59cTz3maQ0jvw=";
+  };
+
+  propagatedBuildInputs = [
+    requests requests_oauthlib isodate certifi
+  ] ++ lib.optionals (!isPy3k) [ enum34 typing ]
+    ++ lib.optionals isPy3k [ aiohttp aiodns ];
+
+  checkInputs = [ pytest httpretty ]
+    ++ lib.optionals (!isPy3k) [ mock futures ]
+    ++ lib.optional isPy3k trio;
+
+  # Deselected tests require network access
+  checkPhase = ''
+    pytest tests/ -k "not test_conf_async_trio_requests"
+  '';
+
+  meta = with lib; {
+    description = "The runtime library 'msrest' 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/msrplib/default.nix b/nixpkgs/pkgs/development/python-modules/msrplib/default.nix
new file mode 100644
index 000000000000..16c4cc0f43ae
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/msrplib/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchdarcs
+, eventlib
+, application
+, gnutls
+}:
+
+buildPythonPackage rec {
+  pname = "python-msrplib";
+  version = "0.19.2";
+
+  src = fetchdarcs {
+    url = "http://devel.ag-projects.com/repositories/${pname}";
+    rev = "release-${version}";
+    sha256 = "0d0krwv4hhspjgppnvh0iz51bvdbz23cjasgrppip7x8b00514gz";
+  };
+
+  propagatedBuildInputs = [ eventlib application gnutls ];
+
+  meta = with lib; {
+    homepage = "https://github.com/AGProjects/python-msrplib";
+    description = "Client library for MSRP protocol and its relay extension (RFC 4975 and RFC4976)";
+    license = licenses.lgpl3;
+  };
+
+}
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..e16992929442
--- /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.23.0";
+  pname = "mt-940";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "9274bc8298b2d4b69cb3936bdcda315b50e45975789f519a237bdec58346b8d7";
+  };
+
+  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/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..f76cde9bec53
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/multi_key_dict/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv
+, 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..43cbbbc6b777
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/multidict/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, pytest, pytestrunner, pytestcov
+, isPy3k
+, isPy38
+}:
+
+buildPythonPackage rec {
+  pname = "multidict";
+  version = "5.0.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "e5bf89fe57f702a046c7ec718fe330ed50efd4bcf74722940db2eb0919cddb1c";
+  };
+
+  checkInputs = [ pytest pytestrunner pytestcov ];
+
+  disabled = !isPy3k;
+  # pickle files needed for 3.8 https://github.com/aio-libs/multidict/pull/363
+  doCheck = !isPy38;
+
+  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/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..df304efb9199
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/multiprocess/default.nix
@@ -0,0 +1,22 @@
+{ lib, buildPythonPackage, fetchPypi, dill }:
+
+buildPythonPackage rec {
+  pname = "multiprocess";
+  version = "0.70.9";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "9fd5bd990132da77e73dec6e9613408602a4612e1d73caf2e2b813d2b61508e5";
+  };
+
+  propagatedBuildInputs = [ dill ];
+
+  # Python-version dependent tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Better multiprocessing and multithreading in python";
+    homepage = "https://github.com/uqfoundation/multiprocess";
+    license = licenses.bsd3;
+  };
+}
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..020617abebf4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/multiset/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools_scm
+, pytestrunner
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "multiset";
+  version = "2.1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "4801569c08bfcecfe7b0927b17f079c90f8607aca8fecaf42ded92b737162bc7";
+  };
+
+  buildInputs = [ setuptools_scm pytestrunner ];
+  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..8ea4d633f662
--- /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.9";
+
+  # GitHub source releases aren't tagged
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b59d99f709d2e17d60ccaa2be09771b6e9ed9391c63f083c0701e724f624d2e0";
+  };
+
+  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..2ff2ce4cefb9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/munch/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv
+, 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..cb88b666cfa0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/munkres/default.nix
@@ -0,0 +1,38 @@
+{ lib, stdenv
+, 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..68aa29a6edeb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/murmurhash/default.nix
@@ -0,0 +1,37 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, cython
+}:
+
+buildPythonPackage rec {
+  pname = "murmurhash";
+  version = "1.0.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "422084ac1fe994cb7c893689c600923dee4e2c3fc74e832f7d9a8d6fdcc362d5";
+  };
+
+  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 sdll ];
+  };
+}
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..02ec38157117
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/musicbrainzngs/default.nix
@@ -0,0 +1,32 @@
+{ lib, stdenv
+, 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..45725c0fabb7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mutag/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchgit
+, isPy3k
+, pyparsing
+}:
+
+buildPythonPackage {
+  pname = "mutag";
+  version = "0.0.2-2ffa0258ca";
+  disabled = ! isPy3k;
+
+  src = fetchgit {
+    url = "https://github.com/aroig/mutag.git";
+    sha256 = "0axdnwdypfd74a9dnw0g25m16xx1yygyl828xy0kpj8gyqdc6gb1";
+    rev = "2ffa0258cadaf79313241f43bf2c1caaf197d9c2";
+  };
+
+  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/1.43.nix b/nixpkgs/pkgs/development/python-modules/mutagen/1.43.nix
new file mode 100644
index 000000000000..a7a7c7c66049
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mutagen/1.43.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, hypothesis
+, pycodestyle
+, pyflakes
+, pytest
+, setuptools
+, pkgs
+}:
+
+buildPythonPackage rec {
+  pname = "mutagen";
+  version = "1.43.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d873baeb7815311d3420aab0a1d83f050f628228cbc2d6045a14a16460411bc9";
+  };
+
+  propagatedBuildInputs = [ setuptools ];
+  checkInputs = [
+    pkgs.faad2 pkgs.flac pkgs.vorbis-tools pkgs.liboggz
+    pkgs.glibcLocales pycodestyle pyflakes pytest hypothesis
+  ];
+  LC_ALL = "en_US.UTF-8";
+
+  meta = with lib; {
+    description = "Python multimedia tagging library";
+    homepage = "https://mutagen.readthedocs.io";
+    license = licenses.lgpl2Plus;
+    platforms = platforms.all;
+  };
+}
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..df0872242a17
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mutagen/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, fetchpatch
+, flake8
+, hypothesis
+, pycodestyle
+, pyflakes
+, pytest
+, setuptools
+, pkgs
+}:
+
+buildPythonPackage rec {
+  pname = "mutagen";
+  version = "1.45.1";
+  disabled = isPy27; # abandoned
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "6397602efb3c2d7baebd2166ed85731ae1c1d475abca22090b7141ff5034b3e1";
+  };
+
+  propagatedBuildInputs = [ setuptools ];
+  checkInputs = [
+    pkgs.faad2 pkgs.flac pkgs.vorbis-tools pkgs.liboggz
+    pkgs.glibcLocales pycodestyle pyflakes pytest hypothesis flake8
+  ];
+  LC_ALL = "en_US.UTF-8";
+
+  meta = with lib; {
+    description = "Python multimedia tagging library";
+    homepage = "https://mutagen.readthedocs.io";
+    license = licenses.lgpl2Plus;
+    platforms = platforms.all;
+  };
+}
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/muttils/default.nix b/nixpkgs/pkgs/development/python-modules/muttils/default.nix
new file mode 100644
index 000000000000..1d6b5ce8df44
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/muttils/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchurl
+, isPy3k
+}:
+
+buildPythonPackage {
+  pname = "muttils";
+  version = "1.3";
+  disabled = isPy3k;
+
+  src = fetchurl {
+    url = "https://www.blacktrash.org/hg/muttils/archive/8bb26094df06.tar.bz2";
+    sha256 = "1a4kxa0fpgg6rdj5p4kggfn8xpniqh8v5kbiaqc6wids02m7kag6";
+  };
+
+  # Tests don't work
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Utilities for use with console mail clients, like mutt";
+    homepage = "https://www.blacktrash.org/hg/muttils";
+    license = licenses.gpl2Plus;
+  };
+
+}
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..ac9373b574ac
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mwclient/default.nix
@@ -0,0 +1,30 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub
+, requests, requests_oauthlib, six
+, pytest, pytestcache, pytestcov, responses, mock
+}:
+
+buildPythonPackage rec {
+  version = "0.10.1";
+  pname = "mwclient";
+
+  src = fetchFromGitHub {
+    owner = "mwclient";
+    repo = "mwclient";
+    rev = "v${version}";
+    sha256 = "120snnsh9n5svfwkyj1w9jrxf99jnqm0jk282yypd3lpyca1l9hj";
+  };
+
+  checkInputs = [ pytest pytestcache pytestcov responses mock ];
+
+  propagatedBuildInputs = [ requests requests_oauthlib six ];
+
+  checkPhase = ''
+    py.test
+  '';
+
+  meta = with lib; {
+    description = "Python client library to the MediaWiki API";
+    license = licenses.mit;
+    homepage = "https://github.com/mwclient/mwclient";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mwlib-ext/default.nix b/nixpkgs/pkgs/development/python-modules/mwlib-ext/default.nix
new file mode 100644
index 000000000000..0a81fd58d7ee
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mwlib-ext/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  version = "0.13.2";
+  pname = "mwlib.ext";
+  disabled = isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "9229193ee719568d482192d9d913b3c4bb96af7c589d6c31ed4a62caf5054278";
+  };
+
+  meta = with lib; {
+    description = "Dependencies for mwlib markup";
+    homepage = "http://pediapress.com/code/";
+    license = licenses.bsd3;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mwlib-rl/default.nix b/nixpkgs/pkgs/development/python-modules/mwlib-rl/default.nix
new file mode 100644
index 000000000000..d27de2ed45cc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mwlib-rl/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, mwlib
+, mwlib-ext
+, pygments
+}:
+
+buildPythonPackage rec {
+  version = "0.14.5";
+  pname = "mwlib.rl";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "dddf9603ea0ca5aa87890217709eb5a5b16baeca547db3daad43c3ace73b6bc1";
+  };
+
+  buildInputs = [ mwlib mwlib-ext pygments ];
+
+  meta = with lib; {
+    description = "Generate pdfs from mediawiki markup";
+    homepage = "http://pediapress.com/code/";
+    license = licenses.bsd3;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mwlib/default.nix b/nixpkgs/pkgs/development/python-modules/mwlib/default.nix
new file mode 100644
index 000000000000..e9defe3ee148
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mwlib/default.nix
@@ -0,0 +1,55 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+, apipkg
+, bottle
+, gevent
+, lxml
+, odfpy
+, pillow
+, py
+, pyPdf
+, pyparsing
+, qserve
+, roman
+, simplejson
+, sqlite3dbm
+, timelib
+, pytest
+}:
+
+buildPythonPackage rec {
+  version = "0.16.1";
+  pname = "mwlib";
+  disabled = isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1dnmnkc21zdfaypskbpvkwl0wpkpn0nagj1fc338w64mbxrk8ny7";
+  };
+
+  propagatedBuildInputs = [ apipkg bottle gevent lxml odfpy pillow py pyPdf pyparsing qserve roman simplejson sqlite3dbm timelib ];
+
+  checkInputs = [ pytest ];
+
+  postPatch = ''
+    sed -i "s/odfpy>=0.9, <0.10/odfpy/" setup.py
+    sed -i "s/pyparsing>=1.4.11,<1.6/pyparsing/" setup.py
+  '';
+
+  checkPhase = ''
+    py.test
+  '';
+
+  # Tests are in build directory but we need extension modules that are in $out
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Library for parsing MediaWiki articles and converting them to different output formats";
+    homepage = "http://pediapress.com/code/";
+    license = licenses.bsd3;
+    # broken = true; # Requires different versions of packages
+  };
+
+}
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..0a73e99391e2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mwoauth/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, six
+, pyjwt
+, requests
+, oauthlib
+, requests_oauthlib
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "mwoauth";
+  version = "0.3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "9e0d70a1fa6f452584de1cb853ae6c11f41233549f7839cfb879f99410f6ad46";
+  };
+
+  # package has no tests
+  doCheck = false;
+
+  propagatedBuildInputs = [ six pyjwt requests oauthlib requests_oauthlib ];
+
+  meta = with lib; {
+    description = "A library designed to provide a simple means to performing an OAuth handshake with a MediaWiki installation with the OAuth Extension installed.";
+    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..0546688b867e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mwparserfromhell/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "mwparserfromhell";
+  version = "0.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "75787b6ab140ab267b313d37d045f3276f5dc6a9741074eddfbabc1635cb2efc";
+  };
+
+  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..2ad3b9fd6df1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mxnet/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, pkgs
+, requests
+, numpy
+, graphviz
+, python
+, isPy3k
+}:
+
+buildPythonPackage {
+  inherit (pkgs.mxnet) name version src meta;
+
+  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
+  '';
+
+}
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..0638ce5d1ee5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/myfitnesspal/default.nix
@@ -0,0 +1,36 @@
+{ lib, fetchPypi, buildPythonPackage
+, blessed, keyring, keyrings-alt, lxml, measurement, python-dateutil, requests, six, rich
+, pytestCheckHook, mock, nose }:
+
+# TODO: Define this package in "all-packages.nix" using "toPythonApplication".
+# This currently errors out, complaining about not being able to find "etree" from "lxml" even though "lxml" is defined in "propagatedBuildInputs".
+
+buildPythonPackage rec {
+  pname = "myfitnesspal";
+  version = "1.16.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "c2275e91c794a3569a76c47c78cf2ff04d7f569a98558227e899ead7b30af0d6";
+  };
+
+  # Remove overly restrictive version constraints
+  postPatch = ''
+    sed -i 's/keyring>=.*/keyring/' requirements.txt
+    sed -i 's/keyrings.alt>=.*/keyrings.alt/' requirements.txt
+    sed -i 's/rich>=.*/rich/' requirements.txt
+  '';
+
+  propagatedBuildInputs = [ blessed keyring keyrings-alt lxml measurement python-dateutil requests six rich ];
+
+  # Integration tests require an account to be set
+  disabledTests = [ "test_integration" ];
+  checkInputs = [ pytestCheckHook mock nose ];
+
+  meta = with lib; {
+    description = "Access your meal tracking data stored in MyFitnessPal programatically";
+    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/mypy-protobuf/default.nix b/nixpkgs/pkgs/development/python-modules/mypy-protobuf/default.nix
new file mode 100644
index 000000000000..f444ba039c20
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mypy-protobuf/default.nix
@@ -0,0 +1,20 @@
+{ lib, stdenv, fetchPypi, buildPythonApplication, protobuf }:
+
+buildPythonApplication rec {
+  pname = "mypy-protobuf";
+  version = "1.23";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "cf79c77e828a2de9bdc74b43ad4abd4c2a3a30f0471b46e9b4e01b9877f166fb";
+  };
+
+  propagatedBuildInputs = [ protobuf ];
+
+  meta = with lib; {
+    description = "Generate mypy stub files from protobuf specs";
+    homepage = "https://github.com/dropbox/mypy-protobuf";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ lnl7 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mypy/default.nix b/nixpkgs/pkgs/development/python-modules/mypy/default.nix
new file mode 100644
index 000000000000..4bea992f6ba8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mypy/default.nix
@@ -0,0 +1,65 @@
+{ lib, stdenv, fetchFromGitHub, buildPythonPackage, typed-ast, psutil, isPy3k
+, mypy-extensions
+, typing-extensions
+, fetchpatch
+}:
+buildPythonPackage rec {
+  pname = "mypy";
+  version = "0.790";
+  disabled = !isPy3k;
+
+  # Fetch 0.790 from GitHub temporarily because mypyc.analysis is missing from
+  # the Pip package (see also https://github.com/python/mypy/issues/9584). It
+  # should be possible to move back to Pypi for the next release.
+  src = fetchFromGitHub {
+    owner = "python";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0zq3lpdf9hphcklk40wz444h8w3dkhwa12mqba5j9lmg11klnhz7";
+    fetchSubmodules = true;
+  };
+
+  propagatedBuildInputs = [ typed-ast psutil mypy-extensions typing-extensions ];
+
+  # Tests not included in pip package.
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "mypy"
+    "mypy.types"
+    "mypy.api"
+    "mypy.fastparse"
+    "mypy.report"
+    "mypyc"
+    "mypyc.analysis"
+  ];
+
+  # These three patches are required to make compilation with mypyc work for
+  # 0.790, see also https://github.com/python/mypy/issues/9584.
+  patches = [
+    (fetchpatch {
+      url = "https://github.com/python/mypy/commit/f6522ae646a8d87ce10549f29fcf961dc014f154.patch";
+      sha256 = "0d3jp4d0b7vdc0prk07grhajsy7x3wcynn2xysnszawiww93bfrh";
+    })
+    (fetchpatch {
+      url = "https://github.com/python/mypy/commit/acd603496237a78b109ca9d89991539633cbbb99.patch";
+      sha256 = "0ry1rxpz2ws7zzrmq09pra9dlzxb84zhs8kxwf5xii1k1bgmrljr";
+    })
+    (fetchpatch {
+      url = "https://github.com/python/mypy/commit/81818b23b5d53f31caf3515d6f0b54e3c018d790.patch";
+      sha256 = "002y24kfscywkw4mz9lndsps543j4xhr2kcnfbrqr4i0yxlvdbca";
+    })
+  ];
+
+  # 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;
+
+  meta = with lib; {
+    description = "Optional static typing for Python";
+    homepage    = "http://www.mypy-lang.org";
+    license     = licenses.mit;
+    maintainers = with maintainers; [ martingms lnl7 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mypy/extensions.nix b/nixpkgs/pkgs/development/python-modules/mypy/extensions.nix
new file mode 100644
index 000000000000..21a3ee21dbd9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mypy/extensions.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv, fetchPypi, buildPythonPackage, typing, pythonOlder }:
+
+buildPythonPackage rec {
+  pname = "mypy-extensions";
+  version = "0.4.3";
+
+  # Tests not included in pip package.
+  doCheck = false;
+
+  src = fetchPypi {
+    inherit version;
+    pname = "mypy_extensions";
+    sha256 = "2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8";
+  };
+
+  propagatedBuildInputs = if pythonOlder "3.5" then [ typing ] else [ ];
+
+  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 ];
+  };
+}
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..692c021a64ff
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mysql-connector/default.nix
@@ -0,0 +1,34 @@
+{ lib, buildPythonPackage, fetchFromGitHub, python }:
+
+let
+  py = python;
+in buildPythonPackage rec {
+  pname = "mysql-connector";
+  version = "8.0.23";
+
+  src = fetchFromGitHub {
+    owner = "mysql";
+    repo = "mysql-connector-python";
+    rev = version;
+    sha256 = "sha256-YVtcHbDsW1mTjbCY1YhqgtqWv4keKlLExn2AhlOzNEw=";
+  };
+
+  propagatedBuildInputs = with py.pkgs; [ protobuf dnspython ];
+
+  # Tests are failing (TODO: unknown reason)
+  # TypeError: __init__() missing 1 required positional argument: 'string'
+  # But the library should be working as expected.
+  doCheck = false;
+
+  meta = {
+    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 = [ lib.licenses.gpl2 ];
+    maintainers = with lib.maintainers; [ primeos ];
+  };
+}
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..9d91543b7ff3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mysqlclient/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, libmysqlclient }:
+
+buildPythonPackage rec {
+  pname = "mysqlclient";
+  version = "2.0.3";
+
+  nativeBuildInputs = [
+    libmysqlclient
+  ];
+
+  buildInputs = [
+    libmysqlclient
+  ];
+
+  # Tests need a MySQL database
+  doCheck = false;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f6ebea7c008f155baeefe16c56cd3ee6239f7a5a9ae42396c2f1860f08a7c432";
+  };
+
+  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/nagiosplugin/default.nix b/nixpkgs/pkgs/development/python-modules/nagiosplugin/default.nix
new file mode 100644
index 000000000000..6b6e889b5d5d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nagiosplugin/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, twine
+, numpy
+, pytest
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "nagiosplugin";
+  version = "1.3.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1vr3zy0zfvbrqc4nf81zxv4gs2q82sv5sjamdm4573ld529mk2nv";
+  };
+
+  nativeBuildInputs = [ twine ];
+  checkInputs = [ pytest numpy ];
+
+  checkPhase = ''
+    # this test relies on who, which does not work in the sandbox
+    pytest -k "not test_check_users" tests/
+  '';
+
+  meta = with lib; {
+    description = "A 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/namebench/default.nix b/nixpkgs/pkgs/development/python-modules/namebench/default.nix
new file mode 100644
index 000000000000..eefdcce79901
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/namebench/default.nix
@@ -0,0 +1,49 @@
+{ lib, stdenv
+, buildPythonPackage
+, isPy3k
+, isPyPy
+, fetchurl
+, tkinter
+}:
+
+buildPythonPackage rec {
+  pname = "namebench";
+  version = "1.3.1";
+  disabled = isPy3k || isPyPy;
+
+  src = fetchurl {
+    url = "https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/{pname}/${pname}-${version}-source.tgz";
+    sha256 = "09clbcd6wxgk4r6qw7hb78h818mvca7lijigy1mlq5y1f3lgkk1h";
+  };
+
+  # error: invalid command 'test'
+  doCheck = false;
+
+  propagatedBuildInputs = [ tkinter ];
+
+  # namebench expects to be run from its own source tree (it uses relative
+  # paths to various resources), make it work.
+  postInstall = ''
+    sed -i "s|import os|import os; os.chdir(\"$out/namebench\")|" "$out/bin/namebench.py"
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/google/namebench"; # Formerly https://code.google.com/archive/p/namebench/
+    description = "Find fastest DNS servers available";
+    license = with licenses; [
+      asl20
+      # third-party program licenses (embedded in the sources)
+      lgpl21 # Crystal_Clear
+      isc # dns
+      bsd3 # jinja2
+    ];
+    longDescription = ''
+      It hunts down the fastest DNS servers available for your computer to
+      use. namebench runs a fair and thorough benchmark using your web
+      browser history, tcpdump output, or standardized datasets in order
+      to provide an individualized recommendation. namebench is completely
+      free and does not modify your system in any way.
+    '';
+  };
+
+}
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..874b1e177d27
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/namedlist/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "namedlist";
+  version = "1.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "34f89fc992592c80b39a709e136edcf41ea17f24ba31eaf84a314a02c8b9bcef";
+  };
+
+  # 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()" ""
+  '';
+
+  checkInputs = [ pytest ];
+  checkPhase = ''
+    py.test
+  '';
+
+  meta = {
+    description = "Similar to namedtuple, but instances are mutable";
+    homepage = "https://gitlab.com/ericvsmith/namedlist";
+    license = lib.licenses.asl20;
+    maintainers = with lib.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..0c8e442affcf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nameparser/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, glibcLocales
+}:
+
+buildPythonPackage rec {
+  pname = "nameparser";
+  version = "1.0.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0av5kraczczp0hvwpkdaw7kl2hk9k4dyll08rg180n52a2dm0pra";
+  };
+
+  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/nanoleaf/default.nix b/nixpkgs/pkgs/development/python-modules/nanoleaf/default.nix
new file mode 100644
index 000000000000..f6131cd53095
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nanoleaf/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv, 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; [ elseym ];
+  };
+}
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..4cf33fb2074c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nanomsg-python/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv, 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/nassl/default.nix b/nixpkgs/pkgs/development/python-modules/nassl/default.nix
new file mode 100644
index 000000000000..908ecff8c177
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nassl/default.nix
@@ -0,0 +1,125 @@
+{ lib
+, fetchFromGitHub
+, fetchurl
+, buildPythonPackage
+, pkgsStatic
+, openssl
+, invoke
+, tls-parser
+, cacert
+, pytestCheckHook
+}:
+
+let
+  zlibStatic = pkgsStatic.zlib.override {
+    splitStaticOutput = false;
+  };
+  nasslOpensslArgs = {
+    static = true;
+    enableSSL2 = true;
+  };
+  nasslOpensslFlagsCommon = [
+    "zlib"
+    "no-zlib-dynamic"
+    "no-shared"
+    "--with-zlib-lib=${zlibStatic.out}/lib"
+    "--with-zlib-include=${zlibStatic.out.dev}/include"
+    "enable-rc5"
+    "enable-md2"
+    "enable-gost"
+    "enable-cast"
+    "enable-idea"
+    "enable-ripemd"
+    "enable-mdc2"
+    "-fPIC"
+  ];
+  opensslStatic = (openssl.override nasslOpensslArgs).overrideAttrs (
+    oldAttrs: rec {
+      name = "openssl-${version}";
+      version = "1.1.1h";
+      src = fetchurl {
+        url = "https://www.openssl.org/source/${name}.tar.gz";
+        sha256 = "1ncmcnh5bmxkwrvm0m1q4kdcjjfpwvlyjspjhibkxc6p9dvsi72w";
+      };
+      configureFlags = oldAttrs.configureFlags ++ nasslOpensslFlagsCommon ++ [
+        "enable-weak-ssl-ciphers"
+        "enable-tls1_3"
+        "no-async"
+      ];
+      buildInputs = oldAttrs.buildInputs ++ [ zlibStatic cacert ];
+    }
+  );
+  opensslLegacyStatic = (openssl.override nasslOpensslArgs).overrideAttrs (
+    oldAttrs: rec {
+      name = "openssl-${version}";
+      version = "1.0.2e";
+      src = fetchurl {
+        url = "https://www.openssl.org/source/${name}.tar.gz";
+        sha256 = "1zqb1rff1wikc62a7vj5qxd1k191m8qif5d05mwdxz2wnzywlg72";
+      };
+      configureFlags = oldAttrs.configureFlags ++ nasslOpensslFlagsCommon;
+      patches = [ ];
+      buildInputs = oldAttrs.buildInputs ++ [ zlibStatic ];
+      # openssl_1_0_2 needs `withDocs = false`
+      outputs = lib.remove "doc" oldAttrs.outputs;
+    }
+  );
+in
+buildPythonPackage rec {
+  pname = "nassl";
+  version = "3.1.0";
+
+  src = fetchFromGitHub {
+    owner = "nabla-c0d3";
+    repo = pname;
+    rev = version;
+    sha256 = "1x1v0fpb6gcc2r0k2rsy0mc3v25s3qbva78apvi46n08c2l309ci";
+  };
+
+  postPatch = let
+    legacyOpenSSLVersion = lib.replaceStrings ["."] ["_"] opensslLegacyStatic.version;
+    modernOpenSSLVersion = lib.replaceStrings ["."] ["_"] opensslStatic.version;
+    zlibVersion = zlibStatic.version;
+  in ''
+    mkdir -p deps/openssl-OpenSSL_${legacyOpenSSLVersion}/
+    cp ${opensslLegacyStatic.out}/lib/libssl.a \
+      ${opensslLegacyStatic.out}/lib/libcrypto.a \
+      deps/openssl-OpenSSL_${legacyOpenSSLVersion}/
+    ln -s ${opensslLegacyStatic.out.dev}/include deps/openssl-OpenSSL_${legacyOpenSSLVersion}/include
+    ln -s ${opensslLegacyStatic.bin}/bin deps/openssl-OpenSSL_${legacyOpenSSLVersion}/apps
+
+    mkdir -p deps/openssl-OpenSSL_${modernOpenSSLVersion}/
+    cp ${opensslStatic.out}/lib/libssl.a \
+      ${opensslStatic.out}/lib/libcrypto.a \
+      deps/openssl-OpenSSL_${modernOpenSSLVersion}/
+    ln -s ${opensslStatic.out.dev}/include deps/openssl-OpenSSL_${modernOpenSSLVersion}/include
+    ln -s ${opensslStatic.bin}/bin deps/openssl-OpenSSL_${modernOpenSSLVersion}/apps
+
+    mkdir -p deps/zlib-${zlibVersion}/
+    cp ${zlibStatic.out}/lib/libz.a deps/zlib-${zlibVersion}/
+  '';
+
+  propagatedBuildInputs = [ tls-parser ];
+
+  nativeBuildInputs = [ invoke ];
+
+  buildPhase = ''
+    invoke build.nassl
+    invoke package.wheel
+  '';
+
+  checkInputs = [ pytestCheckHook ];
+
+  checkPhase = ''
+    # Skip online tests
+    pytest -k 'not Online'
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/nabla-c0d3/nassl";
+    description = "Low-level OpenSSL wrapper for Python 3.7+";
+    platforms = with platforms; linux ++ darwin;
+    license = licenses.agpl3;
+    maintainers = with maintainers; [ veehaitch ];
+  };
+}
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..e4c42496597e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/natsort/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, pytest
+, pytestcov
+, pytest-mock
+, hypothesis
+, glibcLocales
+, pathlib ? null
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "natsort";
+  version = "7.1.0";
+
+  checkInputs = [
+    pytest
+    pytestcov
+    pytest-mock
+    hypothesis
+    glibcLocales
+  ]
+  # pathlib was made part of standard library in 3.5:
+  ++ (lib.optionals (pythonOlder "3.4") [ pathlib ]);
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "33f3f1003e2af4b4df20908fe62aa029999d136b966463746942efbfc821add3";
+  };
+
+  # Does not support Python 2
+  disabled = !isPy3k;
+
+  # testing based on project's tox.ini
+  # natsort_keygen has pytest mock issues
+  checkPhase = ''
+    pytest --doctest-modules natsort
+    pytest --ignore=tests/test_natsort_keygen.py
+  '';
+
+  meta = {
+    description = "Natural sorting for python";
+    homepage = "https://github.com/SethMMorton/natsort";
+    license = lib.licenses.mit;
+  };
+}
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/nbclient/default.nix b/nixpkgs/pkgs/development/python-modules/nbclient/default.nix
new file mode 100644
index 000000000000..d846511eb3f4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nbclient/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, pythonOlder,
+  async_generator, traitlets, nbformat, nest-asyncio, jupyter_client,
+  pytest, xmltodict, nbconvert, ipywidgets
+, doCheck ? true
+}:
+
+buildPythonPackage rec {
+  pname = "nbclient";
+  version = "0.5.1";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "01e2d726d16eaf2cde6db74a87e2451453547e8832d142f73f72fddcd4fe0250";
+  };
+
+  inherit doCheck;
+  checkInputs = [ pytest xmltodict nbconvert ipywidgets ];
+  propagatedBuildInputs = [ async_generator traitlets nbformat nest-asyncio jupyter_client ];
+
+  meta = with lib; {
+    homepage = "https://github.com/jupyter/nbclient";
+    description = "A client library for executing notebooks";
+    license = licenses.bsd3;
+  };
+}
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..4e443a377eda
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nbconflux/default.nix
@@ -0,0 +1,29 @@
+{ lib, buildPythonPackage, fetchFromGitHub, isPy27, nbconvert, pytest, 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 = [ pytest responses ];
+
+  checkPhase = ''
+    pytest tests
+  '';
+
+  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..582a6132c259
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nbconvert/default.nix
@@ -0,0 +1,75 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, glibcLocales
+, entrypoints
+, bleach
+, mistune
+, nbclient
+, jinja2
+, pygments
+, traitlets
+, testpath
+, jupyter_core
+, jupyterlab-pygments
+, nbformat
+, ipykernel
+, pandocfilters
+, tornado
+, jupyter_client
+, defusedxml
+}:
+
+buildPythonPackage rec {
+  pname = "nbconvert";
+  version = "6.0.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "cbbc13a86dfbd4d1b5dee106539de0795b4db156c894c2c5dc382062bbc29002";
+  };
+
+  checkInputs = [ pytestCheckHook glibcLocales ];
+
+  propagatedBuildInputs = [
+    entrypoints bleach mistune jinja2 pygments traitlets testpath
+    jupyter_core nbformat ipykernel pandocfilters tornado jupyter_client
+    defusedxml
+    (nbclient.override { doCheck = false; }) # avoid infinite recursion
+    jupyterlab-pygments
+  ];
+
+  # disable preprocessor tests for ipython 7
+  # see issue https://github.com/jupyter/nbconvert/issues/898
+  preCheck = ''
+    export LC_ALL=en_US.UTF-8
+    HOME=$(mktemp -d)
+  '';
+
+  pytestFlagsArray = [
+    "--ignore=nbconvert/preprocessors/tests/test_execute.py"
+    # can't resolve template paths within sandbox
+    "--ignore=nbconvert/tests/base.py"
+    "--ignore=nbconvert/tests/test_nbconvertapp.py"
+  ];
+
+
+  disabledTests = [
+    "test_export"
+    "test_webpdf_without_chromium"
+    #"test_cell_tag_output"
+    #"test_convert_from_stdin"
+    #"test_convert_full_qualified_name"
+  ];
+
+  # 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/nbdime/default.nix b/nixpkgs/pkgs/development/python-modules/nbdime/default.nix
new file mode 100644
index 000000000000..1de21f3511a4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nbdime/default.nix
@@ -0,0 +1,69 @@
+{ lib, buildPythonPackage, fetchPypi, callPackage, isPy3k
+, hypothesis
+, setuptools_scm
+, six
+, attrs
+, py
+, setuptools
+, pytestcov
+, pytest-timeout
+, pytest-tornado
+, mock
+, tabulate
+, nbformat
+, jsonschema
+, pytest
+, colorama
+, pygments
+, tornado
+, requests
+, GitPython
+, notebook
+, jinja2
+}:
+
+buildPythonPackage rec {
+  pname = "nbdime";
+  version = "2.1.0";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "4e3efdcfda31c3074cb565cd8e76e2e5421b1c4560c3a00c56f8679dd15590e5";
+  };
+
+  checkInputs = [
+    hypothesis
+    pytestcov
+    pytest-timeout
+    pytest-tornado
+    jsonschema
+    mock
+    tabulate
+    pytest
+  ];
+
+  nativeBuildInputs = [ setuptools_scm ];
+
+  propagatedBuildInputs = [
+    attrs
+    py
+    setuptools
+    six
+    nbformat
+    colorama
+    pygments
+    tornado
+    requests
+    GitPython
+    notebook
+    jinja2
+    ];
+
+  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/2.nix b/nixpkgs/pkgs/development/python-modules/nbformat/2.nix
new file mode 100644
index 000000000000..06d02520b20d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nbformat/2.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest
+, glibcLocales
+, ipython_genutils
+, traitlets
+, testpath
+, jsonschema
+, jupyter_core
+}:
+
+buildPythonPackage rec {
+  pname = "nbformat";
+  version = "4.4.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f7494ef0df60766b7cabe0a3651556345a963b74dbc16bc7c18479041170d402";
+  };
+
+  LC_ALL="en_US.utf8";
+
+  checkInputs = [ pytest glibcLocales ];
+  propagatedBuildInputs = [ ipython_genutils traitlets testpath jsonschema jupyter_core ];
+
+  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; [ globin ];
+  };
+}
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..3bd119179a45
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nbformat/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest
+, glibcLocales
+, ipython_genutils
+, traitlets
+, testpath
+, jsonschema
+, jupyter_core
+}:
+
+buildPythonPackage rec {
+  pname = "nbformat";
+  version = "5.0.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f545b22138865bfbcc6b1ffe89ed5a2b8e2dc5d4fe876f2ca60d8e6f702a30f8";
+  };
+
+  LC_ALL="en_US.utf8";
+
+  checkInputs = [ pytest glibcLocales ];
+  propagatedBuildInputs = [ ipython_genutils traitlets testpath jsonschema jupyter_core ];
+
+  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..b7ddf35caec6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nbsmoke/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest
+, jupyter_client
+, ipykernel
+, holoviews
+, nbformat
+, nbconvert
+, pyflakes
+, requests
+, beautifulsoup4
+}:
+
+buildPythonPackage rec {
+  pname = "nbsmoke";
+  version = "0.5.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "2400d7878e97714e822ab200a71fc71ede487e671f42b4b411745dba95f9cb32";
+  };
+
+  propagatedBuildInputs = [
+    pytest
+    holoviews
+    jupyter_client
+    ipykernel
+    nbformat
+    nbconvert
+    pyflakes
+    requests
+    beautifulsoup4
+  ];
+
+  # tests not included with pypi release
+  doCheck = false;
+
+  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..fb5eb6cbf7c9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nbsphinx/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, docutils
+, jinja2
+, nbconvert
+, nbformat
+, sphinx
+, traitlets
+, python
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "nbsphinx";
+  version = "0.8.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "369c16fe93af14c878d61fb3e81d838196fb35b27deade2cd7b95efe1fe56ea0";
+  };
+
+  propagatedBuildInputs = [
+    docutils
+    jinja2
+    nbconvert
+    nbformat
+    sphinx
+    traitlets
+  ];
+
+  checkPhase = ''
+    ${python.interpreter} -m 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..704bc21d7e1a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nbval/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, coverage
+, ipykernel
+, jupyter_client
+, nbformat
+, pytest
+, six
+, glibcLocales
+, matplotlib
+, sympy
+, pytestcov
+}:
+
+buildPythonPackage rec {
+  pname = "nbval";
+  version = "0.9.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "cfefcd2ef66ee2d337d0b252c6bcec4023384eb32e8b9e5fcc3ac80ab8cd7d40";
+  };
+
+  checkInputs = [
+    pytest
+    matplotlib
+    sympy
+    pytestcov
+  ];
+
+  buildInputs = [ glibcLocales ];
+
+  propagatedBuildInputs = [
+    coverage
+    ipykernel
+    jupyter_client
+    nbformat
+    pytest
+    six
+  ];
+
+  # Set HOME so that matplotlib doesn't try to use
+  # /homeless-shelter/.config/matplotlib, otherwise some of the tests fail for
+  # having an unexpected warning on stderr produced by matplotlib.
+  # Ignore impure tests.
+  checkPhase = ''
+    export HOME=$(mktemp -d)
+    pytest tests --ignore tests/test_timeouts.py
+  '';
+
+  # Some of the tests use localhost networking.
+  __darwinAllowLocalNetworking = true;
+
+  meta = with lib; {
+    description = "A py.test plugin to validate Jupyter notebooks";
+    homepage = "https://github.com/computationalmodelling/nbval";
+    license = licenses.bsd3;
+    maintainers = [ 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..28946bd1a6e7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nbxmpp/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv, buildPythonPackage, fetchzip, gobject-introspection, idna, libsoup, precis-i18n, pygobject3, pyopenssl }:
+
+let
+  pname = "nbxmpp";
+  version = "1.0.2";
+  name = "${pname}-${version}";
+in buildPythonPackage {
+  inherit pname version;
+  # Tests aren't included in PyPI tarball.
+  src = fetchzip {
+    name = "${name}.tar.bz2";
+    url = "https://dev.gajim.org/gajim/python-nbxmpp/repository/archive.tar.bz2?"
+        + "ref=${name}";
+    sha256 = "1rhzsakqrybzq5j5b9400wjd14pncph47c1ggn5a6f3di03lk4az";
+  };
+
+  buildInputs = [ precis-i18n ];
+  checkInputs = [ gobject-introspection libsoup pygobject3 ];
+  propagatedBuildInputs = [ idna pyopenssl ];
+
+  meta = with lib; {
+    homepage = "https://dev.gajim.org/gajim/python-nbxmpp";
+    description = "Non-blocking Jabber/XMPP module";
+    license = licenses.gpl3;
+    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..f933587dcad1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ncclient/default.nix
@@ -0,0 +1,39 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, paramiko
+, selectors2
+, lxml
+, nose
+, rednose
+}:
+
+buildPythonPackage rec {
+  pname = "ncclient";
+  version = "0.6.9";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0112f2ad41fb658f52446d870853a63691d69299c73c7351c520d38dbd8dc0c4";
+  };
+
+  checkInputs = [ nose rednose ];
+
+  propagatedBuildInputs = [
+    paramiko lxml selectors2
+  ];
+
+  checkPhase = ''
+    nosetests test --rednose --verbosity=3 --with-coverage --cover-package ncclient
+  '';
+
+  #Unfortunately the test hangs at te end
+  doCheck = false;
+
+  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/ndg-httpsclient/default.nix b/nixpkgs/pkgs/development/python-modules/ndg-httpsclient/default.nix
new file mode 100644
index 000000000000..7768614a5d12
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ndg-httpsclient/default.nix
@@ -0,0 +1,30 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, pyopenssl
+}:
+
+buildPythonPackage rec {
+  version = "0.5.1";
+  pname = "ndg-httpsclient";
+
+  propagatedBuildInputs = [ pyopenssl ];
+
+  src = fetchFromGitHub {
+    owner = "cedadev";
+    repo = "ndg_httpsclient";
+    rev = version;
+    sha256 = "0lhsgs4am4xyjssng5p0vkfwqncczj1dpa0vss4lrhzq86mnn5rz";
+  };
+
+  # 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..175b04d31074
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ndjson/default.nix
@@ -0,0 +1,21 @@
+{ lib, buildPythonPackage, fetchPypi, wheel, watchdog, flake8
+, pytest, pytestrunner, coverage, sphinx, twine }:
+
+buildPythonPackage rec {
+  pname = "ndjson";
+  version = "0.3.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "v5dGy2uxy1PRcs2n8VTAfHhtZl/yg0Hk5om3lrIp5dY=";
+  };
+
+  checkInputs = [ pytest pytestrunner flake8 twine sphinx coverage watchdog ];
+
+  meta = with lib; {
+    homepage = "https://github.com/rhgrant10/ndjson";
+    description = "JsonDecoder";
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ freezeboy ];
+  };
+}
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/neo/default.nix b/nixpkgs/pkgs/development/python-modules/neo/default.nix
new file mode 100644
index 000000000000..e5db8450e788
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/neo/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, nose
+, numpy
+, quantities
+}:
+
+buildPythonPackage rec {
+  pname = "neo";
+  version = "0.9.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "6e31c88d7c52174fa2512df589b2b5003e9471fde27fca9f315f4770ba3bd3cb";
+  };
+
+  propagatedBuildInputs = [ numpy quantities ];
+
+  checkInputs = [ nose ];
+
+  checkPhase = ''
+    nosetests --exclude=iotest
+  '';
+
+  meta = with lib; {
+    homepage = "https://neuralensemble.org/neo/";
+    description = "Package for representing electrophysiology data in Python";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ bcdarwin ];
+  };
+}
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..56c6044ba746
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nest-asyncio/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonAtLeast
+}:
+
+buildPythonPackage rec {
+  version = "1.4.3";
+  pname = "nest_asyncio";
+  disabled = !(pythonAtLeast "3.5");
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "eaa09ef1353ebefae19162ad423eef7a12166bcc63866f8bff8f3635353cd9fa";
+  };
+
+  # 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/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..7f4aab9c3714
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/netaddr/default.nix
@@ -0,0 +1,32 @@
+{ lib, stdenv
+, 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..456124b19bd3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/netcdf4/default.nix
@@ -0,0 +1,50 @@
+{ stdenv, lib, buildPythonPackage, fetchPypi, isPyPy, pytest
+, numpy, zlib, netcdf, hdf5, curl, libjpeg, cython, cftime
+}:
+buildPythonPackage rec {
+  pname = "netCDF4";
+  version = "1.5.5.1";
+
+  disabled = isPyPy;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d957e55a667d1fc651ddef22fea10ded0f142b7d9dbbf4d08c0012d32f445abd";
+  };
+
+  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..f4e625b12b4e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/netdata/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, aiohttp
+, async-timeout
+}:
+
+buildPythonPackage rec {
+  pname = "netdata";
+  version = "0.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "14kyjp1q3clizs1bqx4rp31d2awjmi5v65z8sarr2ycgwqqmkrzw";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    async-timeout
+  ];
+
+  # no tests are present
+  doCheck = false;
+
+  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..e546ac6cd579
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/netdisco/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv, buildPythonPackage, isPy3k, fetchPypi, requests, zeroconf, netifaces, pytest }:
+
+buildPythonPackage rec {
+  pname = "netdisco";
+  version = "2.8.2";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "dcaabf83b204282aacfb213b18799eb7af2d5a6defe529487bbd0548036392fe";
+  };
+
+  propagatedBuildInputs = [ requests zeroconf netifaces ];
+
+  checkInputs = [ pytest ];
+
+  checkPhase = ''
+    py.test
+  '';
+
+  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..07dc63c2181f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/netifaces/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  version = "0.10.9";
+  pname = "netifaces";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "2dee9ffdd16292878336a58d04a20f0ffe95555465fee7c9bd23b3490ef2abf3";
+  };
+
+  meta = with lib; {
+    homepage = "https://alastairs-place.net/projects/netifaces/";
+    description = "Portable access to network interfaces from Python";
+    license = licenses.mit;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/networkx/2.2.nix b/nixpkgs/pkgs/development/python-modules/networkx/2.2.nix
new file mode 100644
index 000000000000..a4c66048953b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/networkx/2.2.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, nose
+, decorator
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "networkx";
+  # upgrade may break sage, please test the sage build or ping @timokau on upgrade
+  version = "2.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "12swxb15299v9vqjsq4z8rgh5sdhvpx497xwnhpnb0gynrx6zra5";
+  };
+
+  checkInputs = [ nose ];
+  propagatedBuildInputs = [ decorator setuptools ];
+
+  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/networkx/default.nix b/nixpkgs/pkgs/development/python-modules/networkx/default.nix
new file mode 100644
index 000000000000..27f6082ac568
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/networkx/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, nose
+, pytest
+, decorator
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "networkx";
+  # upgrade may break sage, please test the sage build or ping @timokau on upgrade
+  version = "2.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "7978955423fbc9639c10498878be59caf99b44dc304c2286162fd24b458c1602";
+  };
+
+  propagatedBuildInputs = [ decorator setuptools ];
+  checkInputs = [ nose pytest];
+  checkPhase = ''
+    pytest
+  '';
+
+  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..b81398f918cd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/neuronpy/default.nix
@@ -0,0 +1,31 @@
+{ lib, stdenv
+, 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..356754fdeac8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nevow/default.nix
@@ -0,0 +1,43 @@
+{ lib, stdenv, buildPythonPackage, fetchpatch, 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/nibabel/default.nix b/nixpkgs/pkgs/development/python-modules/nibabel/default.nix
new file mode 100644
index 000000000000..91195abce1cd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nibabel/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, packaging
+, pytest
+, nose
+, numpy
+, h5py
+, pydicom
+, scipy
+}:
+
+buildPythonPackage rec {
+  pname = "nibabel";
+  version = "3.2.1";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "4d2ff9426b740011a1c916b54fc25da9348282e727eaa2ea163f42e00f1fc29e";
+  };
+
+  propagatedBuildInputs = [ numpy scipy h5py packaging pydicom ];
+
+  checkInputs = [ nose pytest ];
+
+  checkPhase = ''
+    pytest
+  '';
+
+  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..9d916cc9324d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nidaqmx/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, six
+, numpy
+, pytestCheckHook
+, pykka
+, enum34
+, pythonOlder
+}:
+
+# 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;
+
+  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/nilearn/default.nix b/nixpkgs/pkgs/development/python-modules/nilearn/default.nix
new file mode 100644
index 000000000000..e1efdf26de80
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nilearn/default.nix
@@ -0,0 +1,32 @@
+{ lib, buildPythonPackage, fetchPypi, pytestCheckHook, matplotlib
+, nibabel, numpy, pandas, scikitlearn, scipy, joblib, requests }:
+
+buildPythonPackage rec {
+  pname = "nilearn";
+  version = "0.7.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1rhpy6na7hkhc211ri14zghvmb2fxkh995wi09pkc68klf1dzjg7";
+  };
+
+  checkInputs = [ pytestCheckHook ];
+  disabledTests = [ "test_clean_confounds" ];  # https://github.com/nilearn/nilearn/issues/2608
+
+  propagatedBuildInputs = [
+    joblib
+    matplotlib
+    nibabel
+    numpy
+    pandas
+    requests
+    scikitlearn
+    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/nimfa/default.nix b/nixpkgs/pkgs/development/python-modules/nimfa/default.nix
new file mode 100644
index 000000000000..dc889440aa41
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nimfa/default.nix
@@ -0,0 +1,30 @@
+{ lib, stdenv
+, 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..1747332ed5a2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nine/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv
+, 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..cb7871aed610
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nipy/default.nix
@@ -0,0 +1,49 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, nose
+, matplotlib
+, nibabel
+, numpy
+, scipy
+, sympy
+, python
+}:
+
+buildPythonPackage rec {
+  version = "0.4.2";
+  pname = "nipy";
+  disabled = pythonOlder "2.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1pn731nsczrx198i2gadffqmfbhviglrclv6xxwhnbv6w5hfs2yk";
+  };
+
+  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..5f847007bdc5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nipype/default.nix
@@ -0,0 +1,115 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPy27
+# python dependencies
+, click
+, dateutil
+, etelemetry
+, filelock
+, funcsigs
+, future
+, mock
+, networkx
+, nibabel
+, numpy
+, packaging
+, prov
+, psutil
+, pybids
+, pydot
+, pytest
+, pytest_xdist
+, pytest-forked
+, rdflib
+, scipy
+, simplejson
+, traits
+, xvfbwrapper
+, pytestcov
+, 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.6.0";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "bc56ce63f74c9a9a23c6edeaf77631377e8ad2bea928c898cc89527a47f101cf";
+  };
+
+  postPatch = ''
+    substituteInPlace nipype/interfaces/base/tests/test_core.py \
+      --replace "/usr/bin/env bash" "${bash}/bin/bash"
+  '';
+
+  nativeBuildInputs = [
+    sphinx
+  ];
+
+  propagatedBuildInputs = [
+    click
+    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
+    pytestcov
+    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..0a266ff7bf82
--- /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..ccbf540f75f4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nitime/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, python
+, 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 ];
+
+  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/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..d4817480e57c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nix-prefetch-github/default.nix
@@ -0,0 +1,43 @@
+{ fetchFromGitHub
+, lib
+, buildPythonPackage
+, attrs
+, click
+, effect
+, git
+, pytestCheckHook
+, pytestcov
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "nix-prefetch-github";
+  version = "4.0.3";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "seppeljordan";
+    repo = "nix-prefetch-github";
+    rev = "v${version}";
+    sha256 = "CLcmwobPrL6NiI/nw+/Dwho/r15owV16Jmt5OcfFqvo=";
+  };
+
+  propagatedBuildInputs = [
+    attrs
+    click
+    effect
+  ];
+
+  checkInputs = [ pytestCheckHook pytestcov git ];
+
+  # ignore tests which are impure
+  disabledTests = [ "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..4edd31d6a25f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nixpkgs/default.nix
@@ -0,0 +1,33 @@
+{ lib, stdenv
+, 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/nltk/default.nix b/nixpkgs/pkgs/development/python-modules/nltk/default.nix
new file mode 100644
index 000000000000..298b32ed8b8e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nltk/default.nix
@@ -0,0 +1,39 @@
+{ fetchPypi, buildPythonPackage, lib, six, singledispatch, isPy3k
+, click
+, joblib
+, regex
+, tqdm
+}:
+
+buildPythonPackage rec {
+  version = "3.5";
+  pname = "nltk";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "845365449cd8c5f9731f7cb9f8bd6fd0767553b9d53af9eb1b3abf7700936b35";
+  };
+
+  propagatedBuildInputs = [
+    click
+    joblib
+    regex
+    tqdm
+  ] ++ lib.optional (!isPy3k) singledispatch;
+
+  # 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;
+
+  meta = {
+    description = "Natural Language Processing ToolKit";
+    homepage = "http://nltk.org/";
+    license = lib.licenses.asl20;
+    maintainers = with lib.maintainers; [ lheckemann ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nmigen-boards/default.nix b/nixpkgs/pkgs/development/python-modules/nmigen-boards/default.nix
new file mode 100644
index 000000000000..55f70f74db94
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nmigen-boards/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, nmigen
+, setuptools
+, setuptools_scm
+}:
+
+buildPythonPackage rec {
+  pname = "nmigen-boards";
+  version = "unstable-2020-02-06";
+  # python setup.py --version
+  realVersion = "0.1.dev92+g${lib.substring 0 7 src.rev}";
+
+  src = fetchFromGitHub {
+    owner = "nmigen";
+    repo = "nmigen-boards";
+    rev = "f37fe0295035db5f1bf82ed086b2eb349ab3a530";
+    sha256 = "16112ahil100anfwggj64nyrj3pf7mngwrjyqyhf2ggxx9ir24cc";
+  };
+
+  nativeBuildInputs = [ setuptools_scm ];
+  propagatedBuildInputs = [ setuptools nmigen ];
+
+  preBuild = ''
+    export SETUPTOOLS_SCM_PRETEND_VERSION="${realVersion}"
+  '';
+
+  meta = with lib; {
+    description = "Board and connector definitions for nMigen";
+    homepage = "https://github.com/nmigen/nmigen-boards";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ emily ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nmigen-soc/default.nix b/nixpkgs/pkgs/development/python-modules/nmigen-soc/default.nix
new file mode 100644
index 000000000000..4c15e65e62b2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nmigen-soc/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, nmigen
+, setuptools
+, setuptools_scm
+}:
+
+buildPythonPackage rec {
+  pname = "nmigen-soc";
+  version = "unstable-2020-02-08";
+  # python setup.py --version
+  realVersion = "0.1.dev24+g${lib.substring 0 7 src.rev}";
+
+  src = fetchFromGitHub {
+    owner = "nmigen";
+    repo = "nmigen-soc";
+    rev = "f1b009c7e075bca461d10ec963a7eaa3bf4dfc14";
+    sha256 = "04kjaq9qp6ac3h0r1wlb4jyz56bb52l1rikmz1x7azvnr10xhrad";
+  };
+
+  nativeBuildInputs = [ setuptools_scm ];
+  propagatedBuildInputs = [ setuptools nmigen ];
+
+  preBuild = ''
+    export SETUPTOOLS_SCM_PRETEND_VERSION="${realVersion}"
+  '';
+
+  meta = with lib; {
+    description = "System on Chip toolkit for nMigen";
+    homepage = "https://github.com/nmigen/nmigen-soc";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ emily ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nmigen/default.nix b/nixpkgs/pkgs/development/python-modules/nmigen/default.nix
new file mode 100644
index 000000000000..4a2327bf9288
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nmigen/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, setuptools
+, setuptools_scm
+, pyvcd
+, jinja2
+
+# for tests
+, pytestCheckHook
+, yosys
+, symbiyosys
+, yices
+}:
+
+buildPythonPackage rec {
+  pname = "nmigen";
+  version = "unstable-2020-04-02";
+  # python setup.py --version
+  realVersion = "0.2.dev49+g${lib.substring 0 7 src.rev}";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "nmigen";
+    repo = "nmigen";
+    rev = "c79caead33fff14e2dec42b7e21d571a02526876";
+    sha256 = "sha256-3+mxHyg0a92/BfyePtKT5Hsk+ra+fQzTjCJ2Ech44/s=";
+  };
+
+  nativeBuildInputs = [ setuptools_scm ];
+
+  propagatedBuildInputs = [ setuptools pyvcd jinja2 ];
+
+  checkInputs = [ pytestCheckHook yosys symbiyosys yices ];
+
+  preBuild = ''
+    export SETUPTOOLS_SCM_PRETEND_VERSION="${realVersion}"
+  '';
+
+  # Fail b/c can't find sby (symbiyosys) executable, which should be on path.
+  disabledTests = [
+    "test_distance"
+    "test_reversible"
+    "FIFOFormalCase"
+  ];
+
+  meta = with lib; {
+    description = "A refreshed Python toolbox for building complex digital hardware";
+    homepage = "https://nmigen.info/nmigen";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ emily ];
+  };
+}
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..ffa761f206e3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nocasedict/default.nix
@@ -0,0 +1,28 @@
+{ lib, buildPythonPackage, fetchPypi
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "nocasedict";
+  version = "1.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "bl1b0R3jP5PSJUXZ7SOguY+EDyzawNdJ0vqkYXrcd3I=";
+  };
+
+  checkInputs = [
+    pytest
+  ];
+
+  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..e7947eba92ae
--- /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.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "73a9c0659e7135c66e46a6ab06e2cb637ce9248d73c690ebd31afb72a4e03ac0";
+  };
+
+  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..5ba62fb9210e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/node-semver/default.nix
@@ -0,0 +1,20 @@
+{ lib, stdenv, fetchPypi, buildPythonPackage, pytest }:
+
+buildPythonPackage rec {
+  version = "0.7.0";
+  pname = "node-semver";
+
+  checkInputs = [ pytest ];
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1p7ink1wajkc31r05k1yn37gk377033a9vhin8v4j757d4ha1f91";
+  };
+
+  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..821a2d1bccfe
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nodeenv/default.nix
@@ -0,0 +1,24 @@
+{ lib, buildPythonPackage, fetchPypi, setuptools }:
+
+buildPythonPackage rec {
+  pname = "nodeenv";
+  version = "1.5.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ab45090ae383b716c4ef89e690c41ff8c2b257b85b309f01f3654df3d084bd7c";
+  };
+
+  propagatedBuildInputs = [
+    setuptools
+  ];
+
+  # Tests not included in PyPI tarball
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Node.js virtual environment builder";
+    homepage = "https://github.com/ekalinin/nodeenv";
+    license = licenses.bsd3;
+  };
+}
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..98f336c49866
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/noise/default.nix
@@ -0,0 +1,18 @@
+{ lib, stdenv, 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/nose-cov/default.nix b/nixpkgs/pkgs/development/python-modules/nose-cov/default.nix
new file mode 100644
index 000000000000..4b94e2657e97
--- /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; [ ma27 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nose-cover3/default.nix b/nixpkgs/pkgs/development/python-modules/nose-cover3/default.nix
new file mode 100644
index 000000000000..185270176acb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nose-cover3/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, nose
+}:
+
+buildPythonPackage rec {
+  pname = "nose-cover3";
+  version = "0.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1la4hhc1yszjpcchvkqk5xmzlb2g1b3fgxj9wwc58qc549whlcc1";
+  };
+
+  propagatedBuildInputs = [ nose ];
+
+  # No tests included
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Coverage 3.x support for Nose";
+    homepage = "https://github.com/ask/nosecover3";
+    license = licenses.lgpl21;
+  };
+
+}
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..4f90ee4be8b4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nose-cprof/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv
+, 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-focus/default.nix b/nixpkgs/pkgs/development/python-modules/nose-focus/default.nix
new file mode 100644
index 000000000000..8e31867d85c0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nose-focus/default.nix
@@ -0,0 +1,35 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub, six, nose, nose-of-yeti
+, nose-pattern-exclude, which }:
+
+buildPythonPackage rec {
+  pname = "nose-focus";
+  version = "0.1.3";
+
+  propagatedBuildInputs = [ six ];
+
+  checkInputs = [ nose nose-of-yeti nose-pattern-exclude which ];
+
+  # PyPI doesn't contain tests so let's use GitHub. See:
+  # https://github.com/delfick/nose-focus/issues/4
+  #
+  # However, the versions aren't tagged on GitHub so need to use a manually
+  # checked revision. See: https://github.com/delfick/nose-focus/issues/5
+  src = fetchFromGitHub {
+    owner = "delfick";
+    repo = pname;
+    rev = "4dac785ba07ed6e1df61b0fe2854685eef3bd115";
+    sha256 = "0gpd4j4433dc5ifh31w08c3bx862md0qm1ix6aam1rz4ayxpq51f";
+  };
+
+  checkPhase = ''
+    patchShebangs test.sh
+    ./test.sh
+  '';
+
+  meta = with lib; {
+    description = "Decorator and plugin to make nose focus on specific tests";
+    homepage = "https://nose-focus.readthedocs.io/en/latest/";
+    license = licenses.wtfpl;
+    maintainers = with maintainers; [ jluttine ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nose-of-yeti/default.nix b/nixpkgs/pkgs/development/python-modules/nose-of-yeti/default.nix
new file mode 100644
index 000000000000..2bd63f3295d4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nose-of-yeti/default.nix
@@ -0,0 +1,30 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub, six, nose, fudge, should-dsl }:
+
+buildPythonPackage rec {
+  pname = "nose-of-yeti";
+  version = "1.8";
+
+  propagatedBuildInputs = [ six ];
+
+  checkInputs = [ nose fudge should-dsl ];
+
+  # PyPI doesn't contain tests so let's use GitHub.
+  src = fetchFromGitHub {
+    owner = "delfick";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1pq9bf47k0csv41vdh2g6n336p3pd11q91hj5ypk0ls3nj756gbx";
+  };
+
+  checkPhase = ''
+    patchShebangs test.sh
+    ./test.sh
+  '';
+
+  meta = with lib; {
+    description = "Nose plugin providing BDD dsl for python";
+    homepage = "https://github.com/delfick/nose-of-yeti";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jluttine ];
+  };
+}
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..05a7102f1ae7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nose-pattern-exclude/default.nix
@@ -0,0 +1,23 @@
+{ lib, stdenv, 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..eb75a375d770
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nose-randomly/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, nose
+, numpy
+}:
+
+buildPythonPackage rec {
+  pname = "nose-randomly";
+  version = "1.2.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "7e483a3d79e13ae760d6ade57ae07ae45bb4b223b61a805e958b4c077116c67c";
+  };
+
+  checkInputs = [ numpy nose ];
+
+  checkPhase = ''
+    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..c93f5bda9838
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nose-timer/default.nix
@@ -0,0 +1,20 @@
+{ buildPythonPackage, fetchPypi, lib, nose, }:
+
+buildPythonPackage rec {
+  pname = "nose-timer";
+  version = "1.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "09hwjwbczi06bfqgiylb2yxs5h88jdl26zi1fdqxdzvamrkksf2c";
+  };
+
+  propagatedBuildInputs = [ nose ];
+
+  meta = with lib; {
+    homepage = "https://github.com/mahmoudimus/nose-timer";
+    license = licenses.mit;
+    description = "A timer plugin for nosetests (how much time does every test take?)";
+    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..2805b7c2ea19
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nose/default.nix
@@ -0,0 +1,33 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, python
+, coverage
+}:
+
+buildPythonPackage rec {
+  version = "1.3.7";
+  pname = "nose";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f1bffef9cbc82628f6e7d7b40d7e255aefaa1adb6a1b1d26c69a8b79e6208a98";
+  };
+
+  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 = "http://readthedocs.org/docs/nose/";
+    license = licenses.lgpl3;
+  };
+
+}
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..b815e223d82d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nose2/default.nix
@@ -0,0 +1,32 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, six
+, pythonOlder
+, coverage
+}:
+
+buildPythonPackage rec {
+  pname = "nose2";
+  version = "0.9.2";
+
+  # Requires mock 2.0.0 if python < 3.6, but NixPkgs has mock 3.0.5.
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0pmbb6nk31yhgh4zkcblzxsznml7f7pf5q1ihgrwvbxv4mwzfql7";
+  };
+
+  propagatedBuildInputs = [ six coverage ];
+
+  # AttributeError: 'module' object has no attribute 'collector'
+  doCheck = false;
+
+  meta = with lib; {
+    description = "nose2 is the next generation of nicer testing for Python";
+    homepage = "https://github.com/nose-devs/nose2";
+    license = licenses.bsd0;
+  };
+
+}
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..b920bb40736c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nose_progressive/default.nix
@@ -0,0 +1,32 @@
+{ lib, stdenv
+, 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 ];
+  };
+
+}
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..c165e87ff2ee
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nosejs/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv
+, 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..36747a50aae7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nosexcover/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv
+, 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/2.nix b/nixpkgs/pkgs/development/python-modules/notebook/2.nix
new file mode 100644
index 000000000000..0e5cfdf43971
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/notebook/2.nix
@@ -0,0 +1,76 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchPypi
+, 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
+}:
+
+buildPythonPackage rec {
+  pname = "notebook";
+  version = "5.7.10";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b10107e1438e7a564292aa32510e610c88844cae03c882fe5286b891792b5c11";
+  };
+
+  LC_ALL = "en_US.utf8";
+
+  checkInputs = [ nose 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
+  ];
+
+  # disable warning_filters
+  preCheck = lib.optionalString (!isPy3k) ''
+    echo "" > setup.cfg
+  '';
+
+  postPatch = ''
+    # Remove selenium tests
+    rm -rf notebook/tests/selenium
+
+  '';
+
+  checkPhase = ''
+    runHook preCheck
+    mkdir tmp
+    HOME=tmp nosetests -v ${if (stdenv.isDarwin) then ''
+      --exclude test_delete \
+      --exclude test_checkpoints_follow_file
+    ''
+    else ""}
+  '';
+
+  # 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; [ ];
+  };
+}
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..bab3aa590ec6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/notebook/default.nix
@@ -0,0 +1,86 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchPypi
+, argon2_cffi
+, nose
+, nose_warnings_filters
+, glibcLocales
+, isPy3k
+, mock
+, jinja2
+, tornado
+, ipython_genutils
+, traitlets
+, jupyter
+, jupyter_core
+, jupyter_client
+, nbformat
+, nbconvert
+, ipykernel
+, terminado
+, requests
+, send2trash
+, pexpect
+, prometheus_client
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "notebook";
+  version = "6.1.5";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "3db37ae834c5f3b6378381229d0e5dfcbfb558d08c8ce646b1ad355147f5e91d";
+  };
+
+  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"
+  ];
+
+  # 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/notify-py/default.nix b/nixpkgs/pkgs/development/python-modules/notify-py/default.nix
new file mode 100644
index 000000000000..46c72fb69794
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/notify-py/default.nix
@@ -0,0 +1,35 @@
+{ lib, buildPythonPackage, fetchPypi, isPy3k, alsaUtils, libnotify, which, loguru, pytest }:
+
+buildPythonPackage rec {
+  pname = "notify_py";
+  version = "0.3.1";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "5ba696d18ffe1d7070f3d0a5b4923fee4d6c863de6843af105bec0ce9915ebad";
+  };
+
+  postPatch = ''
+   substituteInPlace setup.py \
+     --replace "loguru==0.4.1" "loguru~=0.5.0"
+  '';
+
+  propagatedBuildInputs = [ alsaUtils libnotify loguru which ];
+
+  checkInputs = [ alsaUtils libnotify pytest which ];
+
+  checkPhase = ''
+    pytest
+  '';
+
+  pythonImportsCheck = [ "notifypy" ];
+
+  meta = with lib; {
+    description = " Python Module for sending cross-platform desktop notifications on Windows, macOS, and Linux.";
+    homepage = "https://github.com/ms7m/notify-py/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ austinbutler ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/notify/default.nix b/nixpkgs/pkgs/development/python-modules/notify/default.nix
new file mode 100644
index 000000000000..1a60cf70d2d2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/notify/default.nix
@@ -0,0 +1,41 @@
+{ lib, stdenv
+, fetchurl
+, python
+, pygobject2
+, pygtk
+, pkgs
+}:
+
+stdenv.mkDerivation {
+  pname = "python-notify";
+  version = "0.1.1";
+
+  src = fetchurl {
+    url = "http://www.galago-project.org/files/releases/source/notify-python/notify-python-0.1.1.tar.bz2";
+    sha256 = "1kh4spwgqxm534qlzzf2ijchckvs0pwjxl1irhicjmlg7mybnfvx";
+  };
+
+  patches = lib.singleton (fetchurl {
+    name = "libnotify07.patch";
+    url = "https://src.fedoraproject.org/cgit/notify-python.git/plain/"
+        + "libnotify07.patch?id2=289573d50ae4838a1658d573d2c9f4c75e86db0c";
+    sha256 = "1lqdli13mfb59xxbq4rbq1f0znh6xr17ljjhwmzqb79jl3dig12z";
+  });
+
+  postPatch = ''
+    sed -i -e '/^PYGTK_CODEGEN/s|=.*|="${pygtk}/bin/pygtk-codegen-2.0"|' \
+      configure
+  '';
+
+  nativeBuildInputs = [ pkgs.pkgconfig ];
+  buildInputs = [ python pygobject2 pygtk pkgs.libnotify pkgs.glib pkgs.gtk2 pkgs.dbus-glib ];
+
+  postInstall = "cd $out/lib/python*/site-packages && ln -s gtk-*/pynotify .";
+
+  meta = with lib; {
+    description = "Python bindings for libnotify";
+    homepage = "http://www.galago-project.org/";
+    license = licenses.lgpl3;
+  };
+
+}
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/notmuch/2.nix b/nixpkgs/pkgs/development/python-modules/notmuch/2.nix
new file mode 100644
index 000000000000..970928e03f40
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/notmuch/2.nix
@@ -0,0 +1,27 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, notmuch
+, python
+, cffi
+}:
+
+buildPythonPackage {
+  pname = "notmuch2";
+  inherit (notmuch) version src;
+
+  sourceRoot = "${notmuch.src.name}/bindings/python-cffi";
+
+  buildInputs = [ python notmuch cffi ];
+
+  # no tests
+  doCheck = false;
+  pythonImportsCheck = [ "notmuch2" ];
+
+  meta = with lib; {
+    description = "Pythonic bindings for the notmuch mail database using CFFI";
+    homepage = "https://notmuchmail.org/";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ teto ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/notmuch/default.nix b/nixpkgs/pkgs/development/python-modules/notmuch/default.nix
new file mode 100644
index 000000000000..609d4c78d5d7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/notmuch/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, stdenv
+, 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/nplusone/default.nix b/nixpkgs/pkgs/development/python-modules/nplusone/default.nix
new file mode 100644
index 000000000000..c2f484cb3a92
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nplusone/default.nix
@@ -0,0 +1,49 @@
+{ blinker, buildPythonPackage, fetchFromGitHub, lib, isPy27, six, mock, pytest
+, webtest, pytestcov, pytest-django, pytest-pythonpath, flake8, sqlalchemy
+, flask_sqlalchemy, peewee }:
+
+buildPythonPackage rec {
+  pname = "nplusone";
+  version = "1.0.0";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "jmcarp";
+    repo = "nplusone";
+    rev = "v${version}";
+    sha256 = "0qdwpvvg7dzmksz3vqkvb27n52lq5sa8i06m7idnj5xk2dgjkdxg";
+  };
+
+  # 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
+  '';
+
+  checkPhase = ''
+    pytest tests/
+  '';
+
+  propagatedBuildInputs = [ six blinker ];
+  checkInputs = [
+    mock
+    pytest
+    webtest
+    pytestcov
+    pytest-django
+    pytest-pythonpath
+    flake8
+    sqlalchemy
+    flask_sqlalchemy
+    peewee
+  ];
+
+  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/ntc-templates/default.nix b/nixpkgs/pkgs/development/python-modules/ntc-templates/default.nix
new file mode 100644
index 000000000000..a85bd0f8fc37
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ntc-templates/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, isPy27
+, textfsm
+, pytestCheckHook
+, ruamel_yaml
+, yamllint
+}:
+
+buildPythonPackage rec {
+  pname = "ntc-templates";
+  version = "1.6.0";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "networktocode";
+    repo = pname;
+    rev = "dc27599b0c5f3bb6ff23049e781b5dab2849c2c3";  # not tagged
+    sha256 = "1vg5y5c51vc9dj3b8qcffh6dz85ri11zb1azxmyvgbq86pcvbx9f";
+  };
+
+  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..080734bd25e8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ntlm-auth/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, mock
+, pytest
+, requests
+, unittest2
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "ntlm-auth";
+  version = "1.5.0";
+
+  src = fetchFromGitHub {
+    owner = "jborean93";
+    repo = "ntlm-auth";
+    rev = "v${version}";
+    sha256 = "00dpf5bfsy07frsjihv1k10zmwcyq4bvkilbxha7h6nlwpcm2409";
+  };
+
+  checkInputs = [ mock pytest requests unittest2 ];
+  propagatedBuildInputs = [ six ];
+
+  # Functional tests require networking
+  checkPhase = ''
+    py.test --ignore=tests/functional/test_iis.py
+  '';
+
+  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..266482a8ff28
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ntplib/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "ntplib";
+  version = "0.3.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "9fc99f71b14641b31698e4ced3d5f974eec225bfbae089ebe44b5808ba890f71";
+  };
+
+  # 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..44ee4597dbe4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nuitka/default.nix
@@ -0,0 +1,52 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchurl
+, vmprof
+, pyqt4
+, isPyPy
+, pkgs
+}:
+
+let
+  # scons is needed but using it requires Python 2.7
+  # Therefore we create a separate env for it.
+  scons = pkgs.python27.withPackages(ps: [ pkgs.scons ]);
+in buildPythonPackage rec {
+  version = "0.6.8.4";
+  pname = "Nuitka";
+
+  # Latest version is not yet on PyPi
+  src = fetchurl {
+    url = "https://github.com/kayhayen/Nuitka/archive/${version}.tar.gz";
+    sha256 = "0awhwksnmqmbciimqmd11wygp7bnq57khcg4n9r4ld53s147rmqm";
+  };
+
+  checkInputs = [ vmprof pyqt4 ];
+  nativeBuildInputs = [ scons ];
+
+  postPatch = ''
+    patchShebangs tests/run-tests
+  '' + lib.optionalString stdenv.isLinux ''
+    substituteInPlace nuitka/plugins/standard/ImplicitImports.py --replace 'locateDLL("uuid")' '"${pkgs.util-linux.out}/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/num2words/default.nix b/nixpkgs/pkgs/development/python-modules/num2words/default.nix
new file mode 100644
index 000000000000..bce4c0426e40
--- /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.10";
+  pname = "num2words";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0myc27k087rhgpwn1a1dffzl32rwz6ngdbf3rm2i0zlgcxh4zk9p";
+  };
+
+  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/default.nix b/nixpkgs/pkgs/development/python-modules/numba/default.nix
new file mode 100644
index 000000000000..aa08ead2d971
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/numba/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, stdenv
+, pythonOlder
+, fetchPypi
+, python
+, buildPythonPackage
+, isPy27
+, isPy3k
+, numpy
+, llvmlite
+, funcsigs
+, singledispatch
+, libcxx
+}:
+
+buildPythonPackage rec {
+  version = "0.51.2";
+  pname = "numba";
+  # uses f-strings
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "16bd59572114adbf5f600ea383880d7b2071ae45477e84a24994e089ea390768";
+  };
+
+  NIX_CFLAGS_COMPILE = lib.optionalString stdenv.isDarwin "-I${libcxx}/include/c++/v1";
+
+  propagatedBuildInputs = [numpy llvmlite]
+    ++ lib.optionals isPy27 [ funcsigs singledispatch];
+
+  # Copy test script into $out and run the test suite.
+  checkPhase = ''
+    ${python.interpreter} -m numba.runtests
+  '';
+  # ImportError: cannot import name '_typeconv'
+  doCheck = false;
+
+  meta =  with lib; {
+    homepage = "http://numba.pydata.org/";
+    license = licenses.bsd2;
+    description = "Compiling Python code using LLVM";
+    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..3857e80bbd39
--- /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.7.2";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "4a038064d5604e6181a64db668d7b700d9ae87e4041984c04cbf0042469664b0";
+  };
+
+  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/alimanfoo/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/numericalunits/default.nix b/nixpkgs/pkgs/development/python-modules/numericalunits/default.nix
new file mode 100644
index 000000000000..0c71b065a32d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/numericalunits/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv
+, 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..e5a36fe454f8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/numexpr/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python
+, numpy
+}:
+
+buildPythonPackage rec {
+  pname = "numexpr";
+  version = "2.7.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1ai3i5n07csnzfsxf2dxp8cpdk6ajl5iv8rv0fj6n9ag7qphixac";
+  };
+
+  # Remove existing site.cfg, use the one we built for numpy.
+  preBuild = ''
+    ln -s ${numpy.cfg} site.cfg
+  '';
+
+  nativeBuildInputs = [
+    numpy
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+  ];
+
+  checkPhase = ''
+    runtest="$(pwd)/numexpr/tests/test_numexpr.py"
+    pushd "$out"
+    ${python.interpreter} "$runtest"
+    popd
+  '';
+
+  meta = {
+    description = "Fast numerical array expression evaluator for NumPy";
+    homepage = "https://github.com/pydata/numexpr";
+    license = lib.licenses.mit;
+  };
+}
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..cb43084556e8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/numpy-stl/default.nix
@@ -0,0 +1,23 @@
+{ lib, buildPythonPackage, fetchPypi, cython, numpy, nine, pytest, pytestrunner, python-utils, enum34 }:
+
+buildPythonPackage rec {
+  pname = "numpy-stl";
+  version = "2.13.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "648386e6cdad3218adc4e3e6a349bee41c55a61980dace616c05d6a31e8c652d";
+  };
+
+  checkInputs = [ pytest pytestrunner ];
+
+  checkPhase = "py.test";
+
+  propagatedBuildInputs = [ cython numpy nine python-utils enum34 ];
+
+  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;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/numpy/1.16.nix b/nixpkgs/pkgs/development/python-modules/numpy/1.16.nix
new file mode 100644
index 000000000000..1ab958a15f07
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/numpy/1.16.nix
@@ -0,0 +1,99 @@
+{ lib
+, fetchPypi
+, python
+, buildPythonPackage
+, gfortran
+, pytest
+, blas
+, lapack
+, writeTextFile
+, isPyPy
+, cython
+, setuptoolsBuildHook
+ }:
+
+assert (!blas.isILP64) && (!lapack.isILP64);
+
+let
+  cfg = writeTextFile {
+    name = "site.cfg";
+    text = (lib.generators.toINI {} {
+      ${blas.implementation} = {
+        include_dirs = "${lib.getDev blas}/include:${lib.getDev lapack}/include";
+        library_dirs = "${blas}/lib:${lapack}/lib";
+        runtime_library_dirs = "${blas}/lib:${lapack}/lib";
+        libraries = "lapack,lapacke,blas,cblas";
+      };
+      lapack = {
+        include_dirs = "${lib.getDev lapack}/include";
+        library_dirs = "${lapack}/lib";
+        runtime_library_dirs = "${lapack}/lib";
+      };
+      blas = {
+        include_dirs = "${lib.getDev blas}/include";
+        library_dirs = "${blas}/lib";
+        runtime_library_dirs = "${blas}/lib";
+      };
+    });
+  };
+in buildPythonPackage rec {
+  pname = "numpy";
+  version = "1.16.6";
+  format = "pyproject.toml";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "e5cf3fdf13401885e8eea8170624ec96225e2174eb0c611c6f26dd33b489e3ff";
+  };
+
+  nativeBuildInputs = [ gfortran pytest cython setuptoolsBuildHook ];
+  buildInputs = [ blas lapack ];
+
+  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++_1.16.patch
+  ];
+
+  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;
+
+  doCheck = !isPyPy; # numpy 1.16+ hits a bug in pypy's ctypes, using either numpy or pypy HEAD fixes this (https://github.com/numpy/numpy/issues/13807)
+
+  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/default.nix b/nixpkgs/pkgs/development/python-modules/numpy/default.nix
new file mode 100644
index 000000000000..51eeab3177e2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/numpy/default.nix
@@ -0,0 +1,115 @@
+{ lib
+, fetchPypi
+, python
+, buildPythonPackage
+, gfortran
+, hypothesis
+, pytest_5
+, blas
+, lapack
+, writeTextFile
+, isPyPy
+, cython
+, setuptoolsBuildHook
+, fetchpatch
+ }:
+
+assert (!blas.isILP64) && (!lapack.isILP64);
+
+let
+  cfg = writeTextFile {
+    name = "site.cfg";
+    text = (lib.generators.toINI {} {
+      ${blas.implementation} = {
+        include_dirs = "${lib.getDev blas}/include:${lib.getDev lapack}/include";
+        library_dirs = "${blas}/lib:${lapack}/lib";
+        runtime_library_dirs = "${blas}/lib:${lapack}/lib";
+        libraries = "lapack,lapacke,blas,cblas";
+      };
+      lapack = {
+        include_dirs = "${lib.getDev lapack}/include";
+        library_dirs = "${lapack}/lib";
+        runtime_library_dirs = "${lapack}/lib";
+      };
+      blas = {
+        include_dirs = "${lib.getDev blas}/include";
+        library_dirs = "${blas}/lib";
+        runtime_library_dirs = "${blas}/lib";
+      };
+    });
+  };
+in buildPythonPackage rec {
+  pname = "numpy";
+  version = "1.19.4";
+  format = "pyproject.toml";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "141ec3a3300ab89c7f2b0775289954d193cc8edb621ea05f99db9cb181530512";
+  };
+
+  nativeBuildInputs = [ gfortran cython setuptoolsBuildHook ];
+  buildInputs = [ blas lapack ];
+
+  patches = [
+    # For compatibility with newer pytest
+    (fetchpatch {
+      url = "https://github.com/numpy/numpy/commit/ba315034759fbf91c61bb55390edc86e7b2627f3.patch";
+      sha256 = "F2P5q61CyhqsZfwkLmxb7A9YdE+43FXLbQkSjop2rVY=";
+    })
+  ] ++ 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
+  ];
+
+  # 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;
+
+  doCheck = !isPyPy; # numpy 1.16+ hits a bug in pypy's ctypes, using either numpy or pypy HEAD fixes this (https://github.com/numpy/numpy/issues/13807)
+
+  checkInputs = [
+    pytest_5 # pytest 6 will error: "module is already imported: hypothesis"
+    hypothesis
+  ];
+
+  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/numpy/numpy-distutils-C++_1.16.patch b/nixpkgs/pkgs/development/python-modules/numpy/numpy-distutils-C++_1.16.patch
new file mode 100644
index 000000000000..b2626ea26e5b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/numpy/numpy-distutils-C++_1.16.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
+@@ -44,8 +44,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):
+@@ -54,8 +52,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:
+         msg = str(get_exception())
+         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..0f57847b3a62
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/numpydoc/default.nix
@@ -0,0 +1,27 @@
+{ lib, buildPythonPackage, fetchPypi, isPy27
+, jinja2
+, nose
+, pytest
+, sphinx
+}:
+
+buildPythonPackage rec {
+  pname = "numpydoc";
+  version = "1.1.0";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname;
+    inherit version;
+    sha256 = "c36fd6cb7ffdc9b4e165a43f67bf6271a7b024d0bb6b00ac468c9e2bfc76448e";
+  };
+
+  checkInputs = [ nose pytest ];
+  propagatedBuildInputs = [ sphinx jinja2 ];
+
+  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/numtraits/default.nix b/nixpkgs/pkgs/development/python-modules/numtraits/default.nix
new file mode 100644
index 000000000000..624f32fd337b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/numtraits/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest
+, six
+, numpy
+, traitlets
+}:
+
+buildPythonPackage rec {
+  pname = "numtraits";
+  version = "0.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "2fca9a6c9334f7358ef1a3e2e64ccaa6a479fc99fc096910e0d5fbe8edcdfd7e";
+  };
+
+  checkInputs = [ pytest ];
+  propagatedBuildInputs = [ six numpy traitlets];
+
+  checkPhase = ''
+    py.test
+  '';
+
+  meta = {
+    description = "Numerical traits for Python objects";
+    license = lib.licenses.bsd2;
+    maintainers = with lib.maintainers; [ fridh ];
+    homepage = "https://github.com/astrofrog/numtraits";
+  };
+}
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..8b2943ba363a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nunavut/default.nix
@@ -0,0 +1,37 @@
+{ lib, buildPythonPackage, pythonOlder, fetchPypi, pydsdl }:
+
+ buildPythonPackage rec {
+  pname = "nunavut";
+  version = "0.6.2";
+  disabled = pythonOlder "3.5"; # only python>=3.5 is supported
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "48b6802722d78542ca5d7bbc0d6aa9b0a31e1be0070c47b41527f227eb6a1443";
+  };
+
+  propagatedBuildInputs = [
+    pydsdl
+  ];
+
+  # allow for writable directory for darwin
+  preBuild = ''
+    export HOME=$TMPDIR
+  '';
+
+  # repo doesn't contain tests, ensure imports aren't broken
+  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/nvchecker/default.nix b/nixpkgs/pkgs/development/python-modules/nvchecker/default.nix
new file mode 100644
index 000000000000..832e281a9a1e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nvchecker/default.nix
@@ -0,0 +1,55 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytestCheckHook
+, setuptools
+, toml
+, structlog
+, appdirs
+, pytest-asyncio
+, flaky
+, tornado
+, pycurl
+, aiohttp
+, pytest-httpbin
+, docutils
+, installShellFiles
+}:
+
+buildPythonPackage rec {
+  pname = "nvchecker";
+  version = "2.2";
+
+  # Tests not included in PyPI tarball
+  src = fetchFromGitHub {
+    owner = "lilydjwg";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0b17pikqyxcsid69lwnjl44n8z46ydjmxxdnbzasfdl7r83l7ijr";
+  };
+
+  nativeBuildInputs = [ installShellFiles docutils ];
+  propagatedBuildInputs = [ setuptools toml structlog appdirs tornado pycurl aiohttp ];
+  checkInputs = [ pytestCheckHook pytest-asyncio flaky pytest-httpbin ];
+
+  disabled = pythonOlder "3.7";
+
+  postBuild = ''
+    patchShebangs docs/myrst2man.py
+    make -C docs man
+  '';
+
+  postInstall = ''
+    installManPage docs/_build/man/nvchecker.1
+  '';
+
+  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..4676fdef0cdc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nwdiag/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv, fetchurl, buildPythonPackage, pep8, nose, unittest2, docutils
+, blockdiag, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "nwdiag";
+  version = "2.0.0";
+
+  src = fetchurl {
+    url = "mirror://pypi/n/nwdiag/${pname}-${version}.tar.gz";
+    sha256 = "1qkl1lq7cblr6fra2rjw3zlcccragp8384hpm4n7dkc5c3yzmmsw";
+  };
+
+  buildInputs = [ pep8 nose unittest2 docutils ];
+
+  propagatedBuildInputs = [ blockdiag setuptools ];
+
+  # tests fail
+  doCheck = false;
+
+  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..4057ba1de8ad
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nxt-python/default.nix
@@ -0,0 +1,36 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchgit
+, isPy3k
+, pyusb
+, pybluez
+, pyfantom
+, git
+}:
+
+buildPythonPackage {
+  version = "unstable-20160819";
+  pname = "nxt-python";
+  disabled = isPy3k;
+
+  src = fetchgit {
+    url = "https://github.com/Eelviny/nxt-python";
+    rev = "479e20b7491b28567035f4cee294c4a2af629297";
+    sha256 = "0mcsajhgm2wy4iy2lhmyi3xibgmbixbchanzmlhsxk6qyjccn9r9";
+    branchName= "pyusb";
+  };
+
+  propagatedBuildInputs = [ pyusb pybluez pyfantom git ];
+
+  # Tests fail on Mac dependency
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Python driver/interface for Lego Mindstorms NXT robot";
+    homepage = "https://github.com/Eelviny/nxt-python";
+    license = licenses.gpl3;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ leenaars ];
+  };
+
+}
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..158cf0368406
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/oath/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "oath";
+  version = "1.4.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1xqgcqgx6aa0j21hwsdb3aqpqhviwj756bcqjjjcm1h1aij11p6m";
+  };
+
+  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..0e53eaec7c0e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/oauth/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv
+, 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..70b2e94e37ca
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/oauth2/default.nix
@@ -0,0 +1,32 @@
+{ lib, stdenv
+, 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..2394e32403f9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/oauthenticator/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, jupyterhub
+, globus-sdk
+, mwoauth
+, codecov
+, flake8
+, pyjwt
+, pytest
+, pytestcov
+, pytest-tornado
+, requests-mock
+, pythonOlder
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "oauthenticator";
+  version = "0.12.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f86e18e954ae37796ee149fe01ab0be0707d9e0415d62336ba3447e7b4383461";
+  };
+
+  checkPhase = ''
+    py.test oauthenticator/tests
+  '';
+
+  # No tests in archive
+  doCheck = false;
+
+  checkInputs = [  globus-sdk mwoauth codecov flake8 pytest
+    pytestcov pytest-tornado requests-mock pyjwt ];
+
+  propagatedBuildInputs = [ jupyterhub ];
+
+  disabled = pythonOlder "3.4";
+
+  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/3.1.nix b/nixpkgs/pkgs/development/python-modules/oauthlib/3.1.nix
new file mode 100644
index 000000000000..40501733e4c7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/oauthlib/3.1.nix
@@ -0,0 +1,33 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, mock
+, pytest
+, cryptography
+, blinker
+, pyjwt
+}:
+
+buildPythonPackage rec {
+  pname = "oauthlib";
+  version = "3.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "bee41cc35fcca6e988463cacc3bcb8a96224f470ca547e697b604cc697b2f889";
+  };
+
+  checkInputs = [ mock pytest ];
+  propagatedBuildInputs = [ cryptography blinker pyjwt ];
+
+  checkPhase = ''
+    py.test tests/
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/idan/oauthlib";
+    description = "A generic, spec-compliant, thorough implementation of the OAuth request-signing logic";
+    maintainers = with maintainers; [ prikhi ];
+    license = licenses.bsd3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/oauthlib/default.nix b/nixpkgs/pkgs/development/python-modules/oauthlib/default.nix
new file mode 100644
index 000000000000..df65547a256d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/oauthlib/default.nix
@@ -0,0 +1,36 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, mock
+, pytest
+, cryptography
+, blinker
+, pyjwt
+}:
+
+buildPythonPackage rec {
+  pname = "oauthlib";
+  version = "unstable-2020-05-08";
+
+  # master supports pyjwt==1.7.1
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = "46647402896db5f0d979eba9594623e889739060";
+    sha256 = "1wrdjdvlfcd74lckcgascnasrffg8sip0z673si4ag5kv4afiz3l";
+  };
+
+  checkInputs = [ mock pytest ];
+  propagatedBuildInputs = [ cryptography blinker pyjwt ];
+
+  checkPhase = ''
+    py.test tests/
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/idan/oauthlib";
+    description = "A generic, spec-compliant, thorough implementation of the OAuth request-signing logic";
+    maintainers = with maintainers; [ prikhi ];
+    license = licenses.bsd3;
+  };
+}
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..1dec57cafb44
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/obfsproxy/default.nix
@@ -0,0 +1,37 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchgit
+, pyptlib
+, twisted
+, pycrypto
+, pyyaml
+}:
+
+buildPythonPackage rec {
+  pname = "obfsproxy";
+  version = "0.2.13";
+
+  src = fetchgit {
+    url = meta.repositories.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";
+    repositories.git = "https://git.torproject.org/pluggable-transports/obfsproxy.git";
+    maintainers = with maintainers; [ phreedom thoughtpolice ];
+  };
+
+}
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..8bb119bcb4bf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/objgraph/default.nix
@@ -0,0 +1,40 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPyPy
+, substituteAll
+, graphvizPkg
+, 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 = graphvizPkg;
+    })
+  ];
+
+  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/od/default.nix b/nixpkgs/pkgs/development/python-modules/od/default.nix
new file mode 100644
index 000000000000..aa275cb27a69
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/od/default.nix
@@ -0,0 +1,23 @@
+{ lib, buildPythonPackage, fetchPypi, unittest2, repeated_test }:
+
+buildPythonPackage rec {
+  pname = "od";
+  version = "1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1az30snc3w6s4k1pi7mspcv8y0kp3ihf3ly44z517nszmz9lrjfi";
+  };
+
+  checkInputs = [
+    repeated_test
+    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/offtrac/default.nix b/nixpkgs/pkgs/development/python-modules/offtrac/default.nix
new file mode 100644
index 000000000000..edec161a133b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/offtrac/default.nix
@@ -0,0 +1,23 @@
+{ lib, stdenv
+, 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..5ef7060b7f66
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ofxclient/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv, 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..d9a28da18060
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ofxhome/default.nix
@@ -0,0 +1,22 @@
+{ lib, stdenv, 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..235875eec7ce
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ofxparse/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, six
+, beautifulsoup4
+, lxml
+}:
+
+buildPythonPackage rec {
+  pname = "ofxparse";
+  version = "0.20";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0zn3grc6xhgzcc81qc3dxkkwk731cjjqqhb46smw12lk09cdnigb";
+  };
+
+  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..8f280d1cfd45
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ofxtools/default.nix
@@ -0,0 +1,35 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, nose
+, python
+, 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..96c0a0b51bef
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/olefile/default.nix
@@ -0,0 +1,18 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi }:
+buildPythonPackage rec {
+  pname = "olefile";
+  version = "0.46";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "133b031eaf8fd2c9399b78b8bc5b8fcbe4c31e85295749bb17a87cba8f3c3964";
+  };
+
+  meta = with lib; {
+    description = "Python package to parse, read and write Microsoft OLE2 files";
+    homepage = "https://www.decalage.info/python/olefileio";
+    # BSD like + reference to Pillow
+    license = "http://olefile.readthedocs.io/en/latest/License.html";
+  };
+}
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..99b9cccc7de6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/omegaconf/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub, pythonOlder
+, pytest, pytestrunner, pyyaml, six, pathlib2, isPy27 }:
+
+buildPythonPackage rec {
+  pname = "omegaconf";
+  version = "1.4.1";
+
+  src = fetchFromGitHub {
+    owner = "omry";
+    repo = pname;
+    rev = version;
+    sha256 = "1vpcdjlq54pm8xmkv2hqm2n1ysvz2a9iqgf55x0w6slrb4595cwb";
+  };
+
+  checkInputs = [ pytest ];
+  buildInputs = [ pytestrunner ];
+  propagatedBuildInputs = [ pyyaml six ] ++ lib.optional isPy27 pathlib2;
+
+  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/onkyo-eiscp/default.nix b/nixpkgs/pkgs/development/python-modules/onkyo-eiscp/default.nix
new file mode 100644
index 000000000000..067db3a69fef
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/onkyo-eiscp/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv, 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/onnx/default.nix b/nixpkgs/pkgs/development/python-modules/onnx/default.nix
new file mode 100644
index 000000000000..278d7c1df046
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/onnx/default.nix
@@ -0,0 +1,71 @@
+{ lib
+, fetchpatch
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, isPy27
+, cmake
+, protobuf
+, numpy
+, six
+, typing-extensions
+, typing
+, pytestrunner
+, pytest
+, nbval
+, tabulate
+}:
+
+buildPythonPackage rec {
+  pname = "onnx";
+  version = "1.8.0";
+
+  # Due to Protobuf packaging issues this build of Onnx with Python 2 gives
+  # errors on import.
+  # Also support for Python 2 will be deprecated from Onnx v1.8.
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "5f787fd3ce1290e12da335237b3b921152157e51aa09080b65631b3ce3fcc50c";
+  };
+
+  nativeBuildInputs = [ cmake ];
+
+  propagatedBuildInputs = [
+    protobuf
+    numpy
+    six
+    typing-extensions
+  ] ++ lib.optional (pythonOlder "3.5") [ typing ];
+
+  checkInputs = [
+    pytestrunner
+    pytest
+    nbval
+    tabulate
+  ];
+
+  postPatch = ''
+    patchShebangs tools/protoc-gen-mypy.py
+  '';
+
+  preBuild = ''
+    export MAX_JOBS=$NIX_BUILD_CORES
+  '';
+
+  # The executables are just utility scripts that aren't too important
+  postInstall = ''
+    rm -r $out/bin
+  '';
+
+  # The setup.py does all the configuration
+  dontUseCmakeConfigure = true;
+
+  meta = {
+    homepage    = "http://onnx.ai";
+    description = "Open Neural Network Exchange";
+    license     = lib.licenses.mit;
+    maintainers = [ lib.maintainers.acairncross ];
+  };
+}
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..374b7cb059d1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/openant/default.nix
@@ -0,0 +1,38 @@
+{ lib, stdenv
+, 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-spec-validator/default.nix b/nixpkgs/pkgs/development/python-modules/openapi-spec-validator/default.nix
new file mode 100644
index 000000000000..02f51bc3e66f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/openapi-spec-validator/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, isPy27, fetchPypi
+, jsonschema, pyyaml, six, pathlib
+, mock, pytest, pytestcov, pytest-flake8, tox, setuptools }:
+
+buildPythonPackage rec {
+  pname = "openapi-spec-validator";
+  version = "0.2.9";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1jw59mmd3n1d5zihdqz2a3j2axxf3m34lqp1190fw8rlndlilf3r";
+  };
+
+  propagatedBuildInputs = [ jsonschema pyyaml six setuptools ]
+    ++ (lib.optionals (isPy27) [ pathlib ]);
+
+  checkInputs = [ mock pytest pytestcov pytest-flake8 tox ];
+
+  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..18a6a8dd032c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/openbabel-bindings/default.nix
@@ -0,0 +1,27 @@
+{ stdenv, 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 = "$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/openidc-client/default.nix b/nixpkgs/pkgs/development/python-modules/openidc-client/default.nix
new file mode 100644
index 000000000000..7d373c13a8a5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/openidc-client/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv, 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/2.nix b/nixpkgs/pkgs/development/python-modules/openpyxl/2.nix
new file mode 100644
index 000000000000..73300de645ff
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/openpyxl/2.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest
+, jdcal
+, et_xmlfile
+, lxml
+}:
+
+buildPythonPackage rec {
+  pname = "openpyxl";
+  version = "2.6.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1d53801678e18d7fe38c116f1ad0c2383a654670c4c8806105b611c92d92f2e3";
+  };
+
+  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 sjourdois ];
+  };
+}
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..5a7d2a6425b0
--- /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.5";
+  disabled = isPy27; # 2.6.4 was final python2 release
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "18e11f9a650128a12580a58e3daba14e00a11d9e907c554a17ea016bf1a2c71b";
+  };
+
+  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 sjourdois ];
+  };
+}
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..843380ebf21d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/openrazer/common.nix
@@ -0,0 +1,17 @@
+{ lib, stdenv
+, fetchFromGitHub
+}: rec {
+  version = "2.9.0";
+  src = fetchFromGitHub {
+    owner = "openrazer";
+    repo = "openrazer";
+    rev = "v${version}";
+    sha256 = "1js7hq7zx5kj99brffrfaaah283ydkffmmrzsxv4mkd3nnd6rykk";
+  };
+  meta = with lib; {
+    homepage = "https://openrazer.github.io/";
+    license = licenses.gpl2;
+    maintainers = with maintainers; [ roelvandijk evanjs ];
+    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..6c22d3bae5d0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/openrazer/daemon.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonApplication
+, isPy3k
+, daemonize
+, dbus-python
+, fetchFromGitHub
+, fetchpatch
+, gobject-introspection
+, gtk3
+, makeWrapper
+, pygobject3
+, pyudev
+, setproctitle
+, stdenv
+, wrapGAppsHook
+}:
+
+let
+  common = import ./common.nix { inherit stdenv lib fetchFromGitHub; };
+in
+buildPythonApplication (common // rec {
+  pname = "openrazer_daemon";
+
+  disabled = !isPy3k;
+
+  sourceRoot = "source/daemon";
+
+  outputs = [ "out" "man" ];
+
+  nativeBuildInputs = [ makeWrapper wrapGAppsHook ];
+
+  propagatedBuildInputs = [
+    daemonize
+    dbus-python
+    gobject-introspection
+    gtk3
+    pygobject3
+    pyudev
+    setproctitle
+  ];
+
+  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..52fe63318a3e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/openrazer/pylib.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, dbus-python
+, fetchFromGitHub
+, numpy
+, stdenv
+, openrazer-daemon
+}:
+
+let
+  common = import ./common.nix { inherit stdenv 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..c35405f417b2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/openrouteservice/default.nix
@@ -0,0 +1,29 @@
+{ lib, buildPythonPackage, fetchFromGitHub, requests, responses, pytestCheckHook }:
+
+buildPythonPackage rec {
+  pname = "openrouteservice";
+  version = "2.3.0";
+
+  src = fetchFromGitHub {
+    owner = "GIScience";
+    repo = "${pname}-py";
+    rev = "v${version}";
+    sha256 = "ySXzOQI9NcF1W/otbL7i3AY628/74ZkJjDMQ9ywVEPc=";
+  };
+
+  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..d9f4cb6b1add
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/opensensemap-api/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, aiohttp
+, async-timeout
+}:
+
+buildPythonPackage rec {
+  pname = "opensensemap-api";
+  version = "0.1.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1f3iqwl8ynvrkdd961v2hjsbldwbr217pv5pay2m5f0m974bhblx";
+  };
+
+  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/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..8e4ece43fd7b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/opentracing/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, futures
+, gevent
+, mock
+, pytest
+, tornado }:
+
+buildPythonPackage rec {
+  pname = "opentracing";
+  version = "2.4.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a173117e6ef580d55874734d1fa7ecb6f3655160b8b8974a2a1e98e5ec9c840d";
+  };
+
+  propagatedBuildInputs = lib.optional isPy27 futures;
+
+  checkInputs = [ gevent mock pytest tornado ];
+
+  checkPhase = ''
+    pytest
+  '';
+
+  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..2e7666d3ab0b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/openwrt-luci-rpc/default.nix
@@ -0,0 +1,36 @@
+{ buildPythonPackage
+, fetchPypi
+, lib
+, click
+, requests
+, packaging
+}:
+
+with lib;
+
+buildPythonPackage rec {
+  pname = "openwrt-luci-rpc";
+  version = "1.1.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "8074c1ed24cdd1fadc5a99bd63d9313a0a44703714473ed781ed11e7fb45c96f";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py --replace "requests==2.21.0" "requests"
+    substituteInPlace setup.py --replace "packaging==19.1" "packaging"
+  '';
+
+  propagatedBuildInputs = [ click requests packaging ];
+
+  meta = {
+    description = ''
+      Python3 module for interacting with the OpenWrt Luci RPC interface.
+      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/opt-einsum/2.nix b/nixpkgs/pkgs/development/python-modules/opt-einsum/2.nix
new file mode 100644
index 000000000000..41c4df89f4fc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/opt-einsum/2.nix
@@ -0,0 +1,30 @@
+{ buildPythonPackage, fetchPypi, lib, numpy, pytest_4 }:
+
+buildPythonPackage rec {
+  version = "2.3.2";
+  pname = "opt_einsum";
+
+  src = fetchPypi {
+    inherit version pname;
+    sha256 = "0ny3v8x83mzpwmqjdzqhzy2pzwyy4wx01r1h9i29xw3yvas69m6k";
+  };
+
+  checkInputs = [
+    pytest_4
+  ];
+
+  checkPhase = ''
+    pytest
+  '';
+
+  propagatedBuildInputs = [
+    numpy
+  ];
+
+  meta = {
+    description = "Optimizing NumPy's einsum function with order optimization and GPU support.";
+    homepage = "https://optimized-einsum.readthedocs.io";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ teh ];
+  };
+}
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..2ded1dfc1961
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/opt-einsum/default.nix
@@ -0,0 +1,26 @@
+{ buildPythonPackage, fetchPypi, lib, numpy, pytest_4 }:
+
+buildPythonPackage rec {
+  version = "3.3.0";
+  pname = "opt_einsum";
+
+  src = fetchPypi {
+    inherit version pname;
+    sha256 = "0jb5lia0q742d1713jk33vlj41y61sf52j6pgk7pvhxvfxglgxjr";
+  };
+
+  propagatedBuildInputs = [ numpy ];
+
+  checkInputs = [ pytest_4 ];
+
+  checkPhase = ''
+    pytest
+  '';
+
+  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/optuna/default.nix b/nixpkgs/pkgs/development/python-modules/optuna/default.nix
new file mode 100644
index 000000000000..aa61b18291d6
--- /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 = "0.19.0";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "optuna";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "179x2lsckpmkrkkdnvvbzky86g1ba882z677qwbayhsc835wbp0y";
+  };
+
+  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..7546566cb3aa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ordered-set/default.nix
@@ -0,0 +1,24 @@
+{ buildPythonPackage, fetchPypi, lib, isPy27, pytest }:
+
+buildPythonPackage rec {
+  pname = "ordered-set";
+  version = "4.0.2";
+  disabled = isPy27;
+
+  checkInputs = [ pytest ];
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "159syfbqnwqnivzjfn3x7ak3xwrxmnzbji7c2qhj1jjv0pgv54xs";
+  };
+
+  checkPhase = ''
+    py.test test.py
+  '';
+
+  meta = {
+    description = "A MutableSet that remembers its order, so that every entry has an index.";
+    license = lib.licenses.mit;
+    maintainers = [ lib.maintainers.MostAwesomeDude ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ordereddict/default.nix b/nixpkgs/pkgs/development/python-modules/ordereddict/default.nix
new file mode 100644
index 000000000000..e2931840a66a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ordereddict/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "ordereddict";
+  version = "1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "07qvy11nvgxpzarrni3wrww3vpc9yafgi2bch4j2vvvc42nb8d8w";
+  };
+
+  meta = with lib; {
+    description = "A drop-in substitute for Py2.7's new collections.OrderedDict that works in Python 2.4-2.6";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+
+}
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..1cd0f648bd3e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/orderedmultidict/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv, 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..aced6cf08536
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/orderedset/default.nix
@@ -0,0 +1,18 @@
+{ lib, stdenv, 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 ];
+  };
+}
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..872a54076125
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/orm/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, databases
+, typesystem
+, aiosqlite
+, pytestCheckHook
+, pytestcov
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "orm";
+  version = "0.1.5";
+
+  src = fetchFromGitHub {
+    owner = "encode";
+    repo = "orm";
+    rev = version;
+    sha256 = "1g70cr0559iyqfzidwh6n2qq6d4dcnrr4sg0jkn1s4qzka828mj7";
+  };
+
+  propagatedBuildInputs = [
+    databases
+    typesystem
+  ];
+
+  checkInputs = [
+    aiosqlite
+    pytestCheckHook
+    pytestcov
+    typing-extensions
+  ];
+
+  pythonImportsCheck = [ "orm" ];
+
+  meta = with lib; {
+    description = "An async ORM";
+    homepage = "https://github.com/encode/orm";
+    license = licenses.bsd3;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..6209baa144bb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/orvibo/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, click
+, fetchFromGitHub
+, mock
+, pytest-runner
+, pytestCheckHook
+, requests
+, websocket_client
+}:
+
+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/osc/default.nix b/nixpkgs/pkgs/development/python-modules/osc/default.nix
new file mode 100644
index 000000000000..dad78727f2d1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/osc/default.nix
@@ -0,0 +1,40 @@
+{ lib, stdenv, 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; {
+    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/oscrypto/default.nix b/nixpkgs/pkgs/development/python-modules/oscrypto/default.nix
new file mode 100644
index 000000000000..6012398db982
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/oscrypto/default.nix
@@ -0,0 +1,41 @@
+{ buildPythonPackage
+, asn1crypto
+, fetchPypi
+, lib
+, openssl
+}:
+
+buildPythonPackage rec {
+  pname = "oscrypto";
+  version = "1.1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1vlryamwr442w2av8f54ldhls8fqs6678fg60pqbrf5pjy74kg23";
+  };
+
+  testSources = fetchPypi {
+    inherit version;
+    pname = "oscrypto_tests";
+    sha256 = "1crndz647pqdd8148yn3n5l63xwr6qkwa1qarsz59nk3ip0dsyq5";
+  };
+
+  preCheck = ''
+    tar -xf ${testSources}
+    mv oscrypto_tests-${version} tests
+
+    # remove tests that require network
+    sed -e '/TLSTests/d' -e '/TrustListTests/d' -i tests/__init__.py
+  '';
+
+  propagatedBuildInputs = [
+    asn1crypto
+    openssl
+  ];
+
+  meta = with lib; {
+    description = "A compilation-free, always up-to-date encryption library for Python that works on Windows, OS X, Linux and BSD.";
+    homepage = "https://www.snowflake.com/";
+    license = licenses.mit;
+  };
+}
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/osmnx/default.nix b/nixpkgs/pkgs/development/python-modules/osmnx/default.nix
new file mode 100755
index 000000000000..c624e262cf96
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/osmnx/default.nix
@@ -0,0 +1,33 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub, geopandas, descartes, matplotlib, networkx, numpy
+, pandas, requests, Rtree, shapely, pytest, coverage, coveralls, folium, scikitlearn, scipy}:
+
+buildPythonPackage rec {
+  pname = "osmnx";
+  version = "0.9";
+
+  src = fetchFromGitHub {
+    owner  = "gboeing";
+    repo   = pname;
+    rev    = "v${version}";
+    sha256 = "1k3y5kl4k93vxaxyanc040x44s2fyyc3m1ndy2j3kg0037z8ad4z";
+  };
+
+  propagatedBuildInputs = [ geopandas descartes matplotlib networkx numpy pandas requests Rtree shapely folium scikitlearn scipy ];
+
+  checkInputs = [ coverage pytest coveralls ];
+  #Fails when using sandboxing as it requires internet connection, works fine without it
+  doCheck = false;
+
+  #Check phase for the record
+  #checkPhase = ''
+  #  coverage run --source osmnx -m pytest --verbose
+  #'';
+
+  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..981feb388083
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/osmpythontools/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, beautifulsoup4
+, geojson
+, lxml
+, matplotlib
+, numpy
+, pandas
+, ujson
+, xarray
+}:
+
+buildPythonPackage rec {
+  pname = "osmpythontools";
+  version = "0.2.8";
+
+  src = fetchPypi {
+    pname = "OSMPythonTools";
+    inherit version;
+    sha256 = "8a33adbd266127e342d12da755075fae08f398032a6f0909b5e86bef13960a85";
+  };
+
+  propagatedBuildInputs = [
+    beautifulsoup4
+    geojson
+    lxml
+    matplotlib
+    numpy
+    pandas
+    ujson
+    xarray
+  ];
+
+  # no tests included
+  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.gpl3;
+    maintainers = with maintainers; [ das-g ];
+  };
+}
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..1db266e116d4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/osqp/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, cmake
+, future
+, numpy
+, qdldl
+, scipy
+# check inputs
+, pytestCheckHook
+, cvxopt
+}:
+
+buildPythonPackage rec {
+  pname = "osqp";
+  version = "0.6.2.post0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "5f0695f26a3bef0fae91254bc283fab790dcca0064bfe0f425167f9c9e8b4cbc";
+  };
+
+  nativeBuildInputs = [ cmake ];
+  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/outcome/default.nix b/nixpkgs/pkgs/development/python-modules/outcome/default.nix
new file mode 100644
index 000000000000..f03307ead147
--- /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.1.0";
+  disabled = pythonOlder "3.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "e862f01d4e626e63e8f92c38d1f8d5546d3f9cce989263c521b2e7990d186967";
+  };
+
+  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/ovh/default.nix b/nixpkgs/pkgs/development/python-modules/ovh/default.nix
new file mode 100644
index 000000000000..305b03b4d144
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ovh/default.nix
@@ -0,0 +1,24 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "ovh";
+  version = "0.5.0";
+
+  # Needs yanc
+  doCheck = false;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f74d190c4bff0953d76124cb8ed319a8a999138720e42957f0db481ef4746ae8";
+  };
+
+  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/ovito/default.nix b/nixpkgs/pkgs/development/python-modules/ovito/default.nix
new file mode 100644
index 000000000000..a33e5d19b44e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ovito/default.nix
@@ -0,0 +1,42 @@
+{ lib, stdenv
+, fetchFromGitLab
+, cmake
+, ffmpeg
+, netcdf
+, qscintilla
+, zlib
+, boost
+, git
+, fftw
+, hdf5
+, libssh
+, qt5
+, python
+}:
+
+stdenv.mkDerivation rec {
+  version = "3.3.5";
+  pname = "ovito";
+
+  src = fetchFromGitLab {
+    owner = "stuko";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "2tptLK0RU0afSFFE7uzL8bZ5j+nyRyh97ujJAHFh0wQ=";
+  };
+
+  nativeBuildInputs = [ cmake git ];
+  buildInputs = [ ffmpeg netcdf qscintilla zlib boost zlib fftw hdf5 libssh qt5.qtbase qt5.qtsvg ];
+
+  propagatedBuildInputs = with python.pkgs; [ sphinx numpy sip pyqt5 matplotlib ase ];
+
+  meta = with lib; {
+    description = "Scientific visualization and analysis software for atomistic simulation data";
+    homepage = "https://www.ovito.org";
+    license = with licenses; [ gpl3Only mit ];
+    maintainers = with maintainers; [ costrouc ];
+    # ensures not built on hydra
+    # https://github.com/NixOS/nixpkgs/pull/46846#issuecomment-436388048
+    hydraPlatforms = [ ];
+  };
+}
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..92a78ce0cf3f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/owslib/default.nix
@@ -0,0 +1,22 @@
+{ lib, buildPythonPackage, fetchPypi, dateutil, requests, pytz, pyproj , pytest, pyyaml } :
+buildPythonPackage rec {
+  pname = "OWSLib";
+  version = "0.21.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "408d40b3a6a210bcb3f3609b607960eeedaa63ffd574dde7896906691c354814";
+  };
+
+  buildInputs = [ pytest ];
+  propagatedBuildInputs = [ 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..9ea527e06f19
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/oyaml/default.nix
@@ -0,0 +1,41 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, lib
+
+# pythonPackages
+, pytest
+, pyyaml
+}:
+
+buildPythonPackage rec {
+  pname = "oyaml";
+  version = "1.0";
+
+  src = fetchFromGitHub {
+    owner = "wimglenn";
+    repo = "oyaml";
+    rev = "v${version}";
+    sha256 = "0qkj8g87drvjqiqqmz36gyqiczdfcfv8zk96kkifzk4f9dl5f02j";
+  };
+
+  propagatedBuildInputs = [
+    pyyaml
+  ];
+
+  checkInputs = [
+    pytest
+  ];
+
+  checkPhase = ''
+    pytest test_oyaml.py
+  '';
+
+  meta = {
+    description = "Ordered YAML: drop-in replacement for PyYAML which preserves dict ordering";
+    homepage = "https://github.com/wimglenn/oyaml";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [
+      kamadorueda
+    ];
+  };
+}
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..466d3937a1fb
--- /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.3";
+
+  src = fetchFromGitHub {
+    owner = "spatialaudio";
+    repo = "python-pa-ringbuffer";
+    rev = version;
+    sha256 = "0afpydy1l20hd1xncjppjhqa2c8dj5h9nlv4z8m55cs9hc9h1mxv";
+  };
+
+  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/packaging/2.nix b/nixpkgs/pkgs/development/python-modules/packaging/2.nix
new file mode 100644
index 000000000000..5d841eb4fb13
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/packaging/2.nix
@@ -0,0 +1,40 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, pyparsing
+, six
+, pytestCheckHook
+, pretend
+, flit-core
+}:
+
+# We keep 20.4 because it uses setuptools instead of flit-core
+# which requires Python 3 to build a universal wheel.
+
+buildPythonPackage rec {
+  pname = "packaging";
+  version = "20.4";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "4357f74f47b9c12db93624a82154e9b120fa8293699949152b22065d556079f8";
+  };
+
+  propagatedBuildInputs = [ pyparsing six ];
+
+  checkInputs = [
+    pytestCheckHook
+    pretend
+  ];
+
+  # Prevent circular dependency
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Core utilities for Python packages";
+    homepage = "https://github.com/pypa/packaging";
+    license = [ licenses.bsd2 licenses.asl20 ];
+    maintainers = with maintainers; [ bennofs ];
+  };
+}
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..973e516f5a90
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/packaging/default.nix
@@ -0,0 +1,45 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, pyparsing
+, six
+, pytestCheckHook
+, pretend
+, flit-core
+}:
+
+buildPythonPackage rec {
+  pname = "packaging";
+  version = "20.7";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "Ba87uF0yA3fbKBzyVKsFDhp+vL9UEGhamkB+GKH4EjY=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [ pyparsing six ];
+
+  checkInputs = [
+    pytestCheckHook
+    pretend
+  ];
+
+  checkPhase = ''
+    py.test tests
+  '';
+
+  # Prevent circular dependency
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Core utilities for Python packages";
+    homepage = "https://github.com/pypa/packaging";
+    license = [ licenses.bsd2 licenses.asl20 ];
+    maintainers = with maintainers; [ bennofs ];
+  };
+}
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..1552148ae37b
--- /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
+, pytestrunner
+, requests-mock
+}:
+
+buildPythonPackage rec {
+  pname = "packet-python";
+  version = "1.43.1";
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "e333fb5ce45a3f283ddeb6261d061b39328b82eb440a89233fa08ce3fec2fcf0";
+  };
+  nativeBuildInputs = [ pytestrunner ];
+  propagatedBuildInputs = [ requests ];
+  checkInputs = [
+    pytest
+    pytestrunner
+    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/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..5daa60f475d3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pagelabels/default.nix
@@ -0,0 +1,23 @@
+{ lib, stdenv, 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/pagerduty/default.nix b/nixpkgs/pkgs/development/python-modules/pagerduty/default.nix
new file mode 100644
index 000000000000..ebe2c8b5854d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pagerduty/default.nix
@@ -0,0 +1,23 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "pagerduty";
+  version = "0.2.1";
+  disabled = isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "e8c237239d3ffb061069aa04fc5b3d8ae4fb0af16a9713fe0977f02261d323e9";
+  };
+
+  meta = with lib; {
+    homepage = "https://github.com/samuel/python-pagerduty";
+    description = "Library for the PagerDuty service API";
+    license = licenses.bsd0;
+  };
+
+}
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..92f8f5d90f10
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/paho-mqtt/default.nix
@@ -0,0 +1,31 @@
+{ lib, buildPythonPackage, fetchFromGitHub, isPy3k
+, stdenv, pytestrunner, pytest, mock }:
+
+buildPythonPackage rec {
+  pname = "paho-mqtt";
+  version = "1.5.1";
+
+  # No tests in PyPI tarball
+  src = fetchFromGitHub {
+    owner = "eclipse";
+    repo = "paho.mqtt.python";
+    rev = "v${version}";
+    sha256 = "1y537i6zxkjkmi80w5rvd18npz1jm5246i2x8p3q7ycx94i8ixs0";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py --replace "pylama" ""
+    substituteInPlace setup.cfg --replace "--pylama" ""
+  '';
+
+  checkInputs = [ pytestrunner pytest ] ++ lib.optional (!isPy3k) mock;
+
+  doCheck = !stdenv.isDarwin;
+
+  meta = with lib; {
+    homepage = "https://eclipse.org/paho";
+    description = "MQTT version 3.1.1 client class";
+    license = licenses.epl10;
+    maintainers = with maintainers; [ mog dotlambda ];
+  };
+}
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..d61973aa3bfa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/palettable/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv, 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..2e8e4500f247
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pamqp/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, mock
+, nose
+, pep8
+, pylint
+, mccabe
+}:
+
+buildPythonPackage rec {
+  version = "3.0.1";
+  pname = "pamqp";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0a9b49bde3f554ec49b47ebdb789133979985f24d5f4698935ed589a2d4392a4";
+  };
+
+  buildInputs = [ mock nose pep8 pylint mccabe ];
+
+  meta = with lib; {
+    description = "RabbitMQ Focused AMQP low-level library";
+    homepage = "https://pypi.python.org/pypi/pamqp";
+    license = licenses.bsd3;
+  };
+
+}
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..c4bf9c140df3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pandas-datareader/default.nix
@@ -0,0 +1,34 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, isPy27
+, pandas
+, lxml
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "pandas-datareader";
+  version = "0.9.0";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b2cbc1e16a6ab9ff1ed167ae2ea92839beab9a20823bd00bdfb78155fa04f891";
+  };
+
+  # 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/2.nix b/nixpkgs/pkgs/development/python-modules/pandas/2.nix
new file mode 100644
index 000000000000..936a3db296ec
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pandas/2.nix
@@ -0,0 +1,119 @@
+# Python 2 expression
+
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python
+, stdenv
+, pytest
+, glibcLocales
+, cython
+, dateutil
+, scipy
+, moto
+, numexpr
+, pytz
+, xlrd
+, bottleneck
+, sqlalchemy
+, lxml
+, html5lib
+, beautifulsoup4
+, hypothesis
+, openpyxl
+, tables
+, xlwt
+, runtimeShell
+, libcxx ? null
+}:
+
+buildPythonPackage rec {
+  pname = "pandas";
+  version = "0.24.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "18imlm8xbhcbwy4wa957a1fkamrcb0z988z006jpfda3ki09z4ag";
+  };
+
+  checkInputs = [ pytest glibcLocales moto hypothesis ];
+
+  nativeBuildInputs = [ cython ];
+  buildInputs = lib.optional stdenv.isDarwin libcxx;
+  propagatedBuildInputs = [
+    dateutil
+    scipy
+    numexpr
+    pytz
+    xlrd
+    bottleneck
+    sqlalchemy
+    lxml
+    html5lib
+    beautifulsoup4
+    openpyxl
+    tables
+    xlwt
+  ];
+
+  # For OSX, we need to add a dependency on libcxx, which provides
+  # `complex.h` and other libraries that pandas depends on to build.
+  postPatch = lib.optionalString stdenv.isDarwin ''
+    cpp_sdk="${libcxx}/include/c++/v1";
+    echo "Adding $cpp_sdk to the setup.py common_include variable"
+    substituteInPlace setup.py \
+      --replace "['pandas/src/klib', 'pandas/src']" \
+                "['pandas/src/klib', 'pandas/src', '$cpp_sdk']"
+  '';
+
+
+  disabledTests = lib.concatMapStringsSep " and " (s: "not " + s) ([
+    # since dateutil 0.6.0 the following fails: test_fallback_plural, test_ambiguous_flags, test_ambiguous_compat
+    # was supposed to be solved by https://github.com/dateutil/dateutil/issues/321, but is not the case
+    "test_fallback_plural"
+    "test_ambiguous_flags"
+    "test_ambiguous_compat"
+    # Locale-related
+    "test_names"
+    "test_dt_accessor_datetime_name_accessors"
+    "test_datetime_name_accessors"
+    # Can't import from test folder
+    "test_oo_optimizable"
+    # Disable IO related tests because IO data is no longer distributed
+    "io"
+    # KeyError Timestamp
+    "test_to_excel"
+  ] ++ lib.optionals stdenv.isDarwin [
+    "test_locale"
+    "test_clipboard"
+  ]);
+
+  doCheck = !stdenv.isAarch64; # upstream doesn't test this architecture
+
+  checkPhase = ''
+    runHook preCheck
+  ''
+  # 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
+  '' + ''
+    LC_ALL="en_US.UTF-8" py.test $out/${python.sitePackages}/pandas --skip-slow --skip-network -k "$disabledTests"
+    runHook postCheck
+  '';
+
+  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/";
+    description = "Python Data Analysis Library";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ raskin knedlsepp ];
+    platforms = platforms.unix;
+  };
+}
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..ab70a7782adf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pandas/default.nix
@@ -0,0 +1,146 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, python
+, isPy38
+, beautifulsoup4
+, bottleneck
+, cython
+, dateutil
+, html5lib
+, lxml
+, numexpr
+, openpyxl
+, pytz
+, sqlalchemy
+, scipy
+, tables
+, xlrd
+, xlwt
+# Test Inputs
+, glibcLocales
+, hypothesis
+, moto
+, pytestCheckHook
+# Darwin inputs
+, runtimeShell
+, libcxx ? null
+}:
+
+buildPythonPackage rec {
+  pname = "pandas";
+  version = "1.1.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "06vhk75hmzgv1sfbjzgnsw9x10h7y6bd6s6z7d6lfnn7wcgc83zi";
+  };
+
+  nativeBuildInputs = [ cython ];
+  buildInputs = lib.optional stdenv.isDarwin libcxx;
+  propagatedBuildInputs = [
+    beautifulsoup4
+    bottleneck
+    dateutil
+    html5lib
+    numexpr
+    lxml
+    openpyxl
+    pytz
+    scipy
+    sqlalchemy
+    tables
+    xlrd
+    xlwt
+  ];
+
+  checkInputs = [ pytestCheckHook glibcLocales moto hypothesis ];
+
+  # doesn't work with -Werror,-Wunused-command-line-argument
+  # https://github.com/NixOS/nixpkgs/issues/39687
+  hardeningDisable = lib.optional stdenv.cc.isClang "strictoverflow";
+
+  # For OSX, we need to add a dependency on libcxx, which provides
+  # `complex.h` and other libraries that pandas depends on to build.
+  postPatch = lib.optionalString stdenv.isDarwin ''
+    cpp_sdk="${libcxx}/include/c++/v1";
+    echo "Adding $cpp_sdk to the setup.py common_include variable"
+    substituteInPlace setup.py \
+      --replace "['pandas/src/klib', 'pandas/src']" \
+                "['pandas/src/klib', 'pandas/src', '$cpp_sdk']"
+  '';
+
+  # Parallel Cythonization is broken in Python 3.8 on Darwin. Fixed in the next
+  # release. https://github.com/pandas-dev/pandas/pull/30862
+  setupPyBuildFlags = lib.optionals (!(isPy38 && stdenv.isDarwin)) [
+    # As suggested by
+    # https://pandas.pydata.org/pandas-docs/stable/development/contributing.html#creating-a-python-environment
+    "--parallel=$NIX_BUILD_CORES"
+  ];
+
+  doCheck = !stdenv.isAarch64; # upstream doesn't test this architecture
+
+  pytestFlagsArray = [
+    "--skip-slow"
+    "--skip-network"
+  ];
+  disabledTests = [
+    # since dateutil 0.6.0 the following fails: test_fallback_plural, test_ambiguous_flags, test_ambiguous_compat
+    # was supposed to be solved by https://github.com/dateutil/dateutil/issues/321, but is not the case
+    "test_fallback_plural"
+    "test_ambiguous_flags"
+    "test_ambiguous_compat"
+    # Locale-related
+    "test_names"
+    "test_dt_accessor_datetime_name_accessors"
+    "test_datetime_name_accessors"
+    # Can't import from test folder
+    "test_oo_optimizable"
+    # Disable IO related tests because IO data is no longer distributed
+    "io"
+    # KeyError Timestamp
+    "test_to_excel"
+    # ordering logic has changed
+    "numpy_ufuncs_other"
+    "order_without_freq"
+    # tries to import from pandas.tests post install
+    "util_in_top_level"
+    # Fails with 1.0.5
+    "test_constructor_list_frames"
+    "test_constructor_with_embedded_frames"
+    # tries to import compiled C extension locally
+    "test_missing_required_dependency"
+  ] ++ lib.optionals stdenv.isDarwin [
+    "test_locale"
+    "test_clipboard"
+  ];
+
+  # 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
+  '';
+
+  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/pandocfilters/default.nix b/nixpkgs/pkgs/development/python-modules/pandocfilters/default.nix
new file mode 100644
index 000000000000..d31bc2657c93
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pandocfilters/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  version = "1.4.3";
+  pname = "pandocfilters";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "bc63fbb50534b4b1f8ebe1860889289e8af94a23bff7445259592df25a3906eb";
+  };
+
+  # 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..10dafc0072a3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/panel/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, bokeh
+, param
+, pyviz-comms
+, markdown
+, pyct
+, testpath
+, tqdm
+}:
+
+buildPythonPackage rec {
+  pname = "panel";
+  version = "0.9.7";
+  # Version 10 attempts to download models from the web during build-time
+  # https://github.com/holoviz/panel/issues/1819
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "2e86d82bdd5e7664bf49558eedad62b664d5403ec9e422e5ddfcf69e3bd77318";
+  };
+
+  propagatedBuildInputs = [
+    bokeh
+    param
+    pyviz-comms
+    markdown
+    pyct
+    testpath
+    tqdm
+  ];
+
+  # infinite recursion in test dependencies (hvplot)
+  doCheck = false;
+
+  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/papermill/default.nix b/nixpkgs/pkgs/development/python-modules/papermill/default.nix
new file mode 100644
index 000000000000..56536de8446b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/papermill/default.nix
@@ -0,0 +1,74 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, ansiwrap
+, click
+, future
+, pyyaml
+, nbformat
+, nbconvert
+, nbclient
+, six
+, tqdm
+, jupyter_client
+, requests
+, entrypoints
+, tenacity
+, futures
+, black
+, backports_tempfile
+, isPy27
+, pytest
+, pytestcov
+, pytest-mock
+}:
+
+buildPythonPackage rec {
+  pname = "papermill";
+  version = "2.2.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1c452b1c5a9ab52b94c99d8b7705ae7173f6aa88a3d28a5d30cffba48a46f5b6";
+  };
+
+  propagatedBuildInputs = [
+    ansiwrap
+    click
+    future
+    pyyaml
+    nbformat
+    nbconvert
+    nbclient
+    six
+    tqdm
+    jupyter_client
+    requests
+    entrypoints
+    tenacity
+    black
+  ] ++ lib.optionals isPy27 [
+    futures
+    backports_tempfile
+  ];
+
+  checkInputs = [
+    pytest
+    pytestcov
+    pytest-mock
+  ];
+
+  checkPhase = ''
+    HOME=$(mktemp -d) pytest
+  '';
+
+  # the test suite depends on cloud resources azure/aws
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Parametrize and run Jupyter and nteract Notebooks";
+    homepage = "https://github.com/nteract/papermill";
+    license = licenses.bsd3;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/paperspace/default.nix b/nixpkgs/pkgs/development/python-modules/paperspace/default.nix
new file mode 100644
index 000000000000..4553b253819f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/paperspace/default.nix
@@ -0,0 +1,31 @@
+{ lib, stdenv, fetchPypi, buildPythonPackage
+, boto3, requests, gradient_statsd, terminaltables
+, click-completion , click-didyoumean, click-help-colors
+, colorama, requests_toolbelt, gradient_sdk, progressbar2
+}:
+
+buildPythonPackage rec {
+  pname = "paperspace";
+  version = "0.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "7959305128fea6da8ca0cdc528783a89859dacb9b54bf8eb89fd04a518872191";
+  };
+
+  propagatedBuildInputs = [ boto3 requests gradient_statsd terminaltables
+    click-completion click-didyoumean click-help-colors requests_toolbelt
+    colorama gradient_sdk progressbar2
+  ];
+
+  # tries to use /homeless-shelter to mimic container usage, etc
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Python API for Paperspace Cloud";
+    homepage    = "https://paperspace.com";
+    license     = licenses.isc;
+    platforms   = platforms.unix;
+    maintainers = with maintainers; [ thoughtpolice ];
+  };
+}
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..8750b96f5c90
--- /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.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "13k6mw2nq923zazs77hpmh2s96v6zv13g7p89510qqkvp6fiml1v";
+  };
+
+  # 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..93eafff6c93b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/papis/default.nix
@@ -0,0 +1,67 @@
+{ lib, buildPythonPackage, fetchFromGitHub, xdg_utils
+, requests, filetype, pyparsing, configparser, arxiv2bib
+, pyyaml, chardet, beautifulsoup4, colorama, bibtexparser
+, click, python-slugify, habanero, isbnlib, typing-extensions
+, prompt_toolkit, pygments, stevedore, tqdm, lxml
+, python-doi, isPy3k, pythonOlder, pytestcov
+#, optional, dependencies
+, whoosh, pytest
+, stdenv
+}:
+
+buildPythonPackage rec {
+  pname = "papis";
+  version = "0.11.1";
+  disabled = !isPy3k;
+
+  # Missing tests on Pypi
+  src = fetchFromGitHub {
+    owner = "papis";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0bbkjyw1fsvvp0380l404h2lys8ib4xqga5s6401k1y1hld28nl6";
+  };
+
+  propagatedBuildInputs = [
+    requests filetype pyparsing configparser arxiv2bib
+    pyyaml chardet beautifulsoup4 colorama bibtexparser
+    click python-slugify habanero isbnlib
+    prompt_toolkit pygments typing-extensions
+    stevedore tqdm lxml
+    python-doi
+    # optional dependencies
+    whoosh
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "lxml<=4.3.5" "lxml~=4.3" \
+      --replace "isbnlib>=3.9.1,<3.10" "isbnlib~=3.9" \
+      --replace "python-slugify>=1.2.6,<4" "python-slugify"
+  '';
+
+  # pytest seems to hang with python3.8
+  doCheck = !stdenv.isDarwin && pythonOlder "3.8";
+
+  checkInputs = ([
+    pytest pytestcov
+  ]) ++ [
+    xdg_utils
+  ];
+
+  # most of the downloader tests and 4 other tests require a network connection
+  # test_export_yaml and test_citations check for the exact output produced by pyyaml 3.x and
+  # fail with 5.x
+  checkPhase = ''
+    HOME=$(mktemp -d) pytest papis tests --ignore tests/downloaders \
+      -k "not test_get_data and not test_doi_to_data and not test_general and not get_document_url \
+      and not test_validate_arxivid and not test_downloader_getter and not match"
+  '';
+
+  meta = {
+    description = "Powerful command-line document and bibliography manager";
+    homepage = "https://papis.readthedocs.io/en/latest/";
+    license = lib.licenses.gpl3;
+    maintainers = with lib.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..9f6d78a8ecbe
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/param/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, flake8
+, nose
+}:
+
+buildPythonPackage rec {
+  pname = "param";
+  version = "1.10.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a284c1b42aff6367e8eea2f649d4f3f70a9f16c6f17d8ad672a31ff36089f995";
+  };
+
+  checkInputs = [ flake8 nose ];
+
+  # tests not included with pypi release
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Declarative Python programming using Parameters";
+    homepage = "https://github.com/pyviz/param";
+    license = licenses.bsd3;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..16925bd1286b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/parameterized/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv, fetchPypi, buildPythonPackage, nose, mock, glibcLocales, isPy3k, isPy38 }:
+
+buildPythonPackage rec {
+  pname = "parameterized";
+  version = "0.7.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "190f8cc7230eee0b56b30d7f074fd4d165f7c45e6077582d0813c8557e738490";
+  };
+
+  # Tests require some python3-isms but code works without.
+  # python38 is not fully supported yet
+  doCheck = isPy3k && (!isPy38);
+
+  checkInputs = [ nose mock glibcLocales ];
+
+  checkPhase = ''
+    LC_ALL="en_US.UTF-8" nosetests -v
+  '';
+
+  meta = with lib; {
+    description = "Parameterized testing with any Python test framework";
+    homepage = "https://pypi.python.org/pypi/parameterized";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ma27 ];
+  };
+}
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..41951f1d8932
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/paramiko/default.nix
@@ -0,0 +1,57 @@
+{ pkgs
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, cryptography
+, bcrypt
+, invoke
+, pynacl
+, pyasn1
+, pytest
+, pytest-relaxed
+, mock
+}:
+
+buildPythonPackage rec {
+  pname = "paramiko";
+  version = "2.7.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "920492895db8013f6cc0179293147f830b8c7b21fdfc839b6bad760c27459d9f";
+  };
+
+  patches = [
+    # fix RSA key loading with cryptography 3.1, remove >2.7.1
+    (fetchpatch {
+      url = "https://github.com/paramiko/paramiko/commit/81064206bf3cec2ca4372257ff138481e1227b91.patch";
+      sha256 = "01b87ffgyvd6rilp1w1kf7lk29z706ch39nwl21ifklqpjhmazww";
+    })
+  ];
+  checkInputs = [ invoke pytest mock pytest-relaxed ];
+  propagatedBuildInputs = [ bcrypt cryptography pynacl pyasn1 ];
+
+  __darwinAllowLocalNetworking = true;
+
+  # 2 sftp tests fail (skip for now)
+  # test_config relies on artifacts to be to downloaded
+  # RSA tests don't have valid keys
+  checkPhase = ''
+    pytest tests \
+      --ignore=tests/test_sftp.py \
+      --ignore=tests/test_config.py
+  '';
+
+  meta = with pkgs.lib; {
+    homepage = "https://github.com/paramiko/paramiko/";
+    description = "Native Python SSHv2 protocol library";
+    license = licenses.lgpl21Plus;
+
+    longDescription = ''
+      This is a 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.
+    '';
+  };
+}
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..65cc79745caa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/paramz/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv, 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..45f4a66f2605
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/parfive/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, tqdm
+, aiohttp
+, pytest
+, setuptools_scm
+, pytest-localserver
+, pytest-socket
+, pytest-asyncio
+, aioftp
+}:
+
+buildPythonPackage rec {
+  pname = "parfive";
+  version = "1.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "118a0994bbb9536fd4574995a8485b6c4b97db247c55bc86ae4f4ae8fd9b0add";
+  };
+
+  buildInputs = [
+    setuptools_scm
+  ];
+
+  propagatedBuildInputs = [
+    tqdm
+    aiohttp
+    aioftp
+  ];
+
+  checkInputs = [
+    pytest
+    pytest-localserver
+    pytest-socket
+    pytest-asyncio
+  ];
+
+  checkPhase = ''
+    # these two tests require network connection
+    pytest parfive -k "not test_ftp and not test_ftp_http"
+  '';
+
+  meta = with lib; {
+    description = "A HTTP and FTP parallel file downloader";
+    homepage = "https://parfive.readthedocs.io/";
+    license = licenses.mit;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..d338a351e54b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/parse-type/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv, fetchPypi
+, buildPythonPackage, pythonOlder
+, pytest, pytestrunner
+, parse, six, enum34
+}:
+
+buildPythonPackage rec {
+  pname = "parse_type";
+  version = "0.5.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "02wclgiqky06y36b3q07b7ngpks5j0gmgl6n71ac2j2hscc0nsbz";
+  };
+
+  checkInputs = [ pytest pytestrunner ];
+  propagatedBuildInputs = [ parse six ] ++ lib.optional (pythonOlder "3.4") enum34;
+
+  checkPhase = ''
+    py.test tests
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/jenisys/parse_type";
+    description = "Simplifies to build parse types based on the parse module";
+    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..d72e607bc410
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/parse/default.nix
@@ -0,0 +1,23 @@
+{ lib, stdenv, fetchPypi
+, buildPythonPackage, python
+}:
+buildPythonPackage rec {
+  pname = "parse";
+  version = "1.18.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "91666032d6723dc5905248417ef0dc9e4c51df9526aaeef271eacad6491f06a4";
+  };
+
+  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..1f98940fff06
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/parsedatetime/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, pytest
+, pytestrunner
+, future
+}:
+
+buildPythonPackage rec {
+  pname = "parsedatetime";
+  version = "2.6";
+  disabled = isPy27; # no longer compatible with icu package
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "4cb368fbb18a0b7231f4d76119165451c8d2e35951455dfee97c62a87b04d455";
+  };
+
+  buildInputs = [ pytest pytestrunner ];
+  propagatedBuildInputs = [ future ];
+
+  meta = with lib; {
+    description = "Parse human-readable date/time text";
+    homepage = "https://github.com/bear/parsedatetime";
+    license = licenses.asl20;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/parsel/default.nix b/nixpkgs/pkgs/development/python-modules/parsel/default.nix
new file mode 100644
index 000000000000..319f83f72755
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/parsel/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest
+, pytestrunner
+, functools32
+, six
+, w3lib
+, lxml
+, cssselect
+, isPy27
+}:
+
+buildPythonPackage rec {
+  pname = "parsel";
+  version = "1.6.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0yawf9r3r863lwxj0n89i7h3n8xjbsl5b7n6xg76r68scl5yzvvh";
+  };
+
+  checkInputs = [ pytest pytestrunner ];
+  propagatedBuildInputs = [ six w3lib lxml cssselect ] ++ lib.optionals isPy27 [ functools32 ];
+
+  checkPhase = ''
+    py.test
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/scrapy/parsel";
+    description = "Parsel is a library to extract data from HTML and XML using XPath and CSS selectors";
+    license = licenses.bsd3;
+  };
+
+}
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..d41953246db9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/parsimonious/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, nose
+, six
+}:
+
+buildPythonPackage rec {
+  version = "0.8.1";
+  pname = "parsimonious";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "3add338892d580e0cb3b1a39e4a1b427ff9f687858fdd61097053742391a9f6b";
+  };
+
+  checkInputs = [ nose ];
+  propagatedBuildInputs = [ six ];
+
+  # performance tests tend to fail sometimes
+  NOSE_EXCLUDE = "test_benchmarks";
+
+  meta = with lib; {
+    homepage = "https://github.com/erikrose/parsimonious";
+    description = "Fast arbitrary-lookahead parser written in pure Python";
+    license = licenses.mit;
+  };
+
+}
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..f9a87fa5f65f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/parso/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "parso";
+  version = "0.8.0";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "2b6db14759c528d857eeb9eac559c2166b2554548af39f5198bdfb976f72aa64";
+  };
+
+  checkInputs = [ pytestCheckHook ];
+
+  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..ab4aeba84b69
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/parsy/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, fetchPypi, pythonOlder, pytest }:
+
+buildPythonPackage rec {
+  pname = "parsy";
+  version = "1.3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "bfc941ea5a69e6ac16bd4f7d9f807bbc17e35edd8b95bcd2499a25b059359012";
+  };
+
+  checkInputs = [ pytest ];
+
+  checkPhase = ''
+    py.test test/
+  '';
+
+  disabled = pythonOlder "3.4";
+
+  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; [ edibopp ];
+  };
+}
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..584b4b4315c7
--- /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.1.0";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "6e258bf0810701407ad1410d63d1a15cfd7b773fd9efe555dac6bb82cc8832b0";
+  };
+
+  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/parver/default.nix b/nixpkgs/pkgs/development/python-modules/parver/default.nix
new file mode 100644
index 000000000000..268e90020100
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/parver/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, six
+, attrs
+, pytest
+, hypothesis
+, pretend
+, arpeggio
+}:
+
+buildPythonPackage rec {
+  pname = "parver";
+  version = "0.3.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "c902e0653bcce927cc156a7fd9b3a51924cbce3bf3d0bfd49fc282bfd0c5dfd3";
+  };
+
+  propagatedBuildInputs = [ six attrs arpeggio ];
+  checkInputs = [ pytest hypothesis pretend ];
+
+  meta = {
+    description = "parver allows parsing and manipulation of PEP 440 version numbers.";
+    license = lib.licenses.mit;
+  };
+}
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..316abb2ac32c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/passlib/default.nix
@@ -0,0 +1,24 @@
+{ buildPythonPackage
+, fetchPypi
+, nose
+, bcrypt
+, argon2_cffi
+}:
+
+buildPythonPackage rec {
+  pname = "passlib";
+  version = "1.7.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "defd50f72b65c5402ab2c573830a6978e5f202ad0d984793c8dde2c4152ebe04";
+  };
+
+  checkInputs = [ nose ];
+  propagatedBuildInputs = [ bcrypt argon2_cffi ];
+
+  meta = {
+    description = "A password hashing library for Python";
+    homepage    = "https://code.google.com/p/passlib/";
+  };
+}
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..a29deed503ed
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/paste/default.nix
@@ -0,0 +1,34 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, six
+, pytestrunner
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "paste";
+  version = "3.5.0";
+
+  src = fetchPypi {
+    pname = "Paste";
+    inherit version;
+    sha256 = "17f3zppjjprs2jnklvzkz23mh9jdn6b1f445mvrjdm4ivi15q28v";
+  };
+
+  propagatedBuildInputs = [ six ];
+
+  checkInputs = [ pytestrunner pytest ];
+
+  # Certain tests require network
+  checkPhase = ''
+    py.test -k "not test_cgiapp and not test_proxy"
+  '';
+
+  meta = with lib; {
+    description = "Tools for using a Web Server Gateway Interface stack";
+    homepage = "http://pythonpaste.org/";
+    license = licenses.mit;
+  };
+
+}
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..950b232fa7e4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pastedeploy/default.nix
@@ -0,0 +1,31 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, pytestrunner
+, pytest
+}:
+
+buildPythonPackage rec {
+  version = "2.1.1";
+  pname = "PasteDeploy";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "6dead6ab9823a85d585ef27f878bc647f787edb9ca8da0716aa9f1261b464817";
+  };
+
+  buildInputs = [ pytestrunner ];
+
+  checkInputs = [ pytest ];
+
+  # no tests in PyPI tarball
+  # should be included with versions > 2.0.1
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Load, configure, and compose WSGI applications and servers";
+    homepage = "http://pythonpaste.org/deploy/";
+    license = licenses.mit;
+  };
+
+}
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..a8eb5396fa2c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pastel/default.nix
@@ -0,0 +1,23 @@
+{ lib, buildPythonPackage, fetchPypi, poetry, 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..57dbb7b9352e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pastescript/default.nix
@@ -0,0 +1,31 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, nose
+, six
+, paste
+, PasteDeploy
+, cheetah
+}:
+
+buildPythonPackage rec {
+  version = "3.2.0";
+  pname = "PasteScript";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "9b0f5c0f1c6a510a353fa7c3dc4fdaab9071462d60d24573de76a001fbc172ac";
+  };
+
+  buildInputs = [ nose ];
+  propagatedBuildInputs = [ six paste PasteDeploy cheetah ];
+
+  doCheck = false;
+
+  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;
+  };
+
+}
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..96ed85d7bcee
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/patator/default.nix
@@ -0,0 +1,47 @@
+{ lib, stdenv, 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..981dc067fe7e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/patch-ng/default.nix
@@ -0,0 +1,22 @@
+{ lib, stdenv
+, 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..8d7e78c6c27c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/patch/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv
+, 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..9512b0eb0b88
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/path-and-address/default.nix
@@ -0,0 +1,31 @@
+{ lib, stdenv
+, 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.py/2.nix b/nixpkgs/pkgs/development/python-modules/path.py/2.nix
new file mode 100644
index 000000000000..fb4ff20b7076
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/path.py/2.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools_scm
+, pytest
+, pytest-flake8
+, glibcLocales
+, packaging
+, isPy27
+, backports_os
+, importlib-metadata
+}:
+
+buildPythonPackage rec {
+  pname = "path.py";
+  version = "11.5.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "de7cd643affbc23e56533a6e8d551ecdee4983501a08c24e4e71565202d8cdaa";
+  };
+
+  checkInputs = [ pytest pytest-flake8 glibcLocales packaging ];
+  buildInputs = [ setuptools_scm ];
+  propagatedBuildInputs = [
+    importlib-metadata
+  ] ++ lib.optional isPy27 backports_os
+  ;
+
+  LC_ALL = "en_US.UTF-8";
+
+  meta = {
+    description = "A module wrapper for os.path";
+    homepage = "https://github.com/jaraco/path.py";
+    license = lib.licenses.mit;
+  };
+
+  checkPhase = ''
+    # ignore performance test which may fail when the system is under load
+    py.test -v -k 'not TestPerformance'
+  '';
+}
diff --git a/nixpkgs/pkgs/development/python-modules/path.py/default.nix b/nixpkgs/pkgs/development/python-modules/path.py/default.nix
new file mode 100644
index 000000000000..56e856cff9af
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/path.py/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools_scm
+, pytestCheckHook
+, pytest-flake8
+, glibcLocales
+, packaging
+, isPy27
+, isPy38
+, backports_os
+, importlib-metadata
+, fetchpatch
+}:
+
+buildPythonPackage rec {
+  pname = "path.py";
+  version = "12.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "9f2169633403aa0423f6ec000e8701dd1819526c62465f5043952f92527fea0f";
+  };
+
+  checkInputs = [ pytestCheckHook pytest-flake8 glibcLocales packaging ];
+  buildInputs = [ setuptools_scm ];
+  propagatedBuildInputs = [
+    importlib-metadata
+  ] ++ lib.optional isPy27 backports_os
+  ;
+
+  LC_ALL = "en_US.UTF-8";
+
+  meta = {
+    description = "A module wrapper for os.path";
+    homepage = "https://github.com/jaraco/path.py";
+    license = lib.licenses.mit;
+  };
+
+  # ignore performance test which may fail when the system is under load
+  # test_version fails with 3.8 https://github.com/jaraco/path.py/issues/172
+  disabledTests = [ "TestPerformance" ] ++ lib.optionals isPy38 [ "test_version"];
+
+  dontUseSetuptoolsCheck = true;
+
+  patches = [
+    (fetchpatch {
+      url = "https://github.com/jaraco/path.py/commit/02eb16f0eb2cdc0015972ce963357aaa1cd0b84b.patch";
+      sha256 = "0bqa8vjwil7jn35a6984adcm24pvv3pjkhszv10qv6yr442d1mk9";
+    })
+  ];
+
+}
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..6e04f2e7a030
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pathlib2/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, six
+, pythonOlder
+, scandir
+, glibcLocales
+, mock
+}:
+
+buildPythonPackage rec {
+  pname = "pathlib2";
+  version = "2.3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "6cd9a47b597b37cc57de1c05e56fb1a1c9cc9fab04fe78c29acd090418529868";
+  };
+
+  propagatedBuildInputs = [ six ] ++ lib.optional (pythonOlder "3.5") scandir;
+  checkInputs = [ glibcLocales ] ++ lib.optional (pythonOlder "3.3") mock;
+
+  preCheck = ''
+    export LC_ALL="en_US.UTF-8"
+  '';
+
+  meta = {
+    description = "This module offers classes representing filesystem paths with semantics appropriate for different operating systems.";
+    homepage = "https://pypi.python.org/pypi/pathlib2/";
+    license = with lib.licenses; [ mit ];
+  };
+}
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..778070906022
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pathos/default.nix
@@ -0,0 +1,30 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, dill
+, pox
+, ppft
+, multiprocess
+}:
+
+buildPythonPackage rec {
+  pname = "pathos";
+  version = "0.2.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "21ae2cb1d5a76dcf57d5fe93ae8719c7339f467e246163650c08ccf35b87c846";
+  };
+
+  propagatedBuildInputs = [ dill pox ppft multiprocess ];
+
+  # Require network
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Parallel graph management and execution in heterogeneous computing";
+    homepage = "https://github.com/uqfoundation/pathos/";
+    license = licenses.bsd3;
+  };
+
+}
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..cd51747d5678
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pathspec/default.nix
@@ -0,0 +1,21 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname   = "pathspec";
+  version = "0.8.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "86379d6b86d75816baba717e64b1a3a3469deb93bb76d613c9ce79edc5cb68fd";
+  };
+
+  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..57fff82a81d7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pathtools/default.nix
@@ -0,0 +1,22 @@
+{ lib, stdenv
+, 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/patiencediff/default.nix b/nixpkgs/pkgs/development/python-modules/patiencediff/default.nix
new file mode 100644
index 000000000000..921fbe4c4312
--- /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.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0nm2242xgg59l06m54rzxp41aly3lxjh0a1s7h6dk7ryxjh002lv";
+  };
+
+  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..1420597a1f32
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/patool/default.nix
@@ -0,0 +1,57 @@
+{ stdenv, lib, buildPythonPackage, fetchFromGitHub, pytestCheckHook, p7zip,
+  unzip, cabextract, zip, zopfli, 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)
+
+let
+  compression-utilities = [
+    p7zip
+    unzip
+    gnutar
+    cabextract
+    zip
+    zopfli
+    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";
+  };
+
+  prePatch = ''
+    substituteInPlace patoolib/util.py \
+      --replace "path = None" 'path = append_to_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/patsy/default.nix b/nixpkgs/pkgs/development/python-modules/patsy/default.nix
new file mode 100644
index 000000000000..bd3c103b9a74
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/patsy/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, nose
+, six
+, numpy
+, scipy # optional, allows spline-related features (see patsy's docs)
+, parameterized
+}:
+
+buildPythonPackage rec {
+  pname = "patsy";
+  version = "0.5.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "149rbrdzwns0ay88caf1zsm1r53v1q5np1mrb36na50y432cw5gi";
+  };
+
+  checkInputs = [ nose parameterized ];
+  checkPhase = "nosetests -v";
+
+  propagatedBuildInputs = [
+    six
+    numpy
+    scipy
+  ];
+
+  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..5d01df22b6d5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/paver/default.nix
@@ -0,0 +1,33 @@
+{ lib, stdenv
+, 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..18a2b9b95a3a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pbkdf2/default.nix
@@ -0,0 +1,18 @@
+{ lib, stdenv, 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..6b204a946b3a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pbr/default.nix
@@ -0,0 +1,20 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "pbr";
+  version = "5.5.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "5fad80b613c402d5b7df7bd84812548b2a61e9977387a80a5fc5c396492b13c9";
+  };
+
+  # circular dependencies with fixtures
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "http://docs.openstack.org/developer/pbr/";
+    license = licenses.asl20;
+    description = "Python Build Reasonableness";
+  };
+}
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..6a12eea1b00c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pc-ble-driver-py/default.nix
@@ -0,0 +1,32 @@
+{ lib, stdenv, fetchFromGitHub, cmake, git, swig, boost, udev, pc-ble-driver, pythonOlder
+, buildPythonPackage, enum34, wrapt, future, setuptools, scikit-build, pythonAtLeast }:
+
+buildPythonPackage rec {
+  pname = "pc-ble-driver-py";
+  version = "0.14.2";
+  disabled = pythonOlder "3.6" || pythonAtLeast "3.9";
+
+  src = fetchFromGitHub {
+    owner = "NordicSemiconductor";
+    repo = "pc-ble-driver-py";
+    rev = "v${version}";
+    sha256 = "1zbi3v4jmgq1a3ml34dq48y1hinw2008vwqn30l09r5vqvdgnj8m";
+  };
+
+  # doCheck tries to write to the global python directory to install things
+  doCheck = false;
+
+  nativeBuildInputs = [ cmake swig git setuptools scikit-build ];
+  buildInputs = [ boost pc-ble-driver ];
+  propagatedBuildInputs = [ enum34 wrapt future ];
+
+  dontUseCmakeConfigure = true;
+
+  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/pcpp/default.nix b/nixpkgs/pkgs/development/python-modules/pcpp/default.nix
new file mode 100644
index 000000000000..aea7ff0fcdaf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pcpp/default.nix
@@ -0,0 +1,24 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, lib, stdenv
+}:
+
+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..adc43ef4c2ed
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pdf2image/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, pillow, poppler_utils }:
+
+buildPythonPackage rec {
+  pname = "pdf2image";
+  version = "1.14.0";
+
+  propagatedBuildInputs = [ pillow poppler_utils ];
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "066527e1bf954762fb4369c677ae3bc15f2ce8707eee830cccef8471fde736d7";
+  };
+
+  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..10bc09e8ca92
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pdfkit/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "pdfkit";
+  version = "0.6.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1lcc1njpjd2zadbljqsnkrvamschl6j099p4giz1jd6mg1ds67gg";
+  };
+
+  # 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..9a659eebe330
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pdfminer_six/default.nix
@@ -0,0 +1,30 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub, isPy3k, cryptography, chardet, nose, sortedcontainers }:
+
+buildPythonPackage rec {
+  pname = "pdfminer_six";
+  version = "20201018";
+
+  disabled = !isPy3k;
+
+  # No tests in PyPi Tarball
+  src = fetchFromGitHub {
+    owner = "pdfminer";
+    repo = "pdfminer.six";
+    rev = version;
+    sha256 = "1a2fxxnnjqbx344znpvx7cnv1881dk6585ibw01inhfq3w6yj2lr";
+  };
+
+  propagatedBuildInputs = [ chardet cryptography sortedcontainers ];
+
+  checkInputs = [ nose ];
+  checkPhase = ''
+    nosetests
+  '';
+
+  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..0a21ed1e4999
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pdfposter/default.nix
@@ -0,0 +1,20 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, pypdf2 }:
+
+buildPythonPackage rec {
+  pname = "pdftools.pdfposter";
+  version = "0.7.post1";
+
+  propagatedBuildInputs = [ pypdf2 ];
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0c1avpbr9q53yzq5ar2x485rmp9d0l3z27aham32bg7gplzd7w0j";
+  };
+
+  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..49abb3751c91
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pdfrw/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv, 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..a52160363df9
--- /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.1.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "98aeb8b07a4127e1a30223bd933ef080bbd29aa88f801717ca6c5618380b8aa6";
+  };
+
+  buildInputs = [ poppler ];
+
+  meta = with lib; {
+    description = "Simple PDF text extraction";
+    homepage = "https://github.com/jalan/pdftotext";
+    license = licenses.mit;
+    maintainers = with maintainers; [ earvstedt ];
+  };
+}
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..97dee7e75705
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pdfx/default.nix
@@ -0,0 +1,33 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub, pdfminer, chardet, pytest }:
+
+buildPythonPackage rec {
+  pname = "pdfx";
+  version = "1.3.1";
+
+  src = fetchFromGitHub {
+    owner = "metachris";
+    repo = "pdfx";
+    rev = "v${version}";
+    sha256 = "1183k4h5qdf8y0imbir9ja3yzzsvdmqgbv3bi6dnkgr1wy2xfr0v";
+  };
+
+  # Remove after https://github.com/metachris/pdfx/pull/28
+  prePatch = ''
+    sed -i -e "s|pdfminer2|pdfminer.six|" setup.py
+  '';
+
+  propagatedBuildInputs = [ pdfminer chardet ];
+
+  checkInputs = [ pytest ];
+
+  checkPhase = ''
+    py.test
+  '';
+
+  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/pdoc3/default.nix b/nixpkgs/pkgs/development/python-modules/pdoc3/default.nix
new file mode 100644
index 000000000000..d544f27b988b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pdoc3/default.nix
@@ -0,0 +1,28 @@
+{ lib, buildPythonPackage, fetchPypi
+, pythonOlder
+, Mako
+, markdown
+, setuptools-git
+, setuptools_scm
+}:
+
+buildPythonPackage rec {
+  pname = "pdoc3";
+  version = "0.9.2";
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "9df5d931f25f353c69c46819a3bd03ef96dd286f2a70bb1b93a23a781f91faa1";
+  };
+
+  nativeBuildInputs = [ setuptools-git setuptools_scm ];
+  propagatedBuildInputs = [ Mako markdown ];
+
+  meta = with lib; {
+    description = "Auto-generate API documentation for Python projects.";
+    homepage = "https://pdoc3.github.io/pdoc/";
+    license = with licenses; [ agpl3Plus ];
+    maintainers = with maintainers; [ catern ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pecan/default.nix b/nixpkgs/pkgs/development/python-modules/pecan/default.nix
new file mode 100644
index 000000000000..ed0c89b7802b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pecan/default.nix
@@ -0,0 +1,59 @@
+{ lib, stdenv
+, fetchPypi
+, buildPythonPackage
+, isPy27
+# Python deps
+, logutils
+, Mako
+, singledispatch
+, six
+, webtest
+# Test Inputs
+, pytestCheckHook
+, genshi
+, gunicorn
+, jinja2
+, Kajiki
+, mock
+, sqlalchemy
+, uwsgi
+, virtualenv
+}:
+
+buildPythonPackage rec {
+  pname = "pecan";
+  version = "1.4.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "4b2acd6802a04b59e306d0a6ccf37701d24376f4dc044bbbafba3afdf9d3389a";
+  };
+
+  propagatedBuildInputs = [
+    logutils
+    Mako
+    singledispatch
+    six
+    webtest
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    genshi
+    gunicorn
+    jinja2
+    mock
+    sqlalchemy
+    virtualenv
+  ] ++ lib.optionals isPy27 [ Kajiki ];
+
+  pytestFlagsArray = [
+    "--pyargs pecan "
+  ];
+
+  meta = with lib; {
+    description = "Pecan";
+    homepage = "http://www.pecanpy.org/";
+    changelog = "https://pecan.readthedocs.io/en/latest/changes.html";
+  };
+}
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..6f5d8e262279
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/peewee/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, sqlite
+, cython
+, apsw
+, flask
+, withPostgres ? false, psycopg2
+, withMysql ? false, mysql-connector
+}:
+
+buildPythonPackage rec {
+
+  pname = "peewee";
+  version = "3.13.3";
+
+  # pypi release does not provide tests
+  src = fetchFromGitHub {
+    owner = "coleifer";
+    repo = pname;
+    rev = version;
+    sha256 = "1r67hxb9m6v0xbnbqfnsw6dahmdr94pf81b4x51jfw6x9sa4izi4";
+  };
+
+
+  checkInputs = [ flask ];
+
+  checkPhase = ''
+    rm -r playhouse # avoid using the folder in the cwd
+    python runtests.py
+  '';
+
+  buildInputs = [
+    sqlite
+    cython # compile speedups
+  ];
+
+  propagatedBuildInputs = [
+    apsw # sqlite performance improvement
+  ] ++ (lib.optional withPostgres psycopg2)
+    ++ (lib.optional withMysql mysql-connector);
+
+  doCheck = withPostgres;
+
+  meta = with lib; {
+    description = "a small, expressive orm";
+    homepage    = "http://peewee-orm.com";
+    license     = licenses.mit;
+  };
+}
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..92a0d064f49c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pefile/default.nix
@@ -0,0 +1,30 @@
+{ buildPythonPackage
+, future
+, fetchPypi
+, lib
+}:
+
+buildPythonPackage rec {
+  pname = "pefile";
+  version = "2019.4.18";
+
+  propagatedBuildInputs = [ future ];
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a5d6e8305c6b210849b47a6174ddf9c452b2888340b8177874b862ba6c207645";
+  };
+
+  # Test data encrypted.
+  doCheck = false;
+
+  # Verify import still works.
+  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 = [ 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..0b103b780c08
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pelican/default.nix
@@ -0,0 +1,76 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub, isPy27
+, glibcLocales, git
+, mock, nose, markdown, lxml, typogrify
+, jinja2, pygments, docutils, pytz, unidecode, six, dateutil, feedgenerator
+, blinker, pillow, beautifulsoup4, markupsafe, pandoc }:
+
+buildPythonPackage rec {
+  pname = "pelican";
+  version = "4.5.0";
+
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "getpelican";
+    repo = "pelican";
+    rev = version;
+    sha256 = "0p8p84fcpkr19d54dhxvldd8ijbg334wmrmkr99pnbrdl1gf64qi";
+    # Remove unicode file names which leads to different checksums on HFS+
+    # vs. other filesystems because of unicode normalisation.
+    extraPostFetch = ''
+      rm -r $out/pelican/tests/output/custom_locale/posts
+    '';
+  };
+
+  doCheck = true;
+
+  # Exclude custom locale test, which files were removed above to fix the source checksum
+  checkPhase = ''
+    nosetests -s \
+      --exclude=test_custom_locale_generation_works \
+      --exclude=test_log_filter \
+      pelican
+  '';
+
+  buildInputs = [
+    glibcLocales
+    pandoc
+    git
+    mock
+    markdown
+    typogrify
+  ];
+
+  propagatedBuildInputs = [
+    jinja2 pygments docutils pytz unidecode six dateutil feedgenerator
+    blinker pillow beautifulsoup4 markupsafe lxml
+  ];
+
+  checkInputs = [
+    nose
+    pandoc
+  ];
+
+  postPatch= ''
+    substituteInPlace pelican/tests/test_pelican.py \
+      --replace "'git'" "'${git}/bin/git'"
+  '';
+
+  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
+  '';
+
+  meta = with lib; {
+    description = "A tool to generate a static blog from reStructuredText or Markdown input files";
+    homepage = "http://getpelican.com/";
+    license = licenses.agpl3;
+    maintainers = with maintainers; [ offline prikhi ];
+  };
+}
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..5688090b0958
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pendulum/default.nix
@@ -0,0 +1,37 @@
+{ lib, fetchPypi, buildPythonPackage, pythonOlder
+, dateutil
+, importlib-metadata
+, poetry
+, 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 = [ 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/pep257/default.nix b/nixpkgs/pkgs/development/python-modules/pep257/default.nix
new file mode 100644
index 000000000000..296b55eec125
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pep257/default.nix
@@ -0,0 +1,23 @@
+{ lib, stdenv, buildPythonPackage, fetchurl, pytest, mock }:
+buildPythonPackage rec {
+  pname = "pep257";
+  version = "0.7.0";
+
+  src = fetchurl {
+    url = "https://github.com/GreenSteam/pep257/archive/${version}.tar.gz";
+    sha256 = "1ldpgil0kaf6wz5gvl9xdx35a62vc6bmgi3wbh9320dj5v2qk4wh";
+  };
+
+  checkInputs = [ pytest mock ];
+
+  checkPhase = ''
+    py.test
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/GreenSteam/pep257/";
+    description = "Python docstring style checker";
+    longDescription = "Static analysis tool for checking compliance with Python PEP 257.";
+    license = licenses.mit;
+  };
+}
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..90dc50461990
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pep517/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, flit-core
+, toml
+, pythonOlder
+, importlib-metadata
+, zipp
+, pytestCheckHook
+, testpath
+, mock
+, pip
+}:
+
+buildPythonPackage rec {
+  pname = "pep517";
+  version = "0.9.1";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0zqidxah03qpnp6zkg3zd1kmd5f79hhdsfmlc0cldaniy80qddxf";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [
+    toml
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata zipp
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    testpath
+    mock
+    pip
+  ];
+
+  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..5f6ef894d8ff
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pep8-naming/default.nix
@@ -0,0 +1,27 @@
+{ lib, fetchPypi, buildPythonPackage, pythonOlder
+, flake8-polyfill
+, importlib-metadata
+}:
+
+buildPythonPackage rec {
+  pname = "pep8-naming";
+  version = "0.11.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0937rnk3c2z1jkdmbw9hfm80p5k467q7rqhn6slfiprs4kflgpd1";
+  };
+
+  propagatedBuildInputs = [
+    flake8-polyfill
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  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..8ef3bfea0f5d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pep8/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv
+, 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..6caf61b0cd0d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/peppercorn/default.nix
@@ -0,0 +1,22 @@
+{ lib, stdenv
+, 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..eddf58e559dc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/percol/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, fetchPypi, isPy3k
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "percol";
+  version = "0.2.1";
+  disabled = isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "7a649c6fae61635519d12a6bcacc742241aad1bff3230baef2cedd693ed9cfe8";
+  };
+
+  propagatedBuildInputs = [ six ];
+
+  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 ];
+    broken = true; # missing cmigemo package which is missing libmigemo.so
+    # also doesn't support python3
+  };
+}
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..371eff249c2d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/perfplot/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, dufte
+, matplotlib
+, numpy
+, pipdate
+, tqdm
+, rich
+, pytest
+, isPy27
+}:
+
+buildPythonPackage rec {
+  pname = "perfplot";
+  version = "0.8.4";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "nschloe";
+    repo = "perfplot";
+    rev = "v${version}";
+    sha256 = "0avb0inx8qh8ss3j460v3z6mmn863hswa3bl19vkh475ndsjwmp0";
+  };
+  format = "pyproject";
+
+  propagatedBuildInputs = [
+    dufte
+    matplotlib
+    numpy
+    pipdate
+    rich
+    tqdm
+  ];
+
+  checkInputs = [
+    pytest
+  ];
+
+  checkPhase = ''
+    export HOME=$TMPDIR
+    mkdir -p $HOME/.matplotlib
+    echo "backend: ps" > $HOME/.matplotlib/matplotlibrc
+    pytest test/perfplot_test.py
+  '';
+
+  meta = with lib; {
+    description = "Performance plots for Python code snippets";
+    homepage = "https://github.com/nschloe/perfplot";
+    license = licenses.mit;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..ea42f7ea7fef
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/periodictable/default.nix
@@ -0,0 +1,22 @@
+{lib, fetchPypi, buildPythonPackage, numpy, pyparsing, pytestcov, pytestCheckHook }:
+
+buildPythonPackage rec {
+  pname = "periodictable";
+  version = "1.5.3";
+
+  propagatedBuildInputs = [numpy pyparsing];
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1d09c359468e2de74b43fc3a7dcb0d3d71e0ff53adb85995215d8d7796451af6";
+  };
+
+  checkInputs = [ pytestcov pytestCheckHook ];
+
+  meta = {
+    homepage = "https://www.reflectometry.org/danse/software.html";
+    description = "an extensible periodic table of the elements prepopulated with data important to neutron and x-ray scattering experiments";
+    license = lib.licenses.publicDomain;
+    maintainers = with lib.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..0979afa92f4a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/persim/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, scikitlearn
+, numpy
+, matplotlib
+, scipy
+, hopcroftkarp
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "persim";
+  version = "0.1.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "be4ea4bfc2a0c6fcfc28ebd52e23a351ee00b0ef0ddaf527526bd0f919145348";
+  };
+
+  propagatedBuildInputs = [
+    scikitlearn
+    numpy
+    matplotlib
+    scipy
+    hopcroftkarp
+  ];
+
+  checkInputs = [
+    pytest
+  ];
+
+  checkPhase = ''
+    # specifically needed for darwin
+    export HOME=$(mktemp -d)
+    mkdir -p $HOME/.matplotlib
+    echo "backend: ps" > $HOME/.matplotlib/matplotlibrc
+
+    # ignore tests due to python 2.7 fail
+    pytest --ignore test/test_plots.py \
+           --ignore test/test_visuals.py
+  '';
+
+  meta = with lib; {
+    description = "Distances and representations of persistence diagrams";
+    homepage = "https://persim.scikit-tda.org";
+    license = licenses.mit;
+    maintainers = [ 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..07ba3ecd1cf9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/persistent/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, zope_interface, cffi
+, sphinx, manuel
+}:
+
+buildPythonPackage rec {
+  pname = "persistent";
+  version = "4.6.4";
+
+  nativeBuildInputs = [ sphinx manuel ];
+  propagatedBuildInputs = [ zope_interface cffi ];
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f83f54355a44cf8ec38c29ce47b378a8c70444e9a745581dbb13d201a24cb546";
+  };
+
+  meta = {
+    description = "Automatic persistence for Python objects";
+    homepage = "http://www.zodb.org/";
+    license = lib.licenses.zpl21;
+  };
+}
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..86bae927d9ff
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/persisting-theory/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi
+, nose
+}:
+
+buildPythonPackage rec {
+  pname = "persisting-theory";
+  version = "0.2.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "02hcg7js23yjyw6gwxqzvyv2b1wfjrypk98cfxfgf7s8iz67vzq0";
+  };
+
+  checkInputs = [ nose ];
+
+  checkPhase = "nosetests";
+
+  meta = with lib; {
+    homepage = "https://code.eliotberriot.com/eliotberriot/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/pex/default.nix b/nixpkgs/pkgs/development/python-modules/pex/default.nix
new file mode 100644
index 000000000000..1d7de0088a84
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pex/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "pex";
+  version = "2.1.21";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d580a26da1b342ab2ebbf675ba2bab04e98c4d1aaf2a6fea09f41d68dfc466ba";
+  };
+
+  nativeBuildInputs = [ setuptools ];
+
+  # A few more dependencies I don't want to handle right now...
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A 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..326dde176ae6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pexif/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv
+, 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..60655708beae
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pexpect/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, ptyprocess
+, isPy3k
+}:
+
+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/1_12.nix b/nixpkgs/pkgs/development/python-modules/pg8000/1_12.nix
new file mode 100644
index 000000000000..d84bb2014b80
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pg8000/1_12.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, pytz
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "pg8000";
+  version = "1.12.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1yc3knh28cx3rjb2ifg5kmqqa78yyyw2gzzslbm9fj0mzh5aq1sx";
+  };
+
+  propagatedBuildInputs = [ pytz six ];
+
+  meta = with lib; {
+    homepage = "https://github.com/tlocke/pg8000";
+    description = "PostgreSQL interface library, for asyncio";
+    maintainers = with maintainers; [ domenkozar ];
+    platforms = platforms.unix;
+  };
+
+}
+
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..8f63e00e7997
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pg8000/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, scramp
+, isPy3k
+, passlib
+}:
+
+buildPythonPackage rec {
+  pname = "pg8000";
+  version = "1.16.6";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "8fc1e6a62ccb7c9830f1e7e9288e2d20eaf373cc8875b5c55b7d5d9b7717be91";
+  };
+
+  propagatedBuildInputs = [ passlib scramp ];
+
+  meta = with lib; {
+    homepage = "https://github.com/tlocke/pg8000";
+    description = "PostgreSQL interface library, for asyncio";
+    maintainers = with maintainers; [ domenkozar ];
+    platforms = platforms.unix;
+  };
+
+}
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..767140e6bf8f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pglast/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+, pythonOlder
+, setuptools
+, aenum
+, pytest
+, pytestcov
+}:
+
+buildPythonPackage rec {
+  pname = "pglast";
+  version = "1.14";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "72652b9edc7bdbfc9c3192235fb2fa1b2fb73a681613368fcaec747d7f5e479f";
+  };
+
+  disabled = !isPy3k;
+
+  propagatedBuildInputs = [ setuptools ] ++ lib.optionals (pythonOlder "3.6") [ aenum ];
+
+  checkInputs = [ pytest pytestcov ];
+
+  checkPhase = ''
+    pytest
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/lelit/pglast";
+    description = "PostgreSQL Languages AST and statements prettifier";
+    license = licenses.gpl3Plus;
+    maintainers = [ 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..d795cc3678f7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pgpdump/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv
+, 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..2c527d87d186
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pgpy/default.nix
@@ -0,0 +1,40 @@
+{ lib, isPy3k, fetchFromGitHub, buildPythonPackage
+, six, enum34, pyasn1, cryptography, singledispatch
+, fetchPypi, pytestCheckHook }:
+
+buildPythonPackage rec {
+  pname = "pgpy";
+  version = "0.5.2";
+
+  src = fetchFromGitHub {
+    owner = "SecurityInnovation";
+    repo = "PGPy";
+    rev = version;
+    sha256 = "1v2b1dyq1sl48d2gw7vn4hv6sasd9ihpzzcq8yvxj9dgfak2y663";
+  };
+
+  propagatedBuildInputs = [
+    six
+    pyasn1
+    cryptography
+    singledispatch
+  ] ++ lib.optional (!isPy3k) enum34;
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [ "test_sign_string" "test_verify_string" ];
+
+  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 ];
+  };
+}
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..796a38198814
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pgspecial/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, pytest, psycopg2, click, sqlparse }:
+
+buildPythonPackage rec {
+  pname = "pgspecial";
+  version = "1.11.10";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1jrq6bhzwvz6db8ays8zff15hbk1iazs2qxrzvrnlkgxxjkp8p7n";
+  };
+
+  checkInputs = [ pytest ];
+  propagatedBuildInputs = [ click sqlparse psycopg2 ];
+
+  checkPhase = ''
+    find tests -name \*.pyc -delete
+    py.test tests
+  '';
+
+  meta = with lib; {
+    description = "Meta-commands handler for Postgres Database";
+    homepage = "https://pypi.python.org/pypi/pgspecial";
+    license = licenses.bsd3;
+  };
+}
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..5a00a4ccb099
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/phe/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, isPyPy, isPy3k, click, gmpy2, numpy } :
+
+let
+  pname = "phe";
+  version = "1.4.0";
+in
+
+buildPythonPackage {
+  inherit pname version;
+
+  # https://github.com/n1analytics/python-paillier/issues/51
+  disabled = isPyPy || ! isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0wzlk7d24kp0f5kpm0kvvc88mm42144f5cg9pcpb1dsfha75qy5m";
+  };
+
+  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..b309fb287d80
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/phik/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+, pytest
+, pytest-pylint
+, nbconvert
+, joblib
+, jupyter_client
+, numpy
+, scipy
+, pandas
+, matplotlib
+, numba
+}:
+
+buildPythonPackage rec {
+  pname = "phik";
+  version = "0.10.0";
+  format = "wheel";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version format;
+    python = "py3";
+    sha256 = "b745313c5ff9d6a3092eefa97f83fa4dbed178c9ce69161b655e95497cb2f38b";
+  };
+
+  checkInputs = [
+    pytest
+    pytest-pylint
+    nbconvert
+    jupyter_client
+  ];
+
+  propagatedBuildInputs = [
+    joblib
+    numpy
+    scipy
+    pandas
+    matplotlib
+    numba
+  ];
+
+  postInstall = ''
+  rm -r $out/bin
+  '';
+
+  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/";
+    maintainers = with maintainers; [ melsigl ];
+    license = licenses.asl20;
+  };
+}
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..1734addb0ef1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/phonemizer/backend-paths.patch
@@ -0,0 +1,29 @@
+diff --git a/phonemizer/backend/espeak.py b/phonemizer/backend/espeak.py
+index 387c11c..ceb5e7e 100644
+--- a/phonemizer/backend/espeak.py
++++ b/phonemizer/backend/espeak.py
+@@ -81,10 +81,7 @@ class BaseEspeakBackend(BaseBackend):
+         if _ESPEAK_DEFAULT_PATH:
+             return _ESPEAK_DEFAULT_PATH
+ 
+-        espeak = distutils.spawn.find_executable('espeak-ng')
+-        if not espeak:  # pragma: nocover
+-            espeak = distutils.spawn.find_executable('espeak')
+-        return espeak
++        return "@espeak@"
+ 
+     @classmethod
+     def is_available(cls):
+diff --git a/phonemizer/backend/festival.py b/phonemizer/backend/festival.py
+index b5bc56d..0833160 100644
+--- a/phonemizer/backend/festival.py
++++ b/phonemizer/backend/festival.py
+@@ -78,7 +78,7 @@ class FestivalBackend(BaseBackend):
+         if _FESTIVAL_DEFAULT_PATH:
+             return _FESTIVAL_DEFAULT_PATH
+ 
+-        return distutils.spawn.find_executable('festival')
++        return "@festival@"
+ 
+     @classmethod
+     def is_available(cls):
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..2d6531794313
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/phonemizer/default.nix
@@ -0,0 +1,73 @@
+{ lib
+, substituteAll
+, buildPythonApplication
+, fetchPypi
+, python3Packages
+, pkgs
+, joblib
+, segments
+, attrs
+, espeak-ng
+, pytestCheckHook
+, pytestrunner
+, pytestcov
+}:
+
+buildPythonApplication rec {
+  pname = "phonemizer";
+  version = "2.2.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "127n4f10zxq60qd8xvlc1amji4wbghqb90rfp25rzdk716kvgwab";
+  };
+
+  postPatch = ''
+    sed -i -e '/\'pytest-runner\'/d setup.py
+  '';
+
+  patches = [
+    (substituteAll {
+      src = ./backend-paths.patch;
+      espeak = "${lib.getBin espeak-ng}/bin/espeak";
+      # override festival path should you try to integrate it
+      festival = "";
+    })
+    ./remove-intertwined-festival-test.patch
+  ];
+
+  propagatedBuildInputs = [
+    joblib
+    segments
+    attrs
+  ];
+
+  preCheck = ''
+    export HOME=$TMPDIR
+  '';
+
+  checkInputs = [
+    pytestCheckHook
+    pytestcov
+  ];
+
+  # We tried to package festvial, but were unable to get the backend running,
+  # so let's disable related tests.
+  pytestFlagsArray = [
+    "--ignore=test/test_festival.py"
+  ];
+
+  disabledTests = [
+    "test_festival"
+    "test_relative"
+    "test_absolute"
+    "test_readme_festival_syll"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/bootphon/phonemizer";
+    description = "Simple text to phones converter for multiple languages";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/phonemizer/drop-readme-festival-test.patch b/nixpkgs/pkgs/development/python-modules/phonemizer/drop-readme-festival-test.patch
new file mode 100644
index 000000000000..a60cdf2645a5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/phonemizer/drop-readme-festival-test.patch
@@ -0,0 +1,12 @@
+diff --git a/test/test_main.py b/test/test_main.py
+index 71d605a..d137cd7 100644
+--- a/test/test_main.py
++++ b/test/test_main.py
+@@ -63,7 +63,6 @@ def test_readme():
+     _test(u'hello world', u'həloʊ wɜːld ')
+     _test(u'hello world', u'həloʊ wɜːld ', '--verbose')
+     _test(u'hello world', u'həloʊ wɜːld ', '--quiet')
+-    _test(u'hello world', u'hhaxlow werld', '-b festival --strip')
+     _test(u'hello world', u'həloʊ wɜːld ', '-l en-us')
+     _test(u'bonjour le monde', u'bɔ̃ʒuʁ lə mɔ̃d ', '-l fr-fr')
+     _test(u'bonjour le monde', u'b ɔ̃ ʒ u ʁ ;eword l ə ;eword m ɔ̃ d ;eword ',
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..d7d605df7f98
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/phonemizer/remove-intertwined-festival-test.patch
@@ -0,0 +1,22 @@
+diff --git a/test/test_main.py b/test/test_main.py
+index 71d605a..0ea3c74 100644
+--- a/test/test_main.py
++++ b/test/test_main.py
+@@ -63,17 +63,12 @@ def test_readme():
+     _test(u'hello world', u'həloʊ wɜːld ')
+     _test(u'hello world', u'həloʊ wɜːld ', '--verbose')
+     _test(u'hello world', u'həloʊ wɜːld ', '--quiet')
+-    _test(u'hello world', u'hhaxlow werld', '-b festival --strip')
+     _test(u'hello world', u'həloʊ wɜːld ', '-l en-us')
+     _test(u'bonjour le monde', u'bɔ̃ʒuʁ lə mɔ̃d ', '-l fr-fr')
+     _test(u'bonjour le monde', u'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(u'hello world',
+           u'hh ax ;esyll l ow ;esyll ;eword w er l d ;esyll ;eword ',
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..354ca2796e19
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/phonenumbers/default.nix
@@ -0,0 +1,18 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "phonenumbers";
+  version = "8.12.13";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "96d02120a3481e22d8a8eb5e4595ceec1930855749f6e4a06ef931881f59f562";
+  };
+
+  meta = with lib; {
+    description = "Python version of Google's common library for parsing, formatting, storing and validating 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..03e0c54caab7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/phonopy/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv, buildPythonPackage, python, fetchPypi, numpy, pyyaml, matplotlib, h5py, spglib, pytestCheckHook }:
+
+buildPythonPackage rec {
+  pname = "phonopy";
+  version = "2.8.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "28864b04adb900597705f1367a100da869af835088bdd13f1693c4382259f128";
+  };
+
+  propagatedBuildInputs = [ numpy pyyaml matplotlib h5py spglib ];
+
+  checkInputs = [ pytestCheckHook ];
+  # flakey due to floating point inaccuracy
+  disabledTests = [ "test_NaCl" ];
+
+  # 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..9ed84e86371c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/phx-class-registry/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, isPy27, pytestCheckHook }:
+
+buildPythonPackage rec {
+  pname = "phx-class-registry";
+  version = "3.0.5";
+
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "14iap8db2ldmnlf5kvxs52aps31rl98kpa5nq8wdm30a86n6457i";
+  };
+
+  checkInputs = [ pytestCheckHook ];
+
+  disabledTests = [
+    "test_branding"
+    "test_happy_path"
+    "test_len"
+  ];
+
+  meta = with lib; {
+    description = "Registry pattern for Python classes, with setuptools entry points integration";
+    homepage = "https://github.com/todofixthis/class-registry";
+    license = licenses.mit;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..bbb4fcf19934
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/piccata/default.nix
@@ -0,0 +1,26 @@
+{ buildPythonPackage, isPy27, fetchFromGitHub, lib, ipaddress }:
+
+buildPythonPackage rec {
+  pname = "piccata";
+  version = "2.0.0";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "NordicSemiconductor";
+    repo = pname;
+    rev = version;
+    sha256 = "0pn842jcf2czjks5dphivgp1s7wiifqiv93s0a89h0wxafd6pbsr";
+  };
+
+  propagatedBuildInputs = [
+    ipaddress
+  ];
+
+  pythonImportsCheck = [ "piccata" ];
+
+  meta = {
+    description = "Simple CoAP (RFC7252) toolkit";
+    homepage = "https://github.com/NordicSemiconductor/piccata";
+    maintainers = with lib.maintainers; [ gebner ];
+  };
+}
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..2151e13b960d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pickleshare/default.nix
@@ -0,0 +1,30 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, pathpy
+, pathlib2
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  version = "0.7.5";
+  pname = "pickleshare";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca";
+  };
+
+  propagatedBuildInputs = [ pathpy ]
+    ++ 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..95aca29da5d1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pid/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv
+, 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..c4fd24d070e6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/piep/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, nose
+, pygments
+}:
+
+buildPythonPackage rec {
+  version = "0.9.2";
+  pname = "piep";
+
+  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/pika-pool/default.nix b/nixpkgs/pkgs/development/python-modules/pika-pool/default.nix
new file mode 100644
index 000000000000..a36fcdf18bb5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pika-pool/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv, 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..ec8310bdb55f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pika/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, nose
+, mock
+, twisted
+, tornado
+}:
+
+buildPythonPackage rec {
+  pname = "pika";
+  version = "1.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1gqx9avb9nwgiyw5nz08bf99v9b0hvzr1pmqn9wbhd2hnsj6p9wz";
+  };
+
+  checkInputs = [ nose mock twisted tornado ];
+
+  meta = with lib; {
+    description = "Pure-Python implementation of the AMQP 0-9-1 protocol";
+    homepage = "https://pika.readthedocs.org";
+    license = licenses.bsd3;
+  };
+
+}
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..ff2a2ce4c5e7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pikepdf/default.nix
@@ -0,0 +1,77 @@
+{ attrs
+, buildPythonPackage
+, defusedxml
+, fetchPypi
+, hypothesis
+, isPy3k
+, lxml
+, pillow
+, pybind11
+, pytestCheckHook
+, pytest-helpers-namespace
+, pytest-timeout
+, pytest_xdist
+, pytestrunner
+, python-dateutil
+, python-xmp-toolkit
+, python3
+, qpdf
+, setuptools-scm-git-archive
+, setuptools_scm
+, lib, stdenv
+}:
+
+buildPythonPackage rec {
+  pname = "pikepdf";
+  version = "2.2.0";
+  disabled = ! isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "74300a32c41b3d578772f6933f23a88b19f74484185e71e5225ce2f7ea5aea78";
+  };
+
+  buildInputs = [
+    pybind11
+    qpdf
+  ];
+
+  nativeBuildInputs = [
+    setuptools-scm-git-archive
+    setuptools_scm
+  ];
+
+  checkInputs = [
+    attrs
+    hypothesis
+    pillow
+    pytestCheckHook
+    pytest-helpers-namespace
+    pytest-timeout
+    pytest_xdist
+    pytestrunner
+    python-dateutil
+    python-xmp-toolkit
+  ];
+
+  propagatedBuildInputs = [ defusedxml lxml ];
+
+  postPatch = ''
+    sed -i \
+      -e 's/^pytest .*/pytest/g' \
+      -e 's/^attrs .*/attrs/g' \
+      -e 's/^hypothesis .*/hypothesis/g' \
+      requirements/test.txt
+  '';
+
+  preBuild = ''
+    HOME=$TMPDIR
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/pikepdf/pikepdf";
+    description = "Read and write PDFs with Python, powered by qpdf";
+    license = licenses.mpl20;
+    maintainers = [ maintainers.kiwi ];
+  };
+}
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..4a3c682c1229
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pilkit/default.nix
@@ -0,0 +1,36 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, pillow
+, nose_progressive
+, nose
+, mock
+, blessings
+}:
+
+buildPythonPackage rec {
+  pname = "pilkit";
+  version = "2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ddb30c2f0198a147e56b151476c3bb9fe045fbfd5b0a0fa2a3148dba62d1559f";
+  };
+
+  preConfigure = ''
+    substituteInPlace setup.py --replace 'nose==1.2.1' 'nose'
+  '';
+
+  # tests fail, see https://github.com/matthewwithanm/pilkit/issues/9
+  doCheck = false;
+
+  buildInputs = [ pillow nose_progressive nose mock blessings ];
+
+  meta = with lib; {
+    homepage = "https://github.com/matthewwithanm/pilkit/";
+    description = "A collection of utilities and processors for the Python Imaging Libary";
+    license = licenses.bsd0;
+    maintainers = with maintainers; [ domenkozar ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pillow/6.nix b/nixpkgs/pkgs/development/python-modules/pillow/6.nix
new file mode 100644
index 000000000000..0e3fabf1fbca
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pillow/6.nix
@@ -0,0 +1,82 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, isPyPy
+, olefile
+, freetype, libjpeg, zlib, libtiff, libwebp, tcl, lcms2, tk, libX11
+, openjpeg, libimagequant
+, pytest, pytestrunner, pyroma, numpy
+}:
+
+buildPythonPackage rec {
+  pname = "Pillow";
+  version = "6.2.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0l5rv8jkdrb5q846v60v03mcq64yrhklidjkgwv6s1pda71g17yv";
+  };
+
+  # 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
+  '';
+
+  checkPhase = ''
+    runHook preCheck
+    python -m pytest -v -x -W always${lib.optionalString stdenv.isDarwin " --deselect=Tests/test_file_icns.py::TestFileIcns::test_save --deselect=Tests/test_imagegrab.py::TestImageGrab::test_grab"}
+    runHook postCheck
+  '';
+
+  propagatedBuildInputs = [ olefile ];
+
+  checkInputs = [ pytest pytestrunner pyroma numpy ];
+
+  buildInputs = [
+    freetype libjpeg openjpeg libimagequant zlib libtiff libwebp tcl lcms2 ]
+    ++ 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="-L${libwebp}/lib"
+    export CFLAGS="-I${libwebp}/include"
+  ''
+  # Remove impurities
+  + lib.optionalString stdenv.isDarwin ''
+    substituteInPlace setup.py \
+      --replace '"/Library/Frameworks",' "" \
+      --replace '"/System/Library/Frameworks"' ""
+  '';
+
+  meta = with lib; {
+    homepage = "https://python-pillow.github.io/";
+    description = "Fork of The Python Imaging Library (PIL)";
+    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 = "http://www.pythonware.com/products/pil/license.htm";
+    maintainers = with maintainers; [ goibhniu prikhi ];
+  };
+}
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..4084df19404b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pillow/default.nix
@@ -0,0 +1,82 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, isPyPy
+, olefile
+, freetype, libjpeg, zlib, libtiff, libwebp, tcl, lcms2, tk, libX11
+, openjpeg, libimagequant
+, pyroma, numpy, pytestCheckHook
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "Pillow";
+  version = "8.0.1";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "11c5c6e9b02c9dac08af04f093eb5a2f84857df70a7d4a6a6ad461aca803fb9e";
+  };
+
+  # 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_save" "test_grab" "test_grabclipboard" ];
+
+  propagatedBuildInputs = [ olefile ];
+
+  checkInputs = [ pytestCheckHook pyroma numpy ];
+
+  buildInputs = [
+    freetype libjpeg openjpeg libimagequant zlib libtiff libwebp tcl lcms2 ]
+    ++ 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="-L${libwebp}/lib"
+    export CFLAGS="-I${libwebp}/include"
+  ''
+  # Remove impurities
+  + lib.optionalString stdenv.isDarwin ''
+    substituteInPlace setup.py \
+      --replace '"/Library/Frameworks",' "" \
+      --replace '"/System/Library/Frameworks"' ""
+  '';
+
+  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 = "http://www.pythonware.com/products/pil/license.htm";
+    maintainers = with maintainers; [ goibhniu prikhi ];
+  };
+}
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..9e23f69d19c5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pillowfight/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, pillow
+}:
+
+buildPythonPackage rec {
+  pname = "pillowfight";
+  version = "0.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "913869b0563c5982bcf08cb1ea56fb0f87e3573d738e3e3692301bf45dba6252";
+  };
+
+  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..d2a5641acff5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pims/default.nix
@@ -0,0 +1,33 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, slicerator
+, scikitimage
+, six
+, numpy
+, tifffile
+, nose
+}:
+
+buildPythonPackage rec {
+  version = "0.5";
+  pname = "PIMS";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a02cdcbb153e2792042fb0bae7df4f30878bbba1f2d176114a87ee0dc18715a0";
+  };
+
+  checkInputs = [ nose ];
+  propagatedBuildInputs = [ slicerator six numpy tifffile scikitimage ];
+
+  # not everything packaged with pypi release
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/soft-matter/pims";
+    description = "Python Image Sequence: Load video and sequential images in many formats with a simple, consistent interface";
+    license = licenses.bsdOriginal;
+    maintainers = [ 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/default.nix b/nixpkgs/pkgs/development/python-modules/pint/default.nix
new file mode 100644
index 000000000000..c0aa86a3763d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pint/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, setuptools_scm
+, importlib-metadata
+, packaging
+# Check Inputs
+, pytestCheckHook
+, numpy
+, matplotlib
+, uncertainties
+}:
+
+buildPythonPackage rec {
+  pname = "pint";
+  version = "0.14";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "Pint";
+    sha256 = "0wkzb7g20wzpqr3xaqpq96dlfv6irw202icsz81ys8npp7mm194s";
+  };
+
+  disabled = pythonOlder "3.6";
+
+  nativeBuildInputs = [ setuptools_scm ];
+
+  propagatedBuildInputs = [ packaging ]
+    ++ lib.optionals (pythonOlder "3.8") [ importlib-metadata ];
+
+  # Test suite explicitly requires pytest
+  checkInputs = [
+    pytestCheckHook
+    numpy
+    matplotlib
+    uncertainties
+  ];
+  dontUseSetuptoolsCheck = true;
+
+  meta = with lib; {
+    description = "Physical quantities module";
+    license = licenses.bsd3;
+    homepage = "https://github.com/hgrecco/pint/";
+    maintainers = [ maintainers.costrouc ];
+  };
+
+}
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..4ea6f75932cd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pip-tools/default.nix
@@ -0,0 +1,51 @@
+{ lib, fetchPypi, buildPythonPackage, pip, pytest, click, six
+, setuptools_scm, git, glibcLocales, mock }:
+
+buildPythonPackage rec {
+  pname = "pip-tools";
+  version = "5.4.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a4d3990df2d65961af8b41dacc242e600fdc8a65a2e155ed3d2fc18a5c209f20";
+  };
+
+  LC_ALL = "en_US.UTF-8";
+  checkInputs = [ pytest git glibcLocales mock ];
+  propagatedBuildInputs = [ pip click six setuptools_scm ];
+
+  disabledTests = lib.concatMapStringsSep " and " (s: "not " + s) [
+    # Depend on network tests:
+    "test_allow_unsafe_option" #paramaterized, but all fail
+    "test_annotate_option" #paramaterized, but all fail
+    "test_editable_package_vcs"
+    "test_editable_top_level_deps_preserved" # can't figure out how to select only one parameter to ignore
+    "test_filter_pip_markers"
+    "test_filter_pip_markes"
+    "test_generate_hashes_all_platforms"
+    "test_generate_hashes_verbose"
+    "test_generate_hashes_with_editable"
+    "test_generate_hashes_with_url"
+    "test_generate_hashes_without_interfering_with_each_other"
+    "test_get_file_hash_without_interfering_with_each_other"
+    "test_get_hashes_local_repository_cache_miss"
+    "test_realistic_complex_sub_dependencies"
+    "test_stdin"
+    "test_upgrade_packages_option"
+    "test_url_package"
+    "test_editable_package"
+    "test_locally_available_editable_package_is_not_archived_in_cache_dir"
+  ];
+
+  checkPhase = ''
+    export HOME=$(mktemp -d) VIRTUAL_ENV=1
+    py.test -k "${disabledTests}"
+  '';
+
+  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/default.nix b/nixpkgs/pkgs/development/python-modules/pip/default.nix
new file mode 100644
index 000000000000..f35ed6b3d116
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pip/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, python
+, buildPythonPackage
+, bootstrapped-pip
+, fetchFromGitHub
+, mock
+, scripttest
+, virtualenv
+, pretend
+, pytest
+, setuptools
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "pip";
+  version = "20.3";
+  format = "other";
+
+  src = fetchFromGitHub {
+    owner = "pypa";
+    repo = pname;
+    rev = version;
+    sha256 = "e/2/0MrGY3myELmvuTAbNfXCBuT8kmvz9qTwITdDtQU=";
+    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;
+
+  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..35fbb624e6b7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pipdate/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, isPy27
+, appdirs
+, importlib-metadata
+, requests
+, pytest
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "pipdate";
+  version = "0.5.2";
+  format = "pyproject";
+  disabled = isPy27; # abandoned
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "507065231f2d50b6319d483432cba82aadad78be21b7a2969b5881ed8dee9ab4";
+  };
+
+  nativeBuildInputs = [ wheel ];
+
+  propagatedBuildInputs = [
+    appdirs
+    requests
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  checkInputs = [
+    pytest
+  ];
+
+  checkPhase = ''
+    HOME=$(mktemp -d) pytest test/test_pipdate.py
+  '';
+
+  # tests require network access
+  doCheck = false;
+
+  meta = with lib; {
+    description = "pip update helpers";
+    homepage = "https://github.com/nschloe/pipdate";
+    license = licenses.mit;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..c29847c9f29c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pipx/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, userpath
+, argcomplete
+, packaging
+, importlib-metadata
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pipx";
+  version = "0.16.0.0";
+
+  disabled = pythonOlder "3.6";
+
+  # no tests in the pypi tarball, so we directly fetch from github
+  src = fetchFromGitHub {
+    owner = "pipxproject";
+    repo = pname;
+    rev = version;
+    sha256 = "08mn7vm8iw20pg0gfn491y1jx8wcyjijps6f1hy7ipzd5ckynscn";
+  };
+
+  propagatedBuildInputs = [
+    userpath
+    argcomplete
+    packaging
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  checkInputs = [ pytestCheckHook ];
+
+  preCheck = ''
+    export HOME=$(mktemp -d)
+  '';
+
+  # disable tests, which require internet connection
+  pytestFlagsArray = [ "--ignore=tests/test_install_all_packages.py" ];
+  disabledTests = [
+    "install"
+    "inject"
+    "ensure_null_pythonpath"
+    "missing_interpreter"
+    "cache"
+    "internet"
+    "run"
+    "runpip"
+    "upgrade"
+    "suffix"
+    "legacy_venv"
+    "determination"
+  ];
+
+  meta = with lib; {
+    description =
+      "Install and Run Python Applications in Isolated Environments";
+    homepage = "https://github.com/pipxproject/pipx";
+    license = licenses.mit;
+    maintainers = with maintainers; [ yevhenshymotiuk ];
+  };
+}
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..aae90d2f8b49
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pivy/default.nix
@@ -0,0 +1,48 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub, pkgs, qtbase, qmake, soqt }:
+
+buildPythonPackage rec {
+  pname = "pivy";
+  version = "0.6.5";
+
+  src = fetchFromGitHub {
+    owner = "coin3d";
+    repo = "pivy";
+    rev = version;
+    sha256 = "0vids7sxk8w5vr73xdnf8xdci71a7syl6cd35aiisppbqyyfmykx";
+  };
+
+  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;
+  dontUseCmakeConfigure = true;
+
+  doCheck = false;
+
+  postPatch = ''
+    substituteInPlace 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/pkgconfig/default.nix b/nixpkgs/pkgs/development/python-modules/pkgconfig/default.nix
new file mode 100644
index 000000000000..1b03f720fbcd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pkgconfig/default.nix
@@ -0,0 +1,37 @@
+{ lib, buildPythonPackage, fetchPypi, pkg-config }:
+
+buildPythonPackage rec {
+  pname = "pkgconfig";
+  version = "1.5.1";
+
+  inherit (pkg-config)
+    setupHooks
+    wrapperName
+    suffixSalt
+    targetPrefix
+    baseBinName
+  ;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "97bfe3d981bab675d5ea3ef259045d7919c93897db7d3b59d4e8593cba8d354f";
+  };
+
+
+  propagatedNativeBuildInputs = [ pkg-config ];
+
+  doCheck = false;
+
+  patches = [ ./executable.patch ];
+  postPatch = ''
+    substituteInPlace pkgconfig/pkgconfig.py --replace 'PKG_CONFIG_EXE = "pkg-config"' 'PKG_CONFIG_EXE = "${pkg-config}/bin/${pkg-config.targetPrefix}pkg-config"'
+  '';
+
+  pythonImportsCheck = [ "pkgconfig" ];
+
+  meta = with lib; {
+    description = "Interface Python with pkg-config";
+    homepage = "https://github.com/matze/pkgconfig";
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pkgconfig/executable.patch b/nixpkgs/pkgs/development/python-modules/pkgconfig/executable.patch
new file mode 100644
index 000000000000..79fca7a44f1b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pkgconfig/executable.patch
@@ -0,0 +1,38 @@
+commit d8e0bac0c0d831510683939ec7a7b5bd72192423
+Author: Frederik Rietdijk <fridh@fridh.nl>
+Date:   Sat Jan 5 11:38:28 2019 +0100
+
+    Have a top-level attribute for the executable
+
+diff --git a/pkgconfig/pkgconfig.py b/pkgconfig/pkgconfig.py
+index 3deb97f..e7c5561 100644
+--- a/pkgconfig/pkgconfig.py
++++ b/pkgconfig/pkgconfig.py
+@@ -30,6 +30,9 @@ from functools import wraps
+ from subprocess import call, PIPE, Popen
+ 
+ 
++PKG_CONFIG_EXE = "pkg-config"
++
++
+ def _compare_versions(v1, v2):
+     """
+     Compare two version strings and return -1, 0 or 1 depending on the equality
+@@ -65,7 +68,7 @@ def _convert_error(func):
+ 
+ @_convert_error
+ def _query(package, *options):
+-    pkg_config_exe = os.environ.get('PKG_CONFIG', None) or 'pkg-config'
++    pkg_config_exe = os.environ.get('PKG_CONFIG', None) or PKG_CONFIG_EXE
+     cmd = '{0} {1} {2}'.format(pkg_config_exe, ' '.join(options), package)
+     proc = Popen(shlex.split(cmd), stdout=PIPE, stderr=PIPE)
+     out, err = proc.communicate()
+@@ -84,7 +87,7 @@ def exists(package):
+ 
+     If ``pkg-config`` not on path, raises ``EnvironmentError``.
+     """
+-    pkg_config_exe = os.environ.get('PKG_CONFIG', None) or 'pkg-config'
++    pkg_config_exe = os.environ.get('PKG_CONFIG', None) or PKG_CONFIG_EXE
+     cmd = '{0} --exists {1}'.format(pkg_config_exe, package).split()
+     return call(cmd) == 0
+ 
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..dbf487c5d3aa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pkginfo/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "pkginfo";
+  version = "1.6.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a6a4ac943b496745cec21f14f021bbd869d5e9b4f6ec06918cffea5a2f4b9193";
+  };
+
+  doCheck = false; # I don't know why, but with doCheck = true it fails.
+
+  meta = with lib; {
+    homepage = "https://pypi.python.org/pypi/pkginfo";
+    license = licenses.mit;
+    description = "Query metadatdata from sdists / bdists / installed packages";
+
+    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).
+    '';
+  };
+}
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..8e3e301793aa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pkuseg/default.nix
@@ -0,0 +1,36 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+, cython
+, numpy
+}:
+
+buildPythonPackage rec {
+  pname = "pkuseg";
+  version = "0.0.25";
+
+  disabled = !isPy3k;
+
+  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;
+    maintainers = with maintainers; [ danieldk ];
+  };
+}
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..d674e876b147
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pkutils/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, pythonOlder
+, buildPythonPackage
+, isPy3k
+, fetchFromGitHub
+, semver
+  # Check Inputs
+, nose
+}:
+
+buildPythonPackage rec {
+  pname = "pkutils";
+  version = "1.1.1";
+  disabled = !isPy3k; # some tests using semver fail due to unicode errors on Py2.7
+
+  src = fetchFromGitHub {
+    owner = "reubano";
+    repo = "pkutils";
+    rev = "v${version}";
+    sha256 = "01yaq9sz6vyxk8yiss6hsmy70qj642cr2ifk0sx1mlh488flcm62";
+  };
+
+  propagatedBuildInputs = [ semver ];
+
+  # Remove when https://github.com/reubano/pkutils/pull/4 merged
+  postPatch = ''
+    substituteInPlace requirements.txt --replace "semver>=2.2.1,<2.7.3" "semver"
+  '';
+
+  checkInputs = [ nose ];
+  pythonImportsCheck = [ "pkutils" ];
+
+  checkPhase = "nosetests";
+
+  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..9e2c66d9d1ed
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/plac/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, python
+}:
+buildPythonPackage rec {
+  pname = "plac";
+  version = "1.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ca03587234e5bdd2a3fa96f19a04a01ebb5b0cd66d48ecb5a54d42bc9b287320";
+  };
+
+  checkPhase = ''
+      cd doc
+      ${python.interpreter} -m unittest discover -p "*test_plac*"
+    '';
+
+  meta = with lib; {
+    description = "Parsing the Command Line the Easy Way";
+    homepage = "https://github.com/micheles/plac";
+    license = licenses.bsdOriginal;
+    maintainers = with maintainers; [ sdll ];
+    };
+}
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..aa329953a391
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/plaid-python/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, fetchPypi, requests, pytest }:
+
+buildPythonPackage rec {
+  version = "7.2.0";
+  pname = "plaid-python";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "bd599b384f94d8883344925f0ef223e1ab50f218872434aa40ba8c645937699c";
+  };
+
+  checkInputs = [ pytest ];
+
+  # Integration tests require API keys and internet access
+  checkPhase = "py.test -rxs ./tests/unit";
+
+  propagatedBuildInputs = [ requests ];
+
+  meta = {
+    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 = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ bhipple ];
+  };
+}
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..262bdceb5db7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/plaster-pastedeploy/default.nix
@@ -0,0 +1,30 @@
+{ buildPythonPackage, fetchPypi, fetchpatch
+, plaster, PasteDeploy
+, pytest, pytestcov
+}:
+
+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";
+    })
+  ];
+
+  checkPhase = ''
+    py.test
+  '';
+
+  propagatedBuildInputs = [ plaster PasteDeploy ];
+  checkInputs = [ pytest pytestcov ];
+}
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..82aaebb10039
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/plaster/default.nix
@@ -0,0 +1,19 @@
+{ buildPythonPackage, fetchPypi
+, pytest, pytestcov
+}:
+
+buildPythonPackage rec {
+  pname = "plaster";
+  version = "1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "8351c7c7efdf33084c1de88dd0f422cbe7342534537b553c49b857b12d98c8c3";
+  };
+
+  checkPhase = ''
+    py.test
+  '';
+
+  checkInputs = [ pytest pytestcov ];
+}
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..589a8f3db819
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/playsound/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+}:
+
+buildPythonPackage rec {
+  pname = "playsound";
+  version = "1.2.2";
+
+  src = fetchFromGitHub {
+    owner = "TaylorSMarks";
+    repo = "playsound";
+    rev = "907f1fe73375a2156f7e0900c4b42c0a60fa1d00";
+    sha256 = "1fh3m115h0c57lj2pfhhqhmsh5awzblb7csi1xc5a6f6slhl059k";
+  };
+
+  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/plexapi/default.nix b/nixpkgs/pkgs/development/python-modules/plexapi/default.nix
new file mode 100644
index 000000000000..b9a4fb34bf65
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/plexapi/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, fetchFromGitHub, requests
+, tqdm, websocket_client, pytest, pillow, isPy27 }:
+
+buildPythonPackage rec {
+  pname = "PlexAPI";
+  version = "4.1.2";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "pkkid";
+    repo = "python-plexapi";
+    rev = version;
+    sha256 = "1l955q1q6lljq3bmyiayr33gzxrlw16xdwgjdaflznvyg16fcjkk";
+  };
+
+  propagatedBuildInputs = [ requests tqdm websocket_client ];
+
+  checkInputs = [ pytest pillow ];
+
+  meta = with lib; {
+    homepage = "https://github.com/pkkid/python-plexapi";
+    description = "Python bindings for the Plex API";
+    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..91407a907a44
--- /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.5";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "jjlawren";
+    repo = "python-plexauth";
+    rev = "v${version}";
+    sha256 = "1wbrn22iywl4ccz64r3w3f17k0r7vi2cqkqd2mrdkx5xqhscn9hz";
+  };
+
+  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..47e7778fc0fe
--- /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.12";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "jjlawren";
+    repo = "python-plexwebsocket";
+    rev = "v${version}";
+    sha256 = "1xdzb268c71yb25a5mk4g2jrbq4dv8bynfirs7p4n8a51p030dz6";
+  };
+
+  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..c951800454dd
--- /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.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "082b03aebe81d0bdcc44a917a795ae60d3add2c2abbee11e7c335fb13d5e7ca7";
+  };
+
+  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..f11cf1c0984c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/plotly/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, decorator
+, nbformat
+, pytz
+, requests
+, retrying
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "plotly";
+  version = "4.13.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "20df14f7883807f57d96ac245841e086a1799f2c2778462a7f3bca704e369c66";
+  };
+
+  propagatedBuildInputs = [
+    decorator
+    nbformat
+    pytz
+    requests
+    retrying
+    six
+  ];
+
+  # No tests in archive
+  doCheck = false;
+
+  meta = {
+    description = "Python plotting library for collaborative, interactive, publication-quality graphs";
+    homepage = "https://plot.ly/python/";
+    license = with lib.licenses; [ mit ];
+  };
+}
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..ecb01f252f43
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pluggy/default.nix
@@ -0,0 +1,34 @@
+{ buildPythonPackage
+, lib
+, fetchPypi
+, setuptools_scm
+, importlib-metadata
+}:
+
+buildPythonPackage rec {
+  pname = "pluggy";
+  version = "0.13.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0";
+  };
+
+  checkPhase = ''
+    py.test
+  '';
+
+  # To prevent infinite recursion with pytest
+  doCheck = false;
+
+  nativeBuildInputs = [ setuptools_scm ];
+
+  propagatedBuildInputs = [ 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; [ ];
+  };
+}
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..956ea1b720ae
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pluginbase/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv, fetchPypi, buildPythonPackage, pytest }:
+
+buildPythonPackage rec {
+  version = "1.0.0";
+  pname = "pluginbase";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "497894df38d0db71e1a4fbbfaceb10c3ef49a3f95a0582e11b75f8adaa030005";
+  };
+
+  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/plumbum/default.nix b/nixpkgs/pkgs/development/python-modules/plumbum/default.nix
new file mode 100644
index 000000000000..e08537ff1abf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/plumbum/default.nix
@@ -0,0 +1,19 @@
+{ buildPythonPackage
+, fetchPypi
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "plumbum";
+  version = "1.6.9";
+
+  checkInputs = [ pytest ];
+
+  # No tests in archive
+  doCheck = false;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1ps37vamqav6p277dlp51jnacd5q4x4z1x8y0nfjw3y8jsfy3f8n";
+  };
+}
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/plyfile/default.nix b/nixpkgs/pkgs/development/python-modules/plyfile/default.nix
new file mode 100644
index 000000000000..b0936a50baa7
--- /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.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "59a25845d00a51098e6c9147c3c96ce89ad97395e256a4fabb4aed7cf7db5541";
+  };
+
+  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..d8537d68158a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/plyvel/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, pkgs
+, pytest
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "plyvel";
+  version = "1.3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a7a09033a0fd33ca47094e8bbe01714abfcf644f4b7a337d3970e91a2599e2c4";
+  };
+
+  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/pocket/default.nix b/nixpkgs/pkgs/development/python-modules/pocket/default.nix
new file mode 100644
index 000000000000..3599d3dec55d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pocket/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv
+, 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..d5d4e36d3a37
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/poetry-core/default.nix
@@ -0,0 +1,56 @@
+{ lib, buildPythonPackage, fetchFromGitHub, pythonOlder, isPy27
+, importlib-metadata
+, intreehooks
+, isort
+, pathlib2
+, pep517
+, pytest-mock
+, pytestCheckHook
+, tomlkit
+, typing
+, virtualenv
+}:
+
+buildPythonPackage rec {
+  pname = "poetry-core";
+  version = "1.0.0";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "python-poetry";
+    repo = pname;
+    rev = version;
+    sha256 = "02pqkwzbg43xz2zsw8q7m0sfkj8wbw07in83gy0bk0znhljhp0vw";
+  };
+
+  nativeBuildInputs = [
+    intreehooks
+  ];
+
+  propagatedBuildInputs = lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ] ++ lib.optionals isPy27 [
+    pathlib2
+    typing
+  ];
+
+  checkInputs = [
+    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" ];
+
+  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/default.nix b/nixpkgs/pkgs/development/python-modules/poetry/default.nix
new file mode 100644
index 000000000000..1519187d174b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/poetry/default.nix
@@ -0,0 +1,107 @@
+{ lib, buildPythonPackage, fetchFromGitHub, isPy27, pythonOlder, fetchpatch
+, cachecontrol
+, cachy
+, cleo
+, clikit
+, html5lib
+, httpretty
+, importlib-metadata
+, intreehooks
+, keyring
+, lockfile
+, pexpect
+, pkginfo
+, poetry-core
+, pytestCheckHook
+, pytestcov
+, pytest-mock
+, requests
+, requests-toolbelt
+, shellingham
+, tomlkit
+, virtualenv
+}:
+
+buildPythonPackage rec {
+  pname = "poetry";
+  version = "1.1.4";
+  format = "pyproject";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "python-poetry";
+    repo = pname;
+    rev = version;
+    sha256 = "0lx3qpz5dad0is7ki5a4vxphvc8cm8fnv4bmrx226a6nvvaj6ahs";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+     --replace 'importlib-metadata = {version = "^1.6.0", python = "<3.8"}' \
+       'importlib-metadata = {version = ">=1.6,<2", python = "<3.8"}'
+  '';
+
+  nativeBuildInputs = [ intreehooks ];
+
+  propagatedBuildInputs = [
+    cachecontrol
+    cachy
+    cleo
+    clikit
+    html5lib
+    keyring
+    lockfile
+    pexpect
+    pkginfo
+    poetry-core
+    requests
+    requests-toolbelt
+    shellingham
+    tomlkit
+    virtualenv
+  ] ++ 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 pytestcov ];
+  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"
+  ];
+
+  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=";
+    })
+  ];
+
+  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/polib/default.nix b/nixpkgs/pkgs/development/python-modules/polib/default.nix
new file mode 100644
index 000000000000..f7c4e1139a86
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/polib/default.nix
@@ -0,0 +1,20 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "polib";
+  version = "1.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "fad87d13696127ffb27ea0882d6182f1a9cf8a5e2b37a587751166c51e5a332a";
+  };
+
+  # 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/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..7595730eb31b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pomegranate/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub, numpy, scipy, cython, networkx, joblib, nose, pyyaml }:
+
+buildPythonPackage rec {
+  pname = "pomegranate";
+  version = "0.11.2";
+
+  src = fetchFromGitHub {
+    repo = pname;
+    owner = "jmschrei";
+    rev = "v${version}";
+    sha256 = "070ciwww1lhjmfwd5n1kcwgxwbgdfvmhjs4l156bnf08z9dlrafl";
+  };
+
+  propagatedBuildInputs = [ numpy scipy cython networkx joblib pyyaml ];
+
+  checkInputs = [ nose ];
+
+  meta = with lib; {
+    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/pony/default.nix b/nixpkgs/pkgs/development/python-modules/pony/default.nix
new file mode 100644
index 000000000000..7a734927ee1e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pony/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv, python, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "pony";
+  version = "0.7.14";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "2f01e84e79ea7a14040225cb6c079bb266e7ba147346356c266490b18c77ce82";
+  };
+
+  doCheck = true;
+
+  # stripping the tests
+  postInstall = ''
+    rm -rf $out/${python.sitePackages}/pony/orm/tests
+  '';
+
+  meta = with lib; {
+    description = "Pony is a Python ORM with beautiful query syntax";
+    homepage = "https://ponyorm.org/";
+    maintainers = with maintainers; [ d-goldin xvapx ];
+    license = licenses.asl20;
+  };
+}
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..282239d9890b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pooch/default.nix
@@ -0,0 +1,50 @@
+{ lib, stdenv
+, buildPythonPackage
+, isPy27
+, fetchPypi
+, pytestCheckHook
+, packaging
+, appdirs
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "pooch";
+  version = "1.3.0";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "30d448e825904e2d763bbbe418831a788813c32f636b21c8d60ee5f474532898";
+  };
+
+  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/poolsense/default.nix b/nixpkgs/pkgs/development/python-modules/poolsense/default.nix
new file mode 100644
index 000000000000..0ffdf8952277
--- /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.0.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "09y4fq0gdvgkfsykpxnvmfv92dpbknnq5v82spz43ak6hjnhgcyp";
+  };
+
+  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..4aaaea406774
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/poppler-qt5/default.nix
@@ -0,0 +1,42 @@
+{ buildPythonPackage, fetchPypi, lib, stdenv, sip, qtbase, pyqt5, poppler, pkg-config, fetchpatch
+, substituteAll
+}:
+
+buildPythonPackage rec {
+  pname = "python-poppler-qt5";
+  version = "0.24.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0l69llw1fzwz8y90q0qp9q5pifbrqjjbwii7di54dwghw5fc6w1r";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./poppler-include-dir.patch;
+      poppler_include_dir = "${poppler.dev}/include/poppler";
+    })
+    (fetchpatch {
+      url = "https://github.com/wbsoft/python-poppler-qt5/commit/faf4d1308f89560b0d849671226e3080dfc72e79.patch";
+      sha256 = "18krhh6wzsnpxzlzv02nginb1vralla8ai24zqk10nc4mj6fkj86";
+    })
+  ];
+
+  setupPyBuildFlags = [
+    "--pyqt-sip-dir ${pyqt5}/share/sip/PyQt5"
+    "--qt-include-dir ${qtbase.dev}/include"
+  ];
+
+  buildInputs = [ qtbase.dev poppler ];
+  nativeBuildInputs = [ pkg-config ];
+  propagatedBuildInputs = [ sip pyqt5.dev ];
+
+  # no tests, just bindings for `poppler_qt5`
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/wbsoft/python-poppler-qt5";
+    license = licenses.gpl2;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/poppler-qt5/poppler-include-dir.patch b/nixpkgs/pkgs/development/python-modules/poppler-qt5/poppler-include-dir.patch
new file mode 100644
index 000000000000..7106c1d6352c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/poppler-qt5/poppler-include-dir.patch
@@ -0,0 +1,12 @@
+diff --git a/setup.py b/setup.py
+index 59a75b0..0a73268 100644
+--- a/setup.py
++++ b/setup.py
+@@ -169,6 +169,7 @@ class build_ext(build_ext_base):
+                              'Please specify via --pyqt-sip-flags=')
+ 
+         self.include_dirs += (self.qt_include_dir,
++                              '@poppler_include_dir@',
+                               os.path.join(self.qt_include_dir, 'QtCore'),
+                               os.path.join(self.qt_include_dir, 'QtGui'),
+                               os.path.join(self.qt_include_dir, 'QtXml'))
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..d79f6201b6fd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/portalocker/default.nix
@@ -0,0 +1,41 @@
+{ lib, buildPythonPackage, fetchPypi, fetchpatch
+, sphinx
+, pytest
+, pytestcov
+, pytest-flake8
+}:
+
+buildPythonPackage rec {
+  version = "1.7.0";
+  pname = "portalocker";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1p32v16va780mjjdbyp3v702aqg5s618khlila7bdyynis1n84q9";
+  };
+
+  patches = [
+    # remove pytest-flakes from test dependencies
+    # merged into master, remove > 1.7.0 release
+    (fetchpatch {
+      url = "https://github.com/WoLpH/portalocker/commit/42e4c0a16bbc987c7e33b5cbc7676a63a164ceb5.patch";
+      sha256 = "01mlr41nhh7mh3qhqy5fhp3br4nps745iy4ns9fjcnm5xhabg5rr";
+      excludes = [ "pytest.ini" ];
+    })
+  ];
+
+  checkInputs = [
+    sphinx
+    pytest
+    pytestcov
+    pytest-flake8
+  ];
+
+  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/black-19.10b0.patch b/nixpkgs/pkgs/development/python-modules/portend/black-19.10b0.patch
new file mode 100644
index 000000000000..e781139e3192
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/portend/black-19.10b0.patch
@@ -0,0 +1,13 @@
+diff --git a/test_portend.py b/test_portend.py
+index b2de8c2..3f90276 100644
+--- a/test_portend.py
++++ b/test_portend.py
+@@ -21,7 +21,7 @@ def socket_infos():
+ 
+ 
+ def id_for_info(info):
+-    af, = info[:1]
++    (af,) = info[:1]
+     return str(af)
+ 
+ 
\ No newline at end of file
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..10b30d05fa3e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/portend/default.nix
@@ -0,0 +1,35 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi
+, pytest, setuptools_scm, tempora, pytest-black, pytestcov }:
+
+buildPythonPackage rec {
+  pname = "portend";
+  version = "2.7.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ac0e57ae557f75dc47467579980af152e8f60bc2139547eff8469777d9110379";
+  };
+
+  postPatch = ''
+    substituteInPlace pytest.ini --replace "--flake8" ""
+  '';
+
+  nativeBuildInputs = [ setuptools_scm ];
+
+  propagatedBuildInputs = [ tempora ];
+
+  checkInputs = [ pytest pytest-black pytestcov ];
+
+  checkPhase = ''
+    py.test --deselect=test_portend.py::TestChecker::test_check_port_listening
+  '';
+
+  # 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..30ac00155604
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/portpicker/default.nix
@@ -0,0 +1,21 @@
+{ buildPythonPackage
+, lib
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "portpicker";
+  version = "1.3.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0rwn5ca7ns3yh6bp785zdd2l4018ccpd5i0m2d1fsd9nhxvcgkfj";
+  };
+
+  meta = {
+    description = "A library to choose unique available network ports.";
+    homepage = "https://github.com/google/python_portpicker";
+    license = lib.licenses.asl20;
+    maintainers = with lib.maintainers; [ danharaj ];
+  };
+}
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..2fb6128dc1b1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/posix_ipc/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv
+, 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/poster3/default.nix b/nixpkgs/pkgs/development/python-modules/poster3/default.nix
new file mode 100644
index 000000000000..09e8055bdd91
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/poster3/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+, paste
+, webob
+, pyopenssl
+}:
+
+buildPythonPackage rec {
+  pname = "poster3";
+  version = "0.8.1";
+  format = "wheel"; # only redistributable available
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version format;
+    python = "py3";
+    sha256 = "1b27d7d63e3191e5d7238631fc828e4493590e94dcea034e386c079d853cce14";
+  };
+
+  checkInputs = [
+    paste
+    webob
+    pyopenssl
+  ];
+
+  meta = with lib; {
+    description = "Streaming HTTP uploads and multipart/form-data encoding";
+    homepage = "https://atlee.ca/software/poster/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ WhittlesJr ];
+  };
+}
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..9f2774b9a607
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/potr/default.nix
@@ -0,0 +1,20 @@
+{ lib, stdenv, 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..d1998faf6b64
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/power/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv
+, 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; {
+    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/default.nix b/nixpkgs/pkgs/development/python-modules/powerline/default.nix
new file mode 100644
index 000000000000..5834dd760369
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/powerline/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, fetchFromGitHub
+, python
+, buildPythonPackage
+, socat
+, psutil
+, hglib
+, pygit2
+, pyuv
+, i3ipc
+}:
+
+# TODO: bzr support is missing because nixpkgs switched to `breezy`
+
+buildPythonPackage rec {
+  version  = "2.8.1";
+  pname = "powerline";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = version;
+    sha256 = "0xscckcbw75pbcl4546ndrjs4682pn2sqqrd6qvqm0s6zswg7a0y";
+  };
+
+  propagatedBuildInputs = [
+    socat
+    psutil
+    hglib
+    pygit2
+    pyuv
+    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..e7013154f998
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pox/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "pox";
+  version = "0.2.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "06afe1a4a1dbf8b47f7ad5a3c1d8ada9104c64933a1da11338269a2bd8642778";
+  };
+
+  meta = with lib; {
+    description = "Utilities for filesystem exploration and automated builds";
+    license = licenses.bsd3;
+    homepage = "https://github.com/uqfoundation/pox/";
+  };
+
+}
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..d600e46c6b42
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/poyo/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv
+, 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/ppft/default.nix b/nixpkgs/pkgs/development/python-modules/ppft/default.nix
new file mode 100644
index 000000000000..ba23948fdb8c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ppft/default.nix
@@ -0,0 +1,32 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, python
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "ppft";
+  version = "1.6.6.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "9e2173042edd5cc9c7bee0d7731873f17fcdce0e42e4b7ab68857d0de7b631fc";
+  };
+
+  propagatedBuildInputs = [ six ];
+
+  # darwin seems to hang
+  doCheck = !stdenv.isDarwin;
+  checkPhase = ''
+    cd examples
+    ${python.interpreter} -m ppft.tests
+  '';
+
+  meta = with lib; {
+    description = "Distributed and parallel python";
+    homepage = "https://github.com/uqfoundation";
+    license = licenses.bsd3;
+  };
+
+}
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..de37c338bfa2
--- /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.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0dk8l5r3f2jbkkasddvxwvhlq35pjsiirh801lrapv8lb16r2qmr";
+  };
+
+  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..00542c6e90e1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ppscore/default.nix
@@ -0,0 +1,35 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, isPy27
+, pandas
+, scikitlearn
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "ppscore";
+  version = "1.1.1";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "8080labs";
+    repo = pname;
+    rev = version;
+    sha256 = "11y6axhj0nlagf7ax6gas1g06krrmddb1jlmf0mmrmyi7z0vldk2";
+  };
+
+  checkInputs = [ pytestCheckHook ];
+
+  propagatedBuildInputs = [
+    pandas
+    scikitlearn
+  ];
+
+  meta = with lib; {
+    description = "A 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..758cd0a78464
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/prance/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, chardet
+, pyyaml
+, requests
+, six
+, semver
+, pytest
+, pytestcov
+, pytestrunner
+, sphinx
+, openapi-spec-validator
+}:
+
+buildPythonPackage rec {
+  pname = "prance";
+  version = "0.20.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f7e98b0f7e8ef0dd581c40d8a3e869e15e74b08026b862c3212447f8aa2426a7";
+  };
+
+  buildInputs = [
+    pytestrunner
+  ];
+
+  propagatedBuildInputs = [
+    chardet
+    pyyaml
+    requests
+    six
+    semver
+  ];
+
+  checkInputs = [
+    pytest
+    pytestcov
+    openapi-spec-validator
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "tests_require = dev_require," "tests_require = None,"
+  '';
+
+  # many tests require network connection
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Resolving Swagger/OpenAPI 2.0 and 3.0.0 Parser";
+    homepage = "https://github.com/jfinkhaeuser/prance";
+    license = licenses.mit;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/praw/6.3.nix b/nixpkgs/pkgs/development/python-modules/praw/6.3.nix
new file mode 100644
index 000000000000..00182eda0379
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/praw/6.3.nix
@@ -0,0 +1,53 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub
+, betamax
+, betamax-serializers
+, betamax-matchers
+, mock
+, six
+, pytestrunner
+, prawcore
+, pytest
+, requests-toolbelt
+, update_checker
+, websocket_client
+}:
+
+buildPythonPackage rec {
+  pname = "praw";
+  version = "6.3.1";
+
+  src = fetchFromGitHub {
+    owner = "praw-dev";
+    repo = "praw";
+    rev = "v${version}";
+    sha256 = "0by89aw7m803dvjcc33m9390msjm6v5v8g3k8ink9gfm421lw8ky";
+  };
+
+  nativeBuildInputs = [
+    pytestrunner
+  ];
+
+  propagatedBuildInputs = [
+    mock
+    prawcore
+    update_checker
+    websocket_client
+  ];
+
+  checkInputs = [
+    betamax
+    betamax-serializers
+    betamax-matchers
+    mock
+    pytest
+    requests-toolbelt
+    six
+  ];
+
+  meta = with lib; {
+    description = "Python Reddit API wrapper";
+    homepage = "https://praw.readthedocs.org/";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/praw/default.nix b/nixpkgs/pkgs/development/python-modules/praw/default.nix
new file mode 100644
index 000000000000..61b869e87fb2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/praw/default.nix
@@ -0,0 +1,53 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub
+, betamax
+, betamax-serializers
+, betamax-matchers
+, mock
+, six
+, pytestrunner
+, prawcore
+, pytest
+, requests-toolbelt
+, update_checker
+, websocket_client
+}:
+
+buildPythonPackage rec {
+  pname = "praw";
+  version = "7.1.0";
+
+  src = fetchFromGitHub {
+    owner = "praw-dev";
+    repo = "praw";
+    rev = "v${version}";
+    sha256 = "07wyn2pa80ps55kk66rvf4daqyn3y5lzxhx6qh1lpn3p2bacbw9h";
+  };
+
+  nativeBuildInputs = [
+    pytestrunner
+  ];
+
+  propagatedBuildInputs = [
+    mock
+    prawcore
+    update_checker
+    websocket_client
+  ];
+
+  checkInputs = [
+    betamax
+    betamax-serializers
+    betamax-matchers
+    mock
+    pytest
+    requests-toolbelt
+    six
+  ];
+
+  meta = with lib; {
+    description = "Python Reddit API wrapper";
+    homepage = "https://praw.readthedocs.org/";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ ];
+  };
+}
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..533c31d87ce2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/prawcore/default.nix
@@ -0,0 +1,42 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, isPy27
+, requests
+, testfixtures, mock, requests_toolbelt
+, betamax, betamax-serializers, betamax-matchers, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "prawcore";
+  version = "1.5.0";
+  disabled = isPy27; # see https://github.com/praw-dev/prawcore/pull/101
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1f1eafc8a65d671f9892354f73142014fbb5d3a9ee621568c662d0a354e0578b";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  checkInputs = [
+    testfixtures
+    mock
+    betamax
+    betamax-serializers
+    betamax-matchers
+    requests_toolbelt
+    pytest
+  ];
+
+  checkPhase = ''
+    pytest
+  '';
+
+  meta = with lib; {
+    description = "Low-level communication layer for PRAW";
+    homepage = "https://praw.readthedocs.org/";
+    license = licenses.gpl3;
+    platforms = platforms.all;
+    maintainers = with maintainers; [ ];
+  };
+}
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..f5fe7ff96b84
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pre-commit-hooks/default.nix
@@ -0,0 +1,43 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, fetchPypi
+, git
+, isPy27
+, lib
+, pytestCheckHook
+, ruamel_yaml
+, toml
+}:
+
+buildPythonPackage rec {
+  pname = "pre-commit-hooks";
+  version = "3.3.0";
+  disabled = isPy27;
+
+  # fetchPypi does not provide tests
+  src = fetchFromGitHub {
+    owner = "pre-commit";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1sppwcqsbr9gv2cpjslngcbggsxvdr84zgrin94yjr40jgkjzdpq";
+  };
+
+  propagatedBuildInputs = [ toml ruamel_yaml ];
+  checkInputs = [ git pytestCheckHook ];
+
+  # 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"
+  '';
+
+  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/pre-commit/default.nix b/nixpkgs/pkgs/development/python-modules/pre-commit/default.nix
new file mode 100644
index 000000000000..88fb6e3abf91
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pre-commit/default.nix
@@ -0,0 +1,63 @@
+{ lib, fetchPypi, buildPythonPackage, pythonOlder
+, aspy-yaml
+, cached-property
+, cfgv
+, futures
+, identify
+, importlib-metadata
+, importlib-resources
+, isPy27
+, nodeenv
+, python
+, six
+, toml
+, virtualenv
+}:
+
+buildPythonPackage rec {
+  pname = "pre-commit";
+  version = "2.7.1";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit version;
+    pname = "pre_commit";
+    sha256 = "0w2a104yhbw1z92rcwpq0gdjsxvr2bwx5ry5xhlf2psnfkjx6ky5";
+  };
+
+  patches = [
+    ./hook-tmpl-use-the-hardcoded-path-to-pre-commit.patch
+    ./languages-use-the-hardcoded-path-to-python-binaries.patch
+  ];
+
+  propagatedBuildInputs = [
+    aspy-yaml
+    cached-property
+    cfgv
+    identify
+    nodeenv
+    six
+    toml
+    virtualenv
+  ] ++ lib.optional (pythonOlder "3.8") importlib-metadata
+    ++ lib.optional (pythonOlder "3.7") importlib-resources;
+
+  # slow and impure
+  doCheck = false;
+
+  preFixup = ''
+    substituteInPlace $out/${python.sitePackages}/pre_commit/resources/hook-tmpl \
+      --subst-var-by pre-commit $out
+    substituteInPlace $out/${python.sitePackages}/pre_commit/languages/python.py \
+      --subst-var-by virtualenv ${virtualenv}
+    substituteInPlace $out/${python.sitePackages}/pre_commit/languages/node.py \
+      --subst-var-by nodeenv ${nodeenv}
+  '';
+
+  meta = with lib; {
+    description = "A framework for managing and maintaining multi-language pre-commit hooks";
+    homepage = "https://pre-commit.com/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ borisbabic ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pre-commit/hook-tmpl-use-the-hardcoded-path-to-pre-commit.patch b/nixpkgs/pkgs/development/python-modules/pre-commit/hook-tmpl-use-the-hardcoded-path-to-pre-commit.patch
new file mode 100644
index 000000000000..4c1b6421e090
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pre-commit/hook-tmpl-use-the-hardcoded-path-to-pre-commit.patch
@@ -0,0 +1,15 @@
+diff --git a/pre_commit/resources/hook-tmpl b/pre_commit/resources/hook-tmpl
+index 299144e..6d12543 100755
+--- a/pre_commit/resources/hook-tmpl
++++ b/pre_commit/resources/hook-tmpl
+@@ -25,8 +25,8 @@ ARGS.append('--')
+ ARGS.extend(sys.argv[1:])
+
+ DNE = '`pre-commit` not found.  Did you forget to activate your virtualenv?'
+-if os.access(INSTALL_PYTHON, os.X_OK):
+-    CMD = [INSTALL_PYTHON, '-mpre_commit']
++if os.access('@pre-commit@/bin/pre-commit', os.X_OK):
++    CMD = ['@pre-commit@/bin/pre-commit']
+ elif which('pre-commit'):
+     CMD = ['pre-commit']
+ else:
diff --git a/nixpkgs/pkgs/development/python-modules/pre-commit/languages-use-the-hardcoded-path-to-python-binaries.patch b/nixpkgs/pkgs/development/python-modules/pre-commit/languages-use-the-hardcoded-path-to-python-binaries.patch
new file mode 100644
index 000000000000..c1bead48b345
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pre-commit/languages-use-the-hardcoded-path-to-python-binaries.patch
@@ -0,0 +1,26 @@
+diff --git a/pre_commit/languages/node.py b/pre_commit/languages/node.py
+index 26f4919..4885ec1 100644
+--- a/pre_commit/languages/node.py
++++ b/pre_commit/languages/node.py
+@@ -82,7 +82,7 @@ def install_environment(
+         envdir = fr'\\?\{os.path.normpath(envdir)}'
+     with clean_path_on_failure(envdir):
+         cmd = [
+-            sys.executable, '-mnodeenv', '--prebuilt', '--clean-src', envdir,
++            '@nodeenv@/bin/nodeenv', '--prebuilt', '--clean-src', envdir,
+         ]
+         if version != C.DEFAULT:
+             cmd.extend(['-n', version])
+diff --git a/pre_commit/languages/python.py b/pre_commit/languages/python.py
+index e17376e..0c1d2ab 100644
+--- a/pre_commit/languages/python.py
++++ b/pre_commit/languages/python.py
+@@ -204,7 +204,7 @@ def install_environment(
+ ) -> None:
+     envdir = prefix.path(helpers.environment_dir(ENVIRONMENT_DIR, version))
+     python = norm_version(version)
+-    venv_cmd = (sys.executable, '-mvirtualenv', envdir, '-p', python)
++    venv_cmd = ('@virtualenv@/bin/virtualenv', envdir, '-p', python)
+     install_cmd = ('python', '-mpip', 'install', '.', *additional_dependencies)
+
+     with clean_path_on_failure(envdir):
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..199a6804ea98
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/precis-i18n/default.nix
@@ -0,0 +1,20 @@
+{ lib, buildPythonPackage, fetchPypi, isPy3k }:
+
+buildPythonPackage rec {
+  pname = "precis-i18n";
+  version = "1.0.0";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    pname = "precis_i18n";
+    inherit version;
+    sha256 = "0gjhvwd8aifx94rl1ag08vlmndyx2q3fkyqb0c4i46x3p2bc2yi2";
+  };
+
+  meta = {
+    homepage = "https://github.com/byllyfish/precis_i18n";
+    description = "Internationalized usernames and passwords";
+    license = lib.licenses.mit;
+  };
+}
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..a2144f303be7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/preggy/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv, 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..c69ec9a05a1f
--- /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.7.0";
+  disabled = isPy27; # no longer compatible with urllib
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "5eec9603e84cee583a390de69c75192e50d76e38ef0292b027bd64923766aca7";
+  };
+
+  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/preshed/default.nix b/nixpkgs/pkgs/development/python-modules/preshed/default.nix
new file mode 100644
index 000000000000..5d75c95d770b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/preshed/default.nix
@@ -0,0 +1,39 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, murmurhash
+, pytest
+, cython
+, cymem
+, python
+}:
+buildPythonPackage rec {
+  pname = "preshed";
+  version = "3.0.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "13a779205d55ce323976ac06df597f9ec2d6f0563ebcf5652176cf4520c7d540";
+  };
+
+  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; [ sdll ];
+    };
+}
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..4fe726591e60
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pretend/default.nix
@@ -0,0 +1,19 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "pretend";
+  version = "1.0.9";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "c90eb810cde8ebb06dafcb8796f9a95228ce796531bc806e794c2f4649aa1b10";
+  };
+
+  # No tests in archive
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/alex/pretend";
+    license = licenses.bsd3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/prettytable/1.nix b/nixpkgs/pkgs/development/python-modules/prettytable/1.nix
new file mode 100644
index 000000000000..5b7457af9bf7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/prettytable/1.nix
@@ -0,0 +1,37 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, glibcLocales
+, setuptools_scm
+, wcwidth
+}:
+
+buildPythonPackage rec {
+  pname = "prettytable";
+  version = "1.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0wcpp1nkicrswb353yn6xd2x535cpif62nw5rgz33c1wj0wzbdvb";
+  };
+
+  nativeBuildInputs = [ setuptools_scm ];
+  buildInputs = [ glibcLocales ];
+
+  propagatedBuildInputs = [ wcwidth ];
+
+  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/prettytable/default.nix b/nixpkgs/pkgs/development/python-modules/prettytable/default.nix
new file mode 100644
index 000000000000..5a15cfd24eb0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/prettytable/default.nix
@@ -0,0 +1,37 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, glibcLocales
+, setuptools_scm
+, wcwidth
+}:
+
+buildPythonPackage rec {
+  pname = "prettytable";
+  version = "2.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "e37acd91976fe6119172771520e58d1742c8479703489321dc1d9c85e7259922";
+  };
+
+  nativeBuildInputs = [ setuptools_scm ];
+  buildInputs = [ glibcLocales ];
+
+  propagatedBuildInputs = [ wcwidth ];
+
+  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/primer3/default.nix b/nixpkgs/pkgs/development/python-modules/primer3/default.nix
new file mode 100644
index 000000000000..e8aa83ed94d9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/primer3/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, cython
+, click
+}:
+
+buildPythonPackage rec {
+  pname = "primer3";
+  version = "0.6.1";
+
+  src = fetchFromGitHub {
+    owner = "libnano";
+    repo = "primer3-py";
+    rev = version;
+    sha256 = "1glybwp9w2m1ydvaphr41gj31d8fvlh40s35galfbjqa563si72g";
+  };
+
+  nativeBuildInputs = [ cython ];
+
+  # 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/deadline.patch b/nixpkgs/pkgs/development/python-modules/priority/deadline.patch
new file mode 100644
index 000000000000..f028953c28ab
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/priority/deadline.patch
@@ -0,0 +1,39 @@
+From 9d933c3c6535c1c63291e3d35f4ada9135d422df Mon Sep 17 00:00:00 2001
+From: Alyssa Ross <hi@alyssa.is>
+Date: Mon, 11 Mar 2019 02:08:43 +0000
+Subject: [PATCH] Allow test_period_of_repetition to be slow
+
+Recent versions of hypothesis default to a 200ms timeout, which wasn't
+enough for my Thinkpad X220 to run this test. I've increased the timeout
+for this single test to hopefully a reasonable amount for older
+hardware.
+
+(cherry picked from commit 752beb3a32b59f54168816da531c9d2a387f9715)
+---
+ test/test_priority.py | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/test/test_priority.py b/test/test_priority.py
+index c98a28d..013ce30 100644
+--- a/test/test_priority.py
++++ b/test/test_priority.py
+@@ -12,7 +12,7 @@ import itertools
+
+ import pytest
+
+-from hypothesis import given
++from hypothesis import given, settings
+ from hypothesis.strategies import (
+     integers, lists, tuples, sampled_from
+ )
+@@ -489,6 +489,7 @@ class TestPriorityTreeOutput(object):
+     fairness and equidistribution.
+     """
+     @given(STREAMS_AND_WEIGHTS)
++    @settings(deadline=None)
+     def test_period_of_repetition(self, streams_and_weights):
+         """
+         The period of repetition of a priority sequence is given by the sum of
+--
+2.19.2
+
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..a699f6ff812f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/priority/default.nix
@@ -0,0 +1,28 @@
+{ lib, buildPythonPackage, fetchPypi, pytest, hypothesis }:
+
+buildPythonPackage rec {
+  pname = "priority";
+  version = "1.3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1gpzn9k9zgks0iw5wdmad9b4dry8haiz2sbp6gycpjkzdld9dhbb";
+  };
+
+  patches = [
+    # https://github.com/python-hyper/priority/pull/135
+    ./deadline.patch
+  ];
+
+  checkInputs = [ pytest hypothesis ];
+  checkPhase = ''
+    PYTHONPATH="src:$PYTHONPATH" pytest
+  '';
+
+  meta = with lib; {
+    homepage = "https://python-hyper.org/priority/";
+    description = "A pure-Python implementation of the HTTP/2 priority tree";
+    license = licenses.mit;
+    maintainers = [ 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..941da2bf9afd
--- /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.2";
+
+  src = fetchFromGitHub {
+    owner = "betodealmeida";
+    repo = "python-rison";
+    rev = version;
+    sha256 = "14vb468iznf9416z993bbqihywp9ibyslw5vp67wfr200zyxjwak";
+  };
+
+  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/default.nix b/nixpkgs/pkgs/development/python-modules/privacyidea/default.nix
new file mode 100644
index 000000000000..84cc4530b34e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/privacyidea/default.nix
@@ -0,0 +1,51 @@
+{ lib, buildPythonPackage, fetchFromGitHub, cacert, openssl, python
+
+, cryptography, pyrad, pymysql, python-dateutil, flask-versioned, flask_script
+, defusedxml, croniter, flask_migrate, pyjwt, configobj, sqlsoup, pillow
+, python-gnupg, passlib, pyopenssl, beautifulsoup4, smpplib, flask-babel
+, ldap3, huey, pyyaml, qrcode, oauth2client, requests, lxml, cbor2, psycopg2
+
+, mock, pytest, responses, testfixtures
+}:
+
+buildPythonPackage rec {
+  pname = "privacyIDEA";
+  version = "3.3";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "188ki924dig899wlih45xfsm0s7mjkya56vii26bg02h91izrb4b";
+  };
+
+  propagatedBuildInputs = [
+    cryptography pyrad pymysql python-dateutil flask-versioned flask_script
+    defusedxml croniter flask_migrate pyjwt configobj sqlsoup pillow
+    python-gnupg passlib pyopenssl beautifulsoup4 smpplib flask-babel
+    ldap3 huey pyyaml qrcode oauth2client requests lxml cbor2 psycopg2
+  ];
+
+  checkInputs = [ openssl mock pytest responses testfixtures ];
+  # issues with hardware token tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "privacyidea" ];
+
+  postPatch = ''
+    substituteInPlace privacyidea/lib/resolvers/LDAPIdResolver.py --replace \
+      "/etc/privacyidea/ldap-ca.crt" \
+      "${cacert}/etc/ssl/certs/ca-bundle.crt"
+  '';
+
+  postInstall = ''
+    rm -rf $out/${python.sitePackages}/tests
+  '';
+
+  meta = with lib; {
+    description = "Multi factor authentication system (2FA, MFA, OTP Server)";
+    license = licenses.agpl3Plus;
+    homepage = "http://www.privacyidea.org";
+    maintainers = [ maintainers.globin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/privacyidea/ldap-proxy.nix b/nixpkgs/pkgs/development/python-modules/privacyidea/ldap-proxy.nix
new file mode 100644
index 000000000000..25a81510c7dc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/privacyidea/ldap-proxy.nix
@@ -0,0 +1,30 @@
+{ lib, buildPythonPackage, isPy3k, fetchFromGitHub, twisted, ldaptor, configobj }:
+
+buildPythonPackage rec {
+  pname = "privacyidea-ldap-proxy";
+  version = "0.6.1";
+
+  # https://github.com/privacyidea/privacyidea-ldap-proxy/issues/50
+  disabled = isPy3k;
+
+  src = fetchFromGitHub {
+    owner = "privacyidea";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1kc1n9wr1a66xd5zvl6dq78xnkqkn5574jpzashc99pvm62dr24j";
+  };
+
+  propagatedBuildInputs = [ twisted ldaptor configobj ];
+
+  # python 2 zope.interface test import path issues
+  doCheck = false;
+
+  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.agpl3;
+    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..00905136716f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/proboscis/default.nix
@@ -0,0 +1,20 @@
+{ lib, stdenv, 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..4b83205d723e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/process-tests/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "process-tests";
+  version = "2.1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "15yrgr1hb7i0fq31dh6k8hmc3jnk6yn5nh4xh3gmszk9vag5zrqk";
+  };
+
+  # 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..3f8c11043811
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/proglog/default.nix
@@ -0,0 +1,19 @@
+{ lib, stdenv, fetchPypi, buildPythonPackage, tqdm }:
+
+buildPythonPackage rec {
+  pname = "proglog";
+  version = "0.1.9";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "13diln950wk6nnn4rpmzx37rvrnpa7f803gwygiwbq1q46zwri6q";
+  };
+
+  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..2c5dbc1386e8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/progress/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, python
+}:
+
+buildPythonPackage rec {
+  version = "1.5";
+  pname = "progress";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0wj3wvdgfmqj44n32wag3mzpp5fjqkkd321x67v1prxvs78yvv39";
+  };
+
+  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..a1fdddd95db8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/progressbar/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv, 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..cc3029ade64e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/progressbar2/default.nix
@@ -0,0 +1,31 @@
+{ lib, stdenv
+, python
+, buildPythonPackage
+, fetchPypi
+, python-utils
+}:
+
+buildPythonPackage rec {
+  pname = "progressbar2";
+  version = "3.53.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ef72be284e7f2b61ac0894b44165926f13f5d995b2bf3cd8a8dedc6224b255a7";
+  };
+
+  propagatedBuildInputs = [ python-utils ];
+
+  # depends on unmaintained pytest-pep8
+  # https://github.com/WoLpH/python-progressbar/issues/241
+  doCheck = false;
+
+  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/progressbar231/default.nix b/nixpkgs/pkgs/development/python-modules/progressbar231/default.nix
new file mode 100644
index 000000000000..f8980647482c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/progressbar231/default.nix
@@ -0,0 +1,23 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, isPy3k }:
+
+buildPythonPackage rec {
+  pname = "progressbar231";
+  version = "2.3.1";
+
+  disabled = isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0j0ifxk87xz3wkyacxaiqygghn27wwz6y5pj9k8j2yq7n33fbdam";
+  };
+
+  # no tests implemented
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://pypi.python.org/pypi/progressbar231";
+    description = "Text progressbar library for python";
+    license = licenses.lgpl3Plus;
+    maintainers = with maintainers; [ twey ];
+  };
+}
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..0b53b83f5cca
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/progressbar33/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv, 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..e4cf4e85af0f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/prometheus_client/default.nix
@@ -0,0 +1,19 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "prometheus_client";
+  version = "0.9.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "9da7b32f02439d8c04f7777021c304ed51d9ec180604700c1ba72a4d44dceb03";
+  };
+
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Prometheus instrumentation library for Python applications";
+    homepage = "https://github.com/prometheus/client_python";
+    license = licenses.asl20;
+  };
+}
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..68668812fc8a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/promise/default.nix
@@ -0,0 +1,49 @@
+{ buildPythonPackage
+, fetchPypi
+, lib
+
+, coveralls
+, gevent
+, mock
+, pytest-asyncio
+, pytest-benchmark
+, pytestcov
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "promise";
+  version = "2.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1l4kknj97dj5pxfpsz3ln78x9a843561c740b1m4pfi3qlvq7lfz";
+  };
+
+  patchPhase = ''
+    substituteInPlace setup.py \
+      --replace '"futures",' ""
+  '';
+
+  propagatedBuildInputs = [
+    gevent
+    six
+  ];
+
+  checkInputs = [
+    coveralls
+    mock
+    pytest-asyncio
+    pytest-benchmark
+    pytestcov
+  ];
+
+  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..bc39a8c92297
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/prompt_toolkit/1.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest
+, docopt
+, six
+, wcwidth
+, pygments
+}:
+
+buildPythonPackage rec {
+  pname = "prompt_toolkit";
+  version = "1.0.18";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "dd4fca02c8069497ad931a2d09914c6b0d1b50151ce876bc15bde4c747090126";
+  };
+  checkPhase = ''
+    rm prompt_toolkit/win32_types.py
+    py.test -k 'not test_pathcompleter_can_expanduser'
+  '';
+
+  checkInputs = [ pytest ];
+  propagatedBuildInputs = [ docopt six wcwidth pygments ];
+
+  meta = {
+    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 = lib.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..2fa885a69f71
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/prompt_toolkit/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest
+, six
+, wcwidth
+}:
+
+buildPythonPackage rec {
+  pname = "prompt_toolkit";
+  version = "3.0.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "25c95d2ac813909f813c93fde734b6e44406d1477a9faef7c915ff37d39c0a8c";
+  };
+  checkPhase = ''
+    py.test -k 'not test_pathcompleter_can_expanduser'
+  '';
+
+  checkInputs = [ pytest ];
+  propagatedBuildInputs = [ six wcwidth ];
+
+  meta = {
+    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 = lib.licenses.bsd3;
+  };
+}
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..ad47163e4842
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/property-manager/default.nix
@@ -0,0 +1,23 @@
+{ lib, buildPythonPackage, fetchFromGitHub, humanfriendly, verboselogs, coloredlogs, pytest, pytestcov }:
+
+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 pytestcov ];
+
+  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..ad7e4aa4af6e
--- /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.1.16";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a682771bc7b51b2ff41466460896c1a5a653f9a1e71639ef365a72e66d8734b4";
+  };
+  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..1cd732b19aea
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/proto-plus/default.nix
@@ -0,0 +1,33 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+, protobuf
+, googleapis_common_protos
+, pytestCheckHook
+, pytz
+}:
+
+buildPythonPackage rec {
+  pname = "proto-plus";
+  version = "1.13.0";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1i5jjnwpd288378h37zads08h695iwmhxm0sxbr3ln6aax97rdb1";
+  };
+
+  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..e7bbdd6ccdf8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/protobuf/default.nix
@@ -0,0 +1,81 @@
+{ buildPackages
+, lib
+, stdenv
+, fetchpatch
+, python
+, buildPythonPackage
+, isPy37
+, protobuf
+, google-apputils
+, six
+, pyext
+, libcxx
+, isPy27
+, disabled
+, doCheck ? true
+}:
+
+buildPythonPackage {
+  inherit (protobuf) pname src version;
+  inherit disabled;
+  doCheck = doCheck && !isPy27; # setuptools>=41.4 no longer collects correctly on python2
+
+  NIX_CFLAGS_COMPILE = toString (
+    # work around python distutils compiling C++ with $CC
+    lib.optional stdenv.isDarwin "-I${libcxx}/include/c++/v1"
+    ++ lib.optional (lib.versionOlder protobuf.version "2.7.0") "-std=c++98"
+  );
+
+  outputs = [ "out" "dev" ];
+
+  propagatedBuildInputs = [ six ] ++ lib.optionals isPy27 [ google-apputils ];
+  propagatedNativeBuildInputs = [ buildPackages.protobuf ]; # For protoc.
+  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
+  '';
+
+  preConfigure = lib.optionalString (lib.versionAtLeast protobuf.version "2.6.0") ''
+    export PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=cpp
+    export PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION_VERSION=2
+  '';
+
+  preBuild = ''
+    # Workaround for https://github.com/google/protobuf/issues/2895
+    ${python.pythonForBuild.interpreter} setup.py build
+  '' + lib.optionalString (lib.versionAtLeast protobuf.version "2.6.0") ''
+    ${python.pythonForBuild.interpreter} setup.py build_ext --cpp_implementation
+  '';
+
+  installFlags = lib.optional (lib.versionAtLeast protobuf.version "2.6.0")
+    "--install-option='--cpp_implementation'";
+
+  # the _message.so isn't installed, so we'll do that manually.
+  # if someone can figure out a less hacky way to get the _message.so to
+  # install, please do replace this.
+  postInstall = lib.optionalString (lib.versionAtLeast protobuf.version "2.6.0") ''
+    cp -v $(find build -name "_message*") $out/${python.sitePackages}/google/protobuf/pyext
+  '';
+
+  meta = with lib; {
+    description = "Protocol Buffers are Google's data interchange format";
+    homepage = "https://developers.google.com/protocol-buffers/";
+    license = licenses.bsd3;
+  };
+
+  passthru.protobuf = protobuf;
+}
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..9ab4cbf72bdf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/prov/default.nix
@@ -0,0 +1,37 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, lxml
+, networkx
+, dateutil
+, rdflib
+, pydot
+}:
+
+buildPythonPackage rec {
+  pname = "prov";
+  version = "2.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b6438f2195ecb9f6e8279b58971e02bc51814599b5d5383366eef91d867422ee";
+  };
+
+  propagatedBuildInputs = [
+    lxml
+    networkx
+    dateutil
+    rdflib
+  ];
+
+  checkInputs = [
+    pydot
+  ];
+
+  meta = with lib; {
+    description = "A 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..1cc2ab89360f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/prox-tv/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, blas
+, lapack
+, buildPythonPackage
+, cffi
+, fetchFromGitHub
+, nose
+, numpy
+}:
+
+buildPythonPackage {
+  pname = "prox-tv";
+  version = "3.3.0";
+
+  src = fetchFromGitHub {
+    owner = "albarji";
+    repo = "proxTV";
+    rev = "e621585d5aaa7983fbee68583f7deae995d3bafb";
+    sha256 = "0mlrjbb5rw78dgijkr3bspmsskk6jqs9y7xpsgs35i46dvb327q5";
+  };
+
+  checkInputs = [
+    nose
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    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/psautohint/default.nix b/nixpkgs/pkgs/development/python-modules/psautohint/default.nix
new file mode 100644
index 000000000000..68d151336706
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/psautohint/default.nix
@@ -0,0 +1,57 @@
+{ lib, buildPythonPackage, fetchFromGitHub, pythonOlder
+, fonttools
+, lxml, fs # for fonttools extras
+, setuptools_scm
+, pytestCheckHook, pytest_5, pytestcov, pytest_xdist
+}:
+
+buildPythonPackage rec {
+  pname = "psautohint";
+  version = "2.2.0";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "adobe-type-tools";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0gsgfr190xy2rnjf1gf7688xrh13ihgq10s19s4rv5hp6pmg9iaa";
+    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 = [
+    # Override pytestCheckHook to use pytest v5, because some tests fail on pytest >= v6
+    # https://github.com/adobe-type-tools/psautohint/issues/284#issuecomment-742800965
+    # Override might be able to be removed in future, check package dependency pins (coverage.yml)
+    (pytestCheckHook.override{ pytest = pytest_5; })
+    pytestcov
+    pytest_xdist
+  ];
+  disabledTests = [
+    # 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"
+  ];
+
+  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/psd-tools/default.nix b/nixpkgs/pkgs/development/python-modules/psd-tools/default.nix
new file mode 100644
index 000000000000..783905c70241
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/psd-tools/default.nix
@@ -0,0 +1,27 @@
+{ lib, buildPythonPackage, fetchPypi, isPy27
+, docopt
+, pillow
+, enum34
+}:
+
+buildPythonPackage rec {
+  pname = "psd-tools";
+  version = "1.9.16";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "dece6327b5aa03b53163c63e2bf90b4a7b0ff6872ef743adab140a59cb2318ff";
+  };
+
+  propagatedBuildInputs = [
+    docopt
+    pillow
+  ] ++ lib.optionals isPy27 [ enum34 ];
+
+  meta = {
+    description = "Python package for reading Adobe Photoshop PSD files";
+    homepage = "https://github.com/kmike/psd-tools";
+    license = lib.licenses.mit;
+    broken = true; # missing packbits from nixpkgs
+  };
+}
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..6760ff168e56
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/psutil/default.nix
@@ -0,0 +1,41 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, isPy27, python
+, darwin
+, pytest
+, mock
+, ipaddress
+, unittest2
+}:
+
+buildPythonPackage rec {
+  pname = "psutil";
+  version = "5.8.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1immnj532bnnrh1qmk5q3lsw3san8qfk9kxy1cpmy0knmfcwp70c";
+  };
+
+  # arch doesn't report frequency is the same way
+  # tests segfaults on darwin https://github.com/giampaolo/psutil/issues/1715
+  doCheck = !stdenv.isDarwin && stdenv.isx86_64;
+  checkInputs = [ pytest ]
+    ++ lib.optionals isPy27 [ mock ipaddress unittest2 ];
+  # out must be referenced as test import paths are relative
+  # disable tests which don't work in sandbox
+  # cpu_times is flakey on darwin
+  checkPhase = ''
+    pytest $out/${python.sitePackages}/psutil/tests/test_system.py \
+      -k 'not user and not disk_io_counters and not sensors_battery and not cpu_times'
+  '';
+
+  buildInputs = lib.optionals stdenv.isDarwin [ darwin.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/psycopg2/default.nix b/nixpkgs/pkgs/development/python-modules/psycopg2/default.nix
new file mode 100644
index 000000000000..4e0a2771e9a8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/psycopg2/default.nix
@@ -0,0 +1,25 @@
+{ stdenv, lib, buildPythonPackage, isPyPy, fetchPypi, postgresql, openssl }:
+
+buildPythonPackage rec {
+  pname = "psycopg2";
+  version = "2.8.6";
+
+  # Extension modules don't work well with PyPy. Use psycopg2cffi instead.
+  # c.f. https://github.com/NixOS/nixpkgs/pull/104151#issuecomment-729750892
+  disabled = isPyPy;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "fb23f6c71107c37fd667cb4ea363ddeb936b348bbd6449278eb92c189699f543";
+  };
+
+  buildInputs = lib.optional stdenv.isDarwin openssl;
+  nativeBuildInputs = [ postgresql ];
+
+  doCheck = false;
+
+  meta = with lib; {
+    description = "PostgreSQL database adapter for the Python programming language";
+    license = with licenses; [ gpl2 zpl20 ];
+  };
+}
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/ptable/default.nix b/nixpkgs/pkgs/development/python-modules/ptable/default.nix
new file mode 100644
index 000000000000..ffa9bdacd2d1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ptable/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv, 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..c19780a4411c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ptest/default.nix
@@ -0,0 +1,23 @@
+{ lib, stdenv
+, 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..fd7b92692fc6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ptpython/default.nix
@@ -0,0 +1,26 @@
+{ stdenv, lib, buildPythonPackage, pythonOlder, fetchPypi, prompt_toolkit, appdirs, docopt, jedi
+, pygments, importlib-metadata, isPy3k }:
+
+buildPythonPackage rec {
+  pname = "ptpython";
+  version = "3.0.7";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "34814eb410f854c823be4c4a34124e1dc8ca696da1c1fa611f9da606c5a8a609";
+  };
+
+  propagatedBuildInputs = [ appdirs prompt_toolkit docopt jedi 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..233dc6fb3148
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ptyprocess/default.nix
@@ -0,0 +1,20 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "ptyprocess";
+  version = "0.6.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "923f299cc5ad920c68f2bc0bc98b75b9f838b93b599941a6b63ddbc2476394c0";
+  };
+
+  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..abac4fb3baa0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/publicsuffix/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, isPy3k }:
+
+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..2d9bc73baa3f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/publicsuffix2/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub, requests }:
+
+buildPythonPackage rec {
+  pname = "publicsuffix2";
+  version = "2.20191221";
+
+  # Tests are missing in the sdist
+  # See: https://github.com/nexB/python-publicsuffix2/issues/12
+  src = fetchFromGitHub {
+    owner = "nexB";
+    repo = "python-publicsuffix2";
+    rev = "release-2.2019-12-21";
+    sha256 = "1dkvfvl0izq9hqzilnw8ipkbgjs9xyad9p21i3864hzinbh0wp9r";
+  };
+
+  nativeBuildInputs = [ requests ];
+
+  meta = with lib; {
+    description = ''
+      Get a public suffix for a domain name using the Public Suffix
+      List. Forked from and using the same API as the publicsuffix package.
+    '';
+    homepage = "https://pypi.python.org/pypi/publicsuffix2/";
+    license = licenses.mpl20;
+  };
+}
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..e4bab25fd9c1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pubnub/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, cbor2
+, fetchFromGitHub
+, pycryptodomex
+, pytestCheckHook
+, pyyaml
+, pytest-vcr
+, pytest-asyncio
+, requests
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "pubnub";
+  version = "4.8.0";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = "python";
+    rev = "v${version}";
+    sha256 = "16wjal95042kh5fxhvji0rwmw892pacqcnyms520mw15wcwilqir";
+  };
+
+  propagatedBuildInputs = [
+    cbor2
+    pycryptodomex
+    requests
+    six
+  ];
+
+  checkInputs = [
+    aiohttp
+    pycryptodomex
+    pytest-asyncio
+    pytestCheckHook
+    pytest-vcr
+
+  ];
+
+  # Some tests don't pass with recent releases of tornado/twisted
+  pytestFlagsArray = [
+    "--ignore tests/integrational"
+    "--ignore tests/manual/asyncio"
+    "--ignore tests/manual/tornado/test_reconnections.py"
+  ];
+
+  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..0ee2a8470b5e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pudb/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, pygments
+, urwid
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "pudb";
+  version = "2019.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1p2qizb35f9lfhklldzrn8g9mwiar3zmpc44463h5n1ln40ymw78";
+  };
+
+  propagatedBuildInputs = [ pygments urwid ];
+
+  # Tests fail on python 3 due to writes to the read-only home directory
+  doCheck = !isPy3k;
+
+  meta = with lib; {
+    description = "A full-screen, console-based Python debugger";
+    license = licenses.mit;
+    platforms = platforms.all;
+  };
+
+}
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..3e4c4b4b6632
--- /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.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b2aff10989b3692e3a59301a0cb0acddeb25dcea378f8804c86007075eae55b5";
+  };
+
+  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..2a66357f8494
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pulsectl/default.nix
@@ -0,0 +1,31 @@
+{ lib, buildPythonPackage, fetchPypi, libpulseaudio, glibc, substituteAll, stdenv, pulseaudio, python }:
+
+buildPythonPackage rec {
+  pname = "pulsectl";
+  version = "20.5.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "39b0a0e7974a7d6468d826a838822f78b00ac9c3803f0d7bfa9b1cad08ee22db";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./library-paths.patch;
+      libpulse = "${libpulseaudio.out}/lib/libpulse${stdenv.hostPlatform.extensions.sharedLibrary}";
+      librt = "${glibc.out}/lib/librt${stdenv.hostPlatform.extensions.sharedLibrary}";
+    })
+  ];
+
+  checkInputs = [ pulseaudio ];
+  checkPhase = ''
+    ${python.interpreter} -m unittest pulsectl.tests.all
+  '';
+
+  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/pure-eval/default.nix b/nixpkgs/pkgs/development/python-modules/pure-eval/default.nix
new file mode 100644
index 000000000000..6e504951cdbe
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pure-eval/default.nix
@@ -0,0 +1,29 @@
+{ buildPythonPackage, isPy3k, lib, fetchFromGitHub, setuptools_scm, toml, pytest }:
+
+buildPythonPackage rec {
+  pname = "pure_eval";
+  version = "0.1.0";
+
+  disabled = !isPy3k;
+
+  src = fetchFromGitHub {
+    owner = "alexmojaki";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1d3gpc9mrmwdk6l87x7ll23vwv6l8l2iqvi63r86j7bj5s8m2ci8";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  buildInputs = [ setuptools_scm ];
+  propagatedBuildInputs = [ toml ];
+
+  checkInputs = [ pytest ];
+
+  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..9679cc593df0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pure-pcapy3/default.nix
@@ -0,0 +1,18 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "pure-pcapy3";
+  version = "1.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "14panfklap6wwi9avw46gvd7wg9mkv9xbixvbvmi1m2adpqlb7mr";
+  };
+
+  meta = with lib; {
+    description = "Pure Python reimplementation of pcapy. This package is API compatible and a drop-in replacement.";
+    homepage = "https://bitbucket.org/viraptor/pure-pcapy";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ etu ];
+  };
+}
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..acb9b73403b3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pure-python-adb-homeassistant/default.nix
@@ -0,0 +1,24 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+buildPythonPackage rec {
+  pname = "pure-python-adb-homeassistant";
+  version = "0.1.6.dev0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "fe6d90220a6880649f6d6df4e707ce5034676710ee6146145ef995f7b769a482";
+  };
+
+  # Disable tests as they require docker, docker-compose and a dedicated
+  # android emulator
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Pure 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..c562f20e5ecb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pure-python-adb/default.nix
@@ -0,0 +1,26 @@
+{ aiofiles, buildPythonPackage, fetchPypi, lib, pythonOlder }:
+
+buildPythonPackage rec {
+  pname = "pure-python-adb";
+  version = "0.3.0.dev0";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0kdr7w2fhgjpcf1k3l6an9im583iqkr6v8hb4q1zw30nh3bqkk0f";
+  };
+
+  propagatedBuildInputs = [ aiofiles ];
+  # Disable tests as they require docker, docker-compose and a dedicated
+  # android emulator
+  doCheck = false;
+  pythonImportsCheck = [ "ppadb.client" "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/purepng/default.nix b/nixpkgs/pkgs/development/python-modules/purepng/default.nix
new file mode 100644
index 000000000000..715b2ca69029
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/purepng/default.nix
@@ -0,0 +1,48 @@
+{ lib, stdenv
+, 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..43fd5b71ca6c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/purl/default.nix
@@ -0,0 +1,27 @@
+{ lib, buildPythonPackage, fetchFromGitHub
+, nose
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "purl";
+  version = "1.5";
+
+  src = fetchFromGitHub {
+    owner = "codeinthehole";
+    repo = "purl";
+    rev = version;
+    sha256 = "0vi7xdm2xc1rbqrz5jwpr7x7dnkcrbjf1mb4w1q2c2f8jca0kk0g";
+  };
+
+  propagatedBuildInputs = [ six ];
+
+  checkInputs = [ nose ];
+
+  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/pushbullet/default.nix b/nixpkgs/pkgs/development/python-modules/pushbullet/default.nix
new file mode 100644
index 000000000000..68c9d9180dc8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pushbullet/default.nix
@@ -0,0 +1,27 @@
+{ lib, buildPythonPackage, fetchPypi
+, requests, websocket_client, python_magic
+, pytest, mock }:
+
+buildPythonPackage rec {
+  pname = "pushbullet.py";
+  version = "0.12.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "917883e1af4a0c979ce46076b391e0243eb8fe0a81c086544bcfa10f53e5ae64";
+  };
+
+  propagatedBuildInputs = [ requests websocket_client python_magic ];
+
+  checkInputs = [ pytest mock ];
+
+  checkPhase = ''
+    PUSHBULLET_API_KEY="" py.test -k "not test_e2e and not test_auth"
+  '';
+
+  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..1093f125a969
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pushover/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv, 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; {
+    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..006246e58366
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pvlib/default.nix
@@ -0,0 +1,54 @@
+{ lib, stdenv, 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/pweave/default.nix b/nixpkgs/pkgs/development/python-modules/pweave/default.nix
new file mode 100644
index 000000000000..fe74fcece1c0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pweave/default.nix
@@ -0,0 +1,35 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, mock
+, matplotlib
+, pkgs
+, nbconvert
+, markdown
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "Pweave";
+  version = "0.30.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "5e5298d90e06414a01f48e0d6aa4c36a70c5f223d929f2a9c7e2d388451c7357";
+  };
+
+  disabled = !isPy3k;
+
+  buildInputs = [ mock pkgs.glibcLocales ];
+  propagatedBuildInputs = [ 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 = "http://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..77f7859c6d47
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pwntools/default.nix
@@ -0,0 +1,74 @@
+{ lib, stdenv
+, buildPythonPackage
+, debugger
+, fetchPypi
+, isPy3k
+, Mako
+, makeWrapper
+, packaging
+, pysocks
+, pygments
+, ROPGadget
+, capstone
+, paramiko
+, pip
+, psutil
+, pyelftools
+, pyserial
+, dateutil
+, requests
+, tox
+, unicorn
+, intervaltree
+, fetchpatch
+}:
+
+buildPythonPackage rec {
+  version = "4.3.1";
+  pname = "pwntools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "12ja913kz8wl4afrmpzxh9fx6j7rcwc2vqzkvfr1fxn42gkqhqf4";
+  };
+
+  # 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!
+  postPatch = ''
+    sed -i 's/unicorn>=1.0.2rc1,<1.0.2rc4/unicorn>=1.0.2rc1/' setup.py
+  '';
+
+  propagatedBuildInputs = [
+    Mako
+    packaging
+    pysocks
+    pygments
+    ROPGadget
+    capstone
+    paramiko
+    pip
+    psutil
+    pyelftools
+    pyserial
+    dateutil
+    requests
+    tox
+    unicorn
+    intervaltree
+  ];
+
+  doCheck = false; # no setuptools tests for the package
+
+  postFixup = ''
+    mkdir -p "$out/bin"
+    makeWrapper "${debugger}/bin/${lib.strings.getName debugger}" "$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..57614089e66e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pxml/default.nix
@@ -0,0 +1,37 @@
+{ lib, stdenv
+, pythonAtLeast
+, isPy27
+, 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..b5ffc1fc0a5d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/py-air-control-exporter/default.nix
@@ -0,0 +1,27 @@
+{ buildPythonPackage, fetchPypi, flask, isPy27, lib, nixosTests
+, prometheus_client, py-air-control, pytestCheckHook, pytestcov, pytestrunner
+, setuptools_scm }:
+
+buildPythonPackage rec {
+  pname = "py-air-control-exporter";
+  version = "0.3.0";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ece2e446273542e5c0352c9d6e80d8279132c6ada3649c59e87a711448801a3b";
+  };
+
+  nativeBuildInputs = [ setuptools_scm ];
+  checkInputs = [ pytestCheckHook pytestcov pytestrunner ];
+  propagatedBuildInputs = [ flask prometheus_client py-air-control ];
+
+  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-cpuinfo/default.nix b/nixpkgs/pkgs/development/python-modules/py-cpuinfo/default.nix
new file mode 100644
index 000000000000..ae2f5ae9d6db
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/py-cpuinfo/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "py-cpuinfo";
+  version = "5.0.0";
+
+  src = fetchFromGitHub {
+     owner = "workhorsy";
+     repo = pname;
+     rev = "v${version}";
+     sha256 = "0lxl9n6djaz5h1zrb2jca4qwl41c2plxy8chr7yhcxnzg0srddqi";
+  };
+
+  checkInputs = [
+    pytest
+  ];
+
+  checkPhase = ''
+    runHook preCheck
+    pytest -k "not TestActual"
+    runHook postCheck
+  '';
+
+  meta = {
+    description = "Get CPU info with pure Python 2 & 3";
+    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 2 and 3.
+    '';
+    inherit (src.meta) homepage;
+    changelog = "https://github.com/workhorsy/py-cpuinfo/blob/v${version}/ChangeLog";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ costrouc ];
+  };
+}
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-multibase/default.nix b/nixpkgs/pkgs/development/python-modules/py-multibase/default.nix
new file mode 100644
index 000000000000..b229361917f6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/py-multibase/default.nix
@@ -0,0 +1,46 @@
+{ buildPythonPackage
+, fetchPypi
+, isPy27
+, lib
+, morphys
+, pytest
+, pytestrunner
+, 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 = [
+    pytestrunner
+  ];
+
+  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-multihash/default.nix b/nixpkgs/pkgs/development/python-modules/py-multihash/default.nix
new file mode 100644
index 000000000000..1f8ecad00135
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/py-multihash/default.nix
@@ -0,0 +1,54 @@
+{ base58
+, buildPythonPackage
+, fetchFromGitHub
+, isPy27
+, lib
+, morphys
+, pytest
+, pytestcov
+, pytestrunner
+, six
+, variants
+, varint
+}:
+
+buildPythonPackage rec {
+  pname = "py-multihash";
+  version = "1.0.0";
+
+  src = fetchFromGitHub {
+    owner = "multiformats";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "07qglrbgcb8sr9msqw2v7dqj9s4rs6nyvhdnx02i5w6xx5ibzi3z";
+  };
+
+  nativeBuildInputs = [
+    pytestrunner
+  ];
+
+  propagatedBuildInputs = [
+    base58
+    morphys
+    six
+    variants
+    varint
+  ];
+
+  checkInputs = [
+    pytest
+    pytestcov
+  ];
+
+  pythonImportsCheck = [ "multihash" ];
+
+  disabled = isPy27;
+
+  meta = with lib; {
+    description = "Self describing hashes - for future proofing";
+    homepage = "https://github.com/multiformats/py-multihash";
+    license = licenses.mit;
+    maintainers = with maintainers; [ rakesh4g ];
+    broken = true; # no longer compatible with base58, no updates in 5 years. Added 2020-11-05
+  };
+}
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..fa057ae99254
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/py-radix/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, coverage
+, nose
+}:
+
+buildPythonPackage rec {
+  pname = "py-radix";
+  version = "0.10.0";
+
+  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-sonic/default.nix b/nixpkgs/pkgs/development/python-modules/py-sonic/default.nix
new file mode 100644
index 000000000000..c35e650e18bb
--- /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.8";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1nfpiry1jlgcyxcs5zamyfxwdvdiwg4yw0v8jysfc74hm362rg7d";
+  };
+
+  # 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-vapid/default.nix b/nixpkgs/pkgs/development/python-modules/py-vapid/default.nix
new file mode 100644
index 000000000000..2f4a60b420aa
--- /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.7.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f05cecaa9fc009515086d04b6117324f30eedf1a196f67fb1ec360a9dbdad4ee";
+  };
+
+  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/default.nix b/nixpkgs/pkgs/development/python-modules/py/default.nix
new file mode 100644
index 000000000000..4d2b77bb1f2a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/py/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, setuptools_scm }:
+
+buildPythonPackage rec {
+  pname = "py";
+  version = "1.9.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "9ca6883ce56b4e8da7e79ac18787889fa5206c79dcc67fb065376cd2fe03f342";
+  };
+
+  # 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://pylib.readthedocs.org/";
+    license = licenses.mit;
+  };
+}
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..1f7aeaf1e118
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/py3dns/default.nix
@@ -0,0 +1,30 @@
+{ lib, stdenv
+, 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..0c2ae1288279
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/py3exiv2/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, isPy3k, fetchPypi, stdenv, exiv2, boost, libcxx, substituteAll, python }:
+
+buildPythonPackage rec {
+  pname = "py3exiv2";
+  version = "0.8.0";
+  disabled = !(isPy3k);
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1v419f1kkqw8hqyc3yhzslnbzk52j8j3wfknfkjg308n5mf5bn09";
+  };
+
+  buildInputs = [ exiv2 boost ];
+
+  # work around python distutils compiling C++ with $CC (see issue #26709)
+  NIX_CFLAGS_COMPILE = lib.optionalString stdenv.isDarwin "-I${libcxx}/include/c++/v1";
+
+  meta = with lib; {
+    homepage = "https://launchpad.net/py3exiv2";
+    description = "A Python3 binding to the library exiv2";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ vinymeuh ];
+    platforms = with platforms; linux ++ darwin;
+  };
+}
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..71314a08eebc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/py3status/default.nix
@@ -0,0 +1,57 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, requests
+, pytz
+, tzlocal
+, i3ipc
+, pydbus
+, pygobject3
+, pyserial
+, setuptools
+, dbus-python
+
+, file
+, acpi
+, coreutils
+, alsaUtils
+, i3
+, procps
+, lm_sensors
+, libnotify
+, xorg
+}:
+
+buildPythonPackage rec {
+  pname = "py3status";
+  version = "3.31";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "426cff33c1d3a5ee6ae388089fd41dc47c4221800f43bd51779f823c781fb83b";
+  };
+
+  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|'${alsaUtils}/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..588d7a32d22f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/py4j/default.nix
@@ -0,0 +1,22 @@
+{ buildPythonPackage, fetchPypi, lib, stdenv }:
+
+buildPythonPackage rec {
+  pname = "py4j";
+
+  version = "0.10.9.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "7605e512bf9b002245f5a9121a8c2df9bfd1a6004fe6dd3ff29d46f901719d53";
+  };
+
+  # 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/";
+    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..f53cc45b9fe7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyGithub/default.nix
@@ -0,0 +1,38 @@
+{ lib, stdenv
+, buildPythonPackage
+, cryptography
+, deprecated
+, fetchFromGitHub
+, httpretty
+, isPy3k
+, parameterized
+, pyjwt
+, pytestCheckHook
+, requests }:
+
+buildPythonPackage rec {
+  pname = "PyGithub";
+  version = "1.54.1";
+  disabled = !isPy3k;
+
+  src = fetchFromGitHub {
+    owner = "PyGithub";
+    repo = "PyGithub";
+    rev = "v${version}";
+    sha256 = "1nl74bp5ikdnrc8xq0qr25ryl1mvarf0xi43k8w5jzlrllhq0nkq";
+  };
+
+  checkInputs = [ httpretty parameterized pytestCheckHook ];
+  propagatedBuildInputs = [ cryptography deprecated pyjwt requests ];
+
+  # Test suite makes REST calls against github.com
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/PyGithub/PyGithub";
+    description = "A Python (2 and 3) library to access the GitHub API v3";
+    platforms = platforms.all;
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ jhhuh ];
+  };
+}
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..ea5c93dbeaa1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyTelegramBotAPI/default.nix
@@ -0,0 +1,20 @@
+{ lib, buildPythonPackage, fetchPypi, requests }:
+
+buildPythonPackage rec {
+  pname = "pyTelegramBotAPI";
+  version = "3.7.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "9b95f441c390fd30a4452a984406310f60a7f4803df57860ccb6a79881506c46";
+  };
+
+  propagatedBuildInputs = [ requests ];
+
+  meta = with lib; {
+    homepage = "https://github.com/eternnoir/pyTelegramBotAPI";
+    description = "A simple, but extensible Python implementation for the Telegram Bot API";
+    license = licenses.gpl2;
+    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..af86ce3821eb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/py_scrypt/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, openssl
+}:
+
+buildPythonPackage rec {
+  pname = "scrypt";
+  version = "0.8.17";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "25b5075f2238be93af1cd574540a5ea01b8547f9b678aa72d22fce22577475ec";
+  };
+
+  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..d424b2144292
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyacoustid/default.nix
@@ -0,0 +1,32 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, requests
+, audioread
+, pkgs
+}:
+
+buildPythonPackage rec {
+  pname = "pyacoustid";
+  version = "1.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0c3dsnfyldnsmyzczp5s5aqvbzcn360s0h4l3gm3k53lg57f762z";
+  };
+
+  propagatedBuildInputs = [ requests audioread ];
+
+  postPatch = ''
+    sed -i \
+        -e '/^FPCALC_COMMAND *=/s|=.*|= "${pkgs.chromaprint}/bin/fpcalc"|' \
+        acoustid.py
+  '';
+
+  meta = with lib; {
+    description = "Bindings for Chromaprint acoustic fingerprinting";
+    homepage = "https://github.com/sampsyo/pyacoustid";
+    license = licenses.mit;
+  };
+
+}
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..37d3b31a365c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyads/default.nix
@@ -0,0 +1,30 @@
+{ adslib, buildPythonPackage, fetchFromGitHub, lib, pytestCheckHook, pytest
+, pytestcov, pythonOlder }:
+
+buildPythonPackage rec {
+  pname = "pyads";
+  version = "3.2.2";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "stlehmann";
+    repo = pname;
+    rev = version;
+    sha256 = "1jd727pw0z73y4xhrykqkfcz1acrpy3rks58lr1y4yilfv11p6jb";
+  };
+
+  buildInputs = [ adslib ];
+  patchPhase = ''
+    substituteInPlace pyads/pyads_ex.py \
+      --replace "ctypes.CDLL(adslib)" "ctypes.CDLL(\"${adslib}/lib/adslib.so\")"
+  '';
+  checkInputs = [ pytestCheckHook pytest pytestcov ];
+
+  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/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..4deee467f84e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyaftership/default.nix
@@ -0,0 +1,26 @@
+{ aiohttp, async-timeout, buildPythonPackage, fetchPypi, isPy3k, lib }:
+
+buildPythonPackage rec {
+  pname = "pyaftership";
+  version = "0.1.2";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "057dwzacc0lmsq00ipfbnxkq4rc2by8glmza6s8i6dzi1cc68v98";
+  };
+
+  propagatedBuildInputs = [ aiohttp async-timeout ];
+
+  # No tests
+  doCheck = false;
+  pythonImportsCheck = [ "pyaftership.tracker" ];
+
+  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..9ef89c6e920d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyahocorasick/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pyahocorasick";
+  version = "1.4.0";
+
+  src = fetchFromGitHub {
+    owner = "WojciechMula";
+    repo = pname;
+    rev = version;
+    sha256 = "0plm9x2gziayjsl7flsgn1z8qx88c9vqm4fs1wq7dv7fr188liik";
+  };
+
+  checkInputs = [ pytestCheckHook ];
+
+  pytestFlagsArray = [ "unittests.py" ];
+  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/pyairvisual/default.nix b/nixpkgs/pkgs/development/python-modules/pyairvisual/default.nix
new file mode 100644
index 000000000000..2e9aa97f1f23
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyairvisual/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, poetry
+, aiohttp
+, numpy
+, pysmb
+, aresponses
+, asynctest
+, pytest-aiohttp
+, pytest-asyncio
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pyairvisual";
+  version = "5.0.5";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "bachya";
+    repo = pname;
+    rev = version;
+    sha256 = "0jjvng3py5g97gvx6rdbk5zxbn5rw8gq1ki4qi4vfsypchxbpz2q";
+  };
+
+  nativeBuildInputs = [ poetry ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    numpy
+    pysmb
+  ];
+
+  checkInputs = [
+    aresponses
+    asynctest
+    pytest-aiohttp
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  # Ignore the examples as they are prefixed with test_
+  pytestFlagsArray = [ "--ignore 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..075103e9e40f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyalgotrade/default.nix
@@ -0,0 +1,41 @@
+{ lib, stdenv
+, 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/pyamf/default.nix b/nixpkgs/pkgs/development/python-modules/pyamf/default.nix
new file mode 100644
index 000000000000..f0cf111a87ad
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyamf/default.nix
@@ -0,0 +1,22 @@
+{ lib, stdenv, fetchPypi, buildPythonPackage, isPy3k, defusedxml }:
+
+buildPythonPackage rec {
+  pname = "PyAMF";
+  version = "0.8.0";
+
+  # according to setup.py
+  disabled = isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1r3lp9gkph48g9lijby5rs5daa3lhxs204r14zw4kvp3hf4xcm84";
+  };
+
+  propagatedBuildInputs = [ defusedxml ];
+
+  meta = with lib; {
+    description = "AMF (Action Message Format) support for Python";
+    homepage = "https://pypi.python.org/pypi/PyAMF";
+    license = licenses.mit;
+  };
+}
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..f229ef5839e9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyamg/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, numpy
+, scipy
+, pytest
+, pybind11
+}:
+
+buildPythonPackage rec {
+  pname = "pyamg";
+  version = "4.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "3ceb38ffd86e29774e759486f2961599c8ed847459c68727493cadeaf115a38a";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+    scipy
+    pytest
+    pybind11
+  ];
+
+  preBuild = ''
+    export HOME=$(mktemp -d)
+  '';
+
+  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..524d34c68d4a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyaml/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pyyaml
+, unidecode
+}:
+
+buildPythonPackage rec {
+  pname = "pyaml";
+  version = "20.4.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "29a5c2a68660a799103d6949167bd6c7953d031449d08802386372de1db6ad71";
+  };
+
+  propagatedBuildInputs = [ pyyaml ];
+
+  checkInputs = [ unidecode ];
+
+  meta = {
+    description = "PyYAML-based module to produce pretty and readable YAML-serialized data";
+    homepage = "https://github.com/mk-fg/pretty-yaml";
+    license = lib.licenses.wtfpl;
+  };
+}
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..9c9c18a886e9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyannotate/default.nix
@@ -0,0 +1,34 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, six
+, mypy-extensions
+, typing
+, pytest
+}:
+
+buildPythonPackage rec {
+  version = "1.2.0";
+  pname = "pyannotate";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "16bm0mf7wxvy0lgmcs1p8n1ji8pnvj1jvj8zk3am70dkp825iv84";
+  };
+
+  checkInputs = [ pytest ];
+  propagatedBuildInputs = [ six mypy-extensions ]
+    ++ lib.optionals (pythonOlder "3.5") [ typing ];
+
+  checkPhase = ''
+    py.test
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/dropbox/pyannotate";
+    description = "Auto-generate PEP-484 annotations";
+    license = licenses.mit;
+    maintainers = [ 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/pyarrow/default.nix b/nixpkgs/pkgs/development/python-modules/pyarrow/default.nix
new file mode 100644
index 000000000000..780c8c2df854
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyarrow/default.nix
@@ -0,0 +1,52 @@
+{ lib, buildPythonPackage, python, isPy3k, arrow-cpp, cmake, cython, futures, hypothesis, numpy, pandas, pytestCheckHook, pytest-lazy-fixture, pkg-config, setuptools_scm, six }:
+
+let
+  _arrow-cpp = arrow-cpp.override { python3 = python; };
+in
+
+buildPythonPackage rec {
+  pname = "pyarrow";
+  disabled = !isPy3k;
+
+  inherit (_arrow-cpp) version src;
+
+  sourceRoot = "apache-arrow-${version}/python";
+
+  nativeBuildInputs = [ cmake cython pkg-config setuptools_scm ];
+  propagatedBuildInputs = [ numpy six ];
+  checkInputs = [ hypothesis pandas pytestCheckHook pytest-lazy-fixture ];
+
+  PYARROW_BUILD_TYPE = "release";
+  PYARROW_WITH_PARQUET = true;
+  PYARROW_CMAKE_OPTIONS = [
+    "-DCMAKE_INSTALL_RPATH=${ARROW_HOME}/lib"
+
+    # This doesn't use setup hook to call cmake so we need to workaround #54606
+    # ourselves
+    "-DCMAKE_POLICY_DEFAULT_CMP0025=NEW"
+  ];
+  ARROW_HOME = _arrow-cpp;
+  PARQUET_HOME = _arrow-cpp;
+
+  dontUseCmakeConfigure = true;
+
+  preBuild = ''
+    export PYARROW_PARALLEL=$NIX_BUILD_CORES
+  '';
+
+  dontUseSetuptoolsCheck = true;
+  preCheck = ''
+    mv pyarrow/tests tests
+    rm -rf pyarrow
+    mkdir pyarrow
+    mv tests pyarrow/tests
+  '';
+
+  meta = with lib; {
+    description = "A cross-language development platform for in-memory data";
+    homepage = "https://arrow.apache.org/";
+    license = lib.licenses.asl20;
+    platforms = platforms.unix;
+    maintainers = with lib.maintainers; [ veprbl ];
+  };
+}
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..2be2e8b9c11a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyasn1-modules/default.nix
@@ -0,0 +1,35 @@
+{ lib, stdenv
+, 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..9b269f79c86a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyasn1/default.nix
@@ -0,0 +1,18 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, }:
+
+buildPythonPackage rec {
+  pname = "pyasn1";
+  version = "0.4.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "aef77c9fb94a3ac588e87841208bdec464471d9871bd5050a287cc9a475cd0ba";
+  };
+
+  meta = with lib; {
+    description = "ASN.1 tools for Python";
+    homepage = "http://pyasn1.sourceforge.net/";
+    license = "mBSD";
+    platforms = platforms.unix;  # arbitrary choice
+  };
+}
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..6bea15df386f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyatmo/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, oauthlib
+, requests
+, requests_oauthlib
+, freezegun
+, pytestCheckHook
+, requests-mock
+}:
+
+buildPythonPackage rec {
+  pname = "pyatmo";
+  version = "4.2.2";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "jabesq";
+    repo = "pyatmo";
+    rev = "v${version}";
+    sha256 = "sha256-3IxDDLa8KMHVkHAeTmdNVRPc5aKzF3VwL2kKnG8Fp7I=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "oauthlib~=3.1" "oauthlib" \
+      --replace "requests~=2.24" "requests"
+  '';
+
+  propagatedBuildInputs = [
+    oauthlib
+    requests
+    requests_oauthlib
+  ];
+
+  checkInputs = [
+    freezegun
+    pytestCheckHook
+    requests-mock
+  ];
+
+  pythonImportsCheck = [ "pyatmo" ];
+
+  meta = with lib; {
+    description = "Simple API to access Netatmo weather station data";
+    license = licenses.mit;
+    homepage = "https://github.com/jabesq/netatmo-api-python";
+    maintainers = with maintainers; [ delroth ];
+  };
+}
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..5ae00417b6c0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyatspi/default.nix
@@ -0,0 +1,36 @@
+{ lib, fetchurl, pkg-config, buildPythonPackage, isPy3k, at-spi2-core, pygobject3, gnome3 }:
+
+buildPythonPackage rec {
+  pname = "pyatspi";
+  version = "2.38.0";
+  format = "other";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
+    sha256 = "/4CTEv0ML2HhkcGBoaY4owtXm5G2gs+1oFU1pVJltD0=";
+  };
+
+  nativeBuildInputs = [ pkg-config ];
+
+  buildInputs = [
+    at-spi2-core
+    pygobject3
+  ];
+
+  disabled = !isPy3k;
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = pname;
+      attrPath = "python3.pkgs.${pname}";
+    };
+  };
+
+  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..187f94dbd778
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyatv/default.nix
@@ -0,0 +1,57 @@
+{ lib, stdenv, buildPythonPackage
+, aiohttp
+, aiozeroconf
+, asynctest
+, cryptography
+, deepdiff
+, netifaces
+, protobuf
+, pytest
+, pytest-aiohttp
+, pytest-asyncio
+, pytestrunner
+, srptools
+, zeroconf
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pyatv";
+  version = "0.7.5";
+  src = fetchFromGitHub {
+    owner = "postlund";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "06qj6r9kcal2nimg8rpjfid8rnlz43l7hn0v9v1mpayjmv2fl8sp";
+  };
+
+  nativeBuildInputs = [ pytestrunner];
+
+  propagatedBuildInputs = [
+    aiozeroconf
+    srptools
+    aiohttp
+    protobuf
+    cryptography
+    netifaces
+    zeroconf
+  ];
+
+  checkInputs = [
+    deepdiff
+    pytest
+    pytest-aiohttp
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  meta = with lib; {
+    description = "A python client library for the Apple TV";
+    homepage = "https://github.com/postlund/pyatv";
+    license = licenses.mit;
+    maintainers = with maintainers; [ elseym ];
+  };
+}
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..d88dc7009b73
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyaudio/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPyPy
+, pkgs
+}:
+
+buildPythonPackage rec {
+  pname = "PyAudio";
+  version = "0.2.11";
+  disabled = isPyPy;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "93bfde30e0b64e63a46f2fd77e85c41fd51182a4a3413d9edfaf9ffaa26efb74";
+  };
+
+  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/pyavm/default.nix b/nixpkgs/pkgs/development/python-modules/pyavm/default.nix
new file mode 100644
index 000000000000..4535767a69c9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyavm/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest
+, astropy
+, astropy-helpers
+, pillow
+}:
+
+buildPythonPackage rec {
+  pname = "pyavm";
+  version = "0.9.4";
+
+  src = fetchPypi {
+    pname = "PyAVM";
+    inherit version;
+    sha256 = "f298b864e5bc101ecbb0e46252e95e18a180ac28ba6ec362e63c12a7e914e386";
+  };
+
+  propagatedBuildInputs = [ astropy-helpers ];
+
+  checkInputs = [ pytest astropy pillow ];
+
+  checkPhase = "pytest";
+
+  # Disable automatic update of the astropy-helper module
+  postPatch = ''
+    substituteInPlace setup.cfg --replace "auto_use = True" "auto_use = False"
+  '';
+
+  meta = with lib; {
+    description = "Simple pure-python AVM meta-data handling";
+    homepage = "http://astrofrog.github.io/pyavm/";
+    license = licenses.mit;
+    maintainers = [ 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..63e180b11b2b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyaxmlparser/default.nix
@@ -0,0 +1,35 @@
+{ buildPythonPackage, lib, stdenv, lxml, click, fetchFromGitHub, pytest, isPy3k }:
+
+buildPythonPackage rec {
+  version = "0.3.24";
+  pname = "pyaxmlparser";
+
+  # the PyPI tarball doesn't ship tests.
+  src = fetchFromGitHub {
+    owner = "appknox";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0fys26p7xhbnbdzp80zm6n3mragp38p08nyrsnilfgnlpi6rjpg0";
+  };
+
+  disabled = !isPy3k;
+
+  postPatch = ''
+    substituteInPlace setup.py --replace "click==6.7" "click"
+  '';
+
+  propagatedBuildInputs = [ lxml click ];
+
+  checkInputs = [ pytest ];
+  checkPhase = ''
+    py.test tests/
+  '';
+
+  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/pybase64/default.nix b/nixpkgs/pkgs/development/python-modules/pybase64/default.nix
new file mode 100644
index 000000000000..e462d53fea88
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pybase64/default.nix
@@ -0,0 +1,27 @@
+{ buildPythonPackage, isPy3k, lib, stdenv, fetchPypi, six, pytest }:
+
+buildPythonPackage rec {
+  pname = "pybase64";
+  version = "1.0.2";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "c430b36751dd89820c867aadd0130bbe8ce007ee570cbe91bb23012fb6f52e87";
+  };
+
+  propagatedBuildInputs = [ six ];
+  checkInputs = [ pytest ];
+
+  checkPhase = ''
+    py.test
+  '';
+
+  meta = with lib; {
+    homepage = "https://pypi.python.org/pypi/pybase64";
+    description = "Fast Base64 encoding/decoding";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ ma27 ];
+  };
+}
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..9cca6cf57efc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pybids/default.nix
@@ -0,0 +1,51 @@
+{ buildPythonPackage
+, lib
+, fetchPypi
+, isPy27
+, click
+, num2words
+, numpy
+, scipy
+, pandas
+, nibabel
+, patsy
+, bids-validator
+, sqlalchemy
+, pytest
+, pathlib
+}:
+
+buildPythonPackage rec {
+  version = "0.12.4";
+  pname = "pybids";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "830f3f518ab0d2e058e9ba6d6ff9a942792909c874433b3ad58a3339a23f46bf";
+  };
+
+  propagatedBuildInputs = [
+    click
+    num2words
+    numpy
+    scipy
+    pandas
+    nibabel
+    patsy
+    bids-validator
+    sqlalchemy
+  ];
+
+  checkInputs = [ pytest ] ++ lib.optionals isPy27 [ pathlib ];
+
+  checkPhase = ''
+    pytest
+  '';
+
+  meta = with lib; {
+    description = "Python tools for querying and manipulating BIDS datasets";
+    homepage = "https://github.com/bids-standard/pybids";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pybigwig/default.nix b/nixpkgs/pkgs/development/python-modules/pybigwig/default.nix
new file mode 100644
index 000000000000..be54a38cd996
--- /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.17";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "157x6v48y299zm382krf1dw08fdxg95im8lnabhp5vc94s04zxj1";
+  };
+
+  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..3fd934938601
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pybind11/default.nix
@@ -0,0 +1,71 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, python
+, pytest
+, cmake
+, catch
+, numpy
+, eigen
+, scipy
+}:
+
+buildPythonPackage rec {
+  pname = "pybind11";
+  version = "2.6.1";
+
+  src = fetchFromGitHub {
+    owner = "pybind";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "TXljeRFonQwEmlIGMnTHwdfPsd9cMOVn5/1zb3tYBfI=";
+  };
+
+  nativeBuildInputs = [ cmake ];
+
+  buildInputs = [ catch ];
+
+  cmakeFlags = [
+    "-DEIGEN3_INCLUDE_DIR=${eigen}/include/eigen3"
+  ] ++ lib.optionals (python.isPy3k && !stdenv.cc.isClang) [
+  # Enable some tests only on Python 3. The "test_string_view" test
+  # 'testTypeError: string_view16_chars(): incompatible function arguments'
+  # fails on Python 2.
+    "-DPYBIND11_CPP_STANDARD=-std=c++17"
+  ];
+
+  dontUseSetuptoolsBuild = true;
+  dontUsePipInstall = true;
+  dontUseSetuptoolsCheck = true;
+
+  preFixup = ''
+    pushd ..
+    export PYBIND11_USE_CMAKE=1
+    setuptoolsBuildPhase
+    pipInstallPhase
+    # 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
+    popd
+  '';
+
+  checkInputs = [
+    pytest
+    numpy
+    scipy
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/pybind/pybind11";
+    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 ];
+  };
+}
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..4b6f7f1682ff
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pybindgen/default.nix
@@ -0,0 +1,22 @@
+{ lib, stdenv, fetchPypi, buildPythonPackage, isPy3k, setuptools_scm, pygccxml }:
+buildPythonPackage rec {
+  pname = "PyBindGen";
+  version = "0.21.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "4501aa3954fdac7bb4c049894f8aa1f0f4e1c1f50cc2303feef9bbe3aecfe364";
+  };
+
+  buildInputs = [ setuptools_scm ];
+
+  checkInputs = [ pygccxml ];
+  doCheck = (!isPy3k); # Fails to import module 'cxxfilt' from pygccxml on Py3k
+
+  meta = with lib; {
+    homepage = "https://github.com/gjcarneiro/pybindgen";
+    description = "Python Bindings Generator";
+    license = licenses.lgpl2;
+    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/pyblosxom/default.nix b/nixpkgs/pkgs/development/python-modules/pyblosxom/default.nix
new file mode 100644
index 000000000000..dee6aea559a5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyblosxom/default.nix
@@ -0,0 +1,31 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchurl
+, pygments
+, markdown
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "pyblosxom";
+  version = "1.5.3";
+  disabled = isPy3k;
+
+  src = fetchurl {
+    url = "https://github.com/pyblosxom/pyblosxom/archive/v${version}.tar.gz";
+    sha256 = "0de9a7418f4e6d1c45acecf1e77f61c8f96f036ce034493ac67124626fd0d885";
+  };
+
+  propagatedBuildInputs = [ pygments markdown ];
+
+  # FAIL:test_generate_entry and test_time
+  # both tests fail due to time issue that doesn't seem to matter in practice
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "http://pyblosxom.github.io";
+    description = "File-based blogging engine";
+    license = licenses.mit;
+  };
+
+}
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..a02861c68cda
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pybluez/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, pkgs
+}:
+
+buildPythonPackage rec {
+  version = "unstable-20160819";
+  pname = "pybluez";
+
+  propagatedBuildInputs = [ pkgs.bluez ];
+
+  src = fetchFromGitHub {
+    owner = "karulis";
+    repo = pname;
+    rev = "a0b226a61b166e170d48539778525b31e47a4731";
+    sha256 = "104dm5ngfhqisv1aszdlr3szcav2g3bhsgzmg4qfs09b3i5zj047";
+  };
+
+  # the tests do not pass
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Bluetooth Python extension module";
+    license = licenses.gpl2;
+    maintainers = with maintainers; [ leenaars ];
+  };
+
+}
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..ca093ba8e8bb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pybotvac/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, requests
+, requests_oauthlib
+, voluptuous
+}:
+
+buildPythonPackage rec {
+  pname = "pybotvac";
+  version = "0.0.20";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-1NnTSO4vO3Ryt4vYD5ZTQGr241GqA2KsGRBVowSTCzM=";
+  };
+
+  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; [ elseym ];
+  };
+}
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..eacbd81055c5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pybrowserid/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv, 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; [ worldofpeace ];
+  };
+}
+
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..2dbd4e8cff58
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pybtex-docutils/default.nix
@@ -0,0 +1,20 @@
+{ lib, buildPythonPackage, fetchPypi, docutils, pybtex, six }:
+
+buildPythonPackage rec {
+  version = "1.0.0";
+  pname = "pybtex-docutils";
+
+  doCheck = false;
+  buildInputs = [ docutils pybtex six ];
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "cead6554b4af99c287dd29f38b1fa152c9542f56a51cb6cbc3997c95b2725b2e";
+  };
+
+  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..fb6fbf8dd381
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pybtex/default.nix
@@ -0,0 +1,20 @@
+{ lib, buildPythonPackage, fetchPypi, latexcodec, pyyaml }:
+
+buildPythonPackage rec {
+  version = "0.23.0";
+  pname = "pybtex";
+
+  doCheck = false;
+  propagatedBuildInputs = [ latexcodec pyyaml ];
+
+  src = fetchPypi {
+    inherit version pname;
+    sha256 = "b92be18ccd5e9a37895949dcf359a1f6890246b73646dddf1129178ee12e4bef";
+  };
+
+  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..554a6ab0b02d
--- /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.0.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "623061d305bd5513a911abb2cbd0e37670be166a270123b43ca757bf78e4b438";
+  };
+
+  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..24e0f9792d7a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycairo/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, fetchFromGitHub
+, meson
+, ninja
+, buildPythonPackage
+, pytestCheckHook
+, pkg-config
+, cairo
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "pycairo";
+  version = "1.18.2";
+
+  format = "other";
+
+  src = fetchFromGitHub {
+    owner = "pygobject";
+    repo = "pycairo";
+    rev = "v${version}";
+    sha256 = "142145a2whvlk92jijrbf3i2bqrzmspwpysj0bfypw0krzi0aa6j";
+  };
+
+  nativeBuildInputs = [
+    meson
+    ninja
+    pkg-config
+  ];
+
+  buildInputs = [
+    cairo
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  mesonFlags = [
+    "-Dpython=${if isPy3k then "python3" else "python"}"
+  ];
+
+  meta = with lib; {
+    description = "Python 2/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/pycallgraph/default.nix b/nixpkgs/pkgs/development/python-modules/pycallgraph/default.nix
new file mode 100644
index 000000000000..1353af406ca4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycallgraph/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "pycallgraph";
+  version = "1.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0w8yr43scnckqcv5nbyd2dq4kpv74ai856lsdsf8iniik07jn9mi";
+  };
+
+  buildInputs = [ pytest ];
+
+  # Tests do not work due to this bug: https://github.com/gak/pycallgraph/issues/118
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "http://pycallgraph.slowchop.com";
+    description = "Call graph visualizations for Python applications";
+    maintainers = with maintainers; [ auntie ];
+    license = licenses.gpl2;
+  };
+
+}
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..6fc9d2af1cbc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycangjie/default.nix
@@ -0,0 +1,36 @@
+{ lib, stdenv, fetchurl, bash, autoconf, automake, libtool, pkg-config, libcangjie
+, sqlite, buildPythonPackage, cython
+}:
+
+let
+  rev = "361bb413203fd43bab624d98edf6f7d20ce6bfd3";
+in buildPythonPackage {
+  pname = "pycangjie";
+  version = "1.3_rev_${rev}";
+  format = "other";
+
+  src = fetchurl {
+    url = "https://github.com/Cangjians/pycangjie/archive/${rev}.tar.gz";
+    sha256 = "12yi09nyffmn4va7lzk4irw349qzlbxgsnb89dh15cnw0xmrin05";
+  };
+
+  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..ab9088cf1e5f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycapnp/default.nix
@@ -0,0 +1,35 @@
+{ lib, stdenv
+, buildPythonPackage
+, capnproto
+, cython
+, fetchFromGitHub
+, isPy27
+, isPyPy
+, pkgconfig
+}:
+
+buildPythonPackage rec {
+  pname = "pycapnp";
+  version = "1.0.0";
+  disabled = isPyPy || isPy27;
+
+  src = fetchFromGitHub {
+    owner = "capnproto";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1n6dq2fbagi3wvrpkyb7wx4y15nkm2grln4y75hrqgmnli8ggi9v";
+  };
+
+  buildInputs = [ capnproto cython pkgconfig ];
+
+  # Tests disabled due to dependency on jinja and various other libraries.
+  doCheck = false;
+
+  pythonImportsCheck = [ "capnp" ];
+
+  meta = with lib; {
+    maintainers = with maintainers; [ cstrahan lukeadams ];
+    license = licenses.bsd2;
+    homepage = "https://capnproto.github.io/pycapnp/";
+  };
+}
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/pycarddav/default.nix b/nixpkgs/pkgs/development/python-modules/pycarddav/default.nix
new file mode 100644
index 000000000000..7885cf65b83b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycarddav/default.nix
@@ -0,0 +1,31 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+, isPyPy
+, vobject
+, lxml
+, requests
+, urwid
+, pyxdg
+}:
+
+buildPythonPackage rec {
+  version = "0.7.0";
+  pname = "pycarddav";
+  disabled = isPy3k || isPyPy;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0avkrcpisfvhz103v7vmq2jd83hvmpqrb4mlbx6ikkk1wcvclsx8";
+  };
+
+  propagatedBuildInputs = [ vobject lxml requests urwid pyxdg ];
+
+  meta = with lib; {
+    description = "Command-line interface carddav client";
+    homepage = "http://lostpackets.de/pycarddav";
+    license = licenses.mit;
+  };
+
+}
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..8404063ac1f8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycares/default.nix
@@ -0,0 +1,35 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, python
+, c-ares
+, cffi
+}:
+
+buildPythonPackage rec {
+  pname = "pycares";
+  version = "3.1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "18dfd4fd300f570d6c4536c1d987b7b7673b2a9d14346592c5d6ed716df0d104";
+  };
+
+  buildInputs = [ c-ares ];
+
+  propagatedBuildInputs = [ cffi ];
+
+  checkPhase = ''
+    ${python.interpreter} tests/tests.py
+  '';
+
+  # requires network access
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/saghul/pycares";
+    description = "Interface for c-ares";
+    license = licenses.mit;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pycassa/default.nix b/nixpkgs/pkgs/development/python-modules/pycassa/default.nix
new file mode 100644
index 000000000000..0e07d8d436f7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycassa/default.nix
@@ -0,0 +1,38 @@
+{ lib, buildPythonPackage, fetchPypi, thrift, isPy3k }:
+
+let
+
+  thrift' = thrift.overridePythonAttrs (old: rec {
+    version = "0.9.3";
+    src= fetchPypi {
+      inherit (old) pname;
+      inherit version;
+      sha256 = "0zl7cgckqy9j5vq8wyfzw82q1blkdpsblnmhv8c6ffcxs4xkvg6z";
+    };
+  });
+
+in
+
+buildPythonPackage rec {
+  pname = "pycassa";
+  version = "1.11.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1nsqjzgn6v0rya60dihvbnrnq1zwaxl2qwf0sr08q9qlkr334hr6";
+  };
+
+  disabled = isPy3k;
+
+  # Tests are not executed since they require a cassandra up and
+  # running
+  doCheck = false;
+
+  propagatedBuildInputs = [ thrift' ];
+
+  meta = with lib; {
+    description = "A python client library for Apache Cassandra";
+    homepage = "https://github.com/pycassa/pycassa";
+    license = licenses.mit;
+  };
+}
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..55f30f9e55a9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycategories/default.nix
@@ -0,0 +1,35 @@
+{ buildPythonPackage
+, callPackage
+, pytestcov
+, fetchPypi
+, lib
+, pytest
+, pythonOlder
+, pytestrunner
+}:
+
+buildPythonPackage rec {
+  pname = "pycategories";
+  version = "1.2.0";
+  disabled = pythonOlder "3.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "bd70ecb5e94e7659e564ea153f0c7673291dc37c526c246800fc08d6c5378099";
+  };
+
+  nativeBuildInputs = [ pytestrunner ];
+
+  # Is private because the author states it's unmaintained
+  # and shouldn't be used in production code
+  propagatedBuildInputs = [ (callPackage ./infix.nix { }) ];
+
+  checkInputs = [ pytest pytestcov ];
+
+  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..712029b692ce
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycdio/default.nix
@@ -0,0 +1,47 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, setuptools
+, nose
+, pkgs
+}:
+
+buildPythonPackage rec {
+  pname = "pycdio";
+  version = "2.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "01b7vqqfry071p60sabydym7r3m3rxszyqpdbs1qi5rk2sfyblnn";
+  };
+
+  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.pkgconfig 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)";
+    maintainers = with maintainers; [ rycee ];
+    license = licenses.gpl3Plus;
+  };
+
+}
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..ca0b0fe5ecf0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycfdns/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, aiohttp
+, async-timeout
+, buildPythonPackage
+, fetchFromGitHub
+}:
+
+buildPythonPackage rec {
+  pname = "pycfdns";
+  version = "1.2.1";
+
+  src = fetchFromGitHub {
+    owner = "ludeeus";
+    repo = pname;
+    rev = version;
+    sha256 = "0df4695cb0h6f2lnn6dx4h5al2ra93zp1hzfaz07nj2gvirswp83";
+  };
+
+  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/pychart/default.nix b/nixpkgs/pkgs/development/python-modules/pychart/default.nix
new file mode 100644
index 000000000000..2c2399fca92e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pychart/default.nix
@@ -0,0 +1,19 @@
+{ lib, stdenv, 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..1702cde840cf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pychef/default.nix
@@ -0,0 +1,30 @@
+{ lib, stdenv
+, 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/pychromecast/default.nix b/nixpkgs/pkgs/development/python-modules/pychromecast/default.nix
new file mode 100644
index 000000000000..fecf3f09ca7c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pychromecast/default.nix
@@ -0,0 +1,27 @@
+{ lib, fetchPypi, buildPythonPackage, requests, zeroconf, protobuf, casttube, isPy3k }:
+
+buildPythonPackage rec {
+  pname = "PyChromecast";
+  version = "7.7.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1w7jayb0z529bh1ybb16pfm0m08qqi4px1q0qwlvcxlcrd2v3m5a";
+  };
+
+  disabled = !isPy3k;
+
+  propagatedBuildInputs = [ requests zeroconf protobuf casttube ];
+
+  # 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/pyclipper/default.nix b/nixpkgs/pkgs/development/python-modules/pyclipper/default.nix
new file mode 100644
index 000000000000..e89389547096
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyclipper/default.nix
@@ -0,0 +1,35 @@
+{ lib, stdenv
+, fetchPypi
+, buildPythonPackage
+, setuptools_scm
+, cython
+}:
+
+buildPythonPackage rec {
+  pname = "pyclipper";
+  version = "1.2.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "ca3751e93559f0438969c46f17459d07f983281dac170c3479de56492e152855";
+  };
+
+  nativeBuildInputs = [
+    setuptools_scm
+    cython
+  ];
+
+  # Requires pytest_runner to perform tests, which requires deprecated
+  # features of setuptools. Seems better to not run tests. This should
+  # be fixed upstream.
+  doCheck = false;
+  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..ada4eeeb556c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycm/default.nix
@@ -0,0 +1,35 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub, isPy3k, numpy, pytest }:
+
+buildPythonPackage rec {
+  pname = "pycm";
+  version = "2.5";
+
+  disabled = !isPy3k;
+
+  src = fetchFromGitHub {
+    owner  = "sepandhaghighi";
+    repo   = pname;
+    rev    = "v${version}";
+    sha256 = "0zfv20hd7zq95sflsivjk47b0sm7q76w7fv2i2mafn83ficzx0p0";
+  };
+
+  # remove a trivial dependency on the author's `art` Python ASCII art library
+  postPatch = ''
+    rm pycm/__main__.py
+    substituteInPlace setup.py --replace '=get_requires()' '=[]'
+  '';
+
+  checkInputs = [ pytest ];
+  propagatedBuildInputs = [ numpy ];
+
+  checkPhase = ''
+    pytest Test/
+  '';
+
+  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..f1d92a63d401
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycmarkgfm/default.nix
@@ -0,0 +1,32 @@
+{ lib, buildPythonPackage, fetchPypi, isPy27, cffi, pytest }:
+
+buildPythonPackage rec {
+  pname = "pycmarkgfm";
+  version = "1.0.1";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0wkbbma214f927ikn3cijxsrzkmm5cqz1x4fimrwx9s2wfphj250";
+  };
+
+  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/pycodestyle/default.nix b/nixpkgs/pkgs/development/python-modules/pycodestyle/default.nix
new file mode 100644
index 000000000000..e1d21a6a2eb1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycodestyle/default.nix
@@ -0,0 +1,34 @@
+{ buildPythonPackage
+, fetchPypi
+, lib
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "pycodestyle";
+  version = "2.6.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "c58a7d2815e0e8d7972bf1803331fb0152f867bd89adf8a01dfd55085434192e";
+  };
+
+  dontUseSetuptoolsCheck = true;
+
+  # https://github.com/PyCQA/pycodestyle/blob/2.5.0/tox.ini#L14
+  checkPhase = ''
+    ${python.interpreter} pycodestyle.py --max-doc-length=72 --testsuite testsuite
+    ${python.interpreter} pycodestyle.py --statistics pycodestyle.py
+    ${python.interpreter} pycodestyle.py --max-doc-length=72 --doctest
+    ${python.interpreter} -m unittest discover testsuite -vv
+  '';
+
+  meta = with lib; {
+    description = "Python style guide checker (formerly called pep8)";
+    homepage = "https://pycodestyle.readthedocs.io";
+    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..511df9f07f55
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycognito/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, boto3
+, buildPythonPackage
+, cryptography
+, envs
+, fetchFromGitHub
+, isPy27
+, mock
+, pytestCheckHook
+, python-jose
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "pycognito";
+  version = "0.1.5";
+
+  src = fetchFromGitHub {
+    owner = "pvizeli";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-RJeHPCTuaLN+zB0N0FGt4qrTI6++1ks5iBn64Cx0Psc=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace 'python-jose[cryptography]' 'python-jose'
+  '';
+
+  propagatedBuildInputs = [
+    boto3
+    envs
+    python-jose
+    requests
+  ];
+
+  disabled = isPy27;
+
+  checkInputs = [
+    mock
+    pytestCheckHook
+  ];
+
+  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 = [ 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..a21c8f6f549d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycoin/default.nix
@@ -0,0 +1,42 @@
+{ lib, stdenv
+, fetchPypi
+, buildPythonPackage
+, gnupg
+, setuptools
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pycoin";
+  version = "0.90.20201031";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "65c19204cb7aece4aae30c44b5e08beecb9c118370a9f9994d6cddaee17c351d";
+  };
+
+  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..4b177012f4ed
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycollada/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv, fetchPypi, buildPythonPackage, numpy, dateutil }:
+
+buildPythonPackage rec {
+  pname = "pycollada";
+  version = "0.7.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1rp4wlvfywgk3v6l3hnhjx61x9yqawvvivpq4dig2jj71k3mpsyj";
+  };
+
+  propagatedBuildInputs = [ numpy 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/pycontracts/default.nix b/nixpkgs/pkgs/development/python-modules/pycontracts/default.nix
new file mode 100644
index 000000000000..0b511e024dc0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycontracts/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv, 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/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..b402e9092406
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycountry/default.nix
@@ -0,0 +1,22 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+,
+}:
+
+buildPythonPackage rec {
+  pname = "pycountry";
+  version = "20.7.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0hnbabsmqimx5hqh0jbd2f64i8fhzhhbrvid57048hs5sd9ll241";
+  };
+
+  meta = with lib; {
+    homepage = "https://bitbucket.org/flyingcircus/pycountry";
+    description = "ISO country, subdivision, language, currency and script definitions and their translations";
+    license = licenses.lgpl2;
+  };
+
+}
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..a246ce53a1e0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycparser/default.nix
@@ -0,0 +1,22 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, python }:
+
+buildPythonPackage rec {
+  pname = "pycparser";
+  version = "2.20";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "2d475327684562c3a96cc71adf7dc8c4f0565175cf86b6d7a404ff4c771f15f0";
+  };
+
+  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/pycrypto/default.nix b/nixpkgs/pkgs/development/python-modules/pycrypto/default.nix
new file mode 100644
index 000000000000..a9a302cf51bd
--- /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 {
+  version = pycryptodome.version;
+  pname = "pycrypto";
+
+  # 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 = "http://www.pycrypto.org/";
+    description = "Python Cryptography Toolkit";
+    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..e88b8529a356
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycryptodome/default.nix
@@ -0,0 +1,17 @@
+{ lib, fetchPypi, buildPythonPackage }:
+
+buildPythonPackage rec {
+  version = "3.9.9";
+  pname = "pycryptodome";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "910e202a557e1131b1c1b3f17a63914d57aac55cf9fb9b51644962841c3995c4";
+  };
+
+  meta = with lib; {
+    homepage = "https://www.pycryptodome.org/";
+    description = "Python Cryptography Toolkit";
+    platforms = platforms.unix;
+  };
+}
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..d58821569e62
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycryptodomex/default.nix
@@ -0,0 +1,17 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "pycryptodomex";
+  version = "3.9.9";
+
+  meta = {
+    description = "A self-contained cryptographic library for Python";
+    homepage = "https://www.pycryptodome.org";
+    license = lib.licenses.bsd2;
+  };
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "7b5b7c5896f8172ea0beb283f7f9428e0ab88ec248ce0a5b8c98d73e26267d51";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pycryptopp/default.nix b/nixpkgs/pkgs/development/python-modules/pycryptopp/default.nix
new file mode 100644
index 000000000000..0f17d9e59a80
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycryptopp/default.nix
@@ -0,0 +1,44 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, isPy3k
+, setuptoolsDarcs
+, darcsver
+, pkgs
+}:
+
+buildPythonPackage rec {
+  pname = "pycryptopp";
+  version = "0.7.1.869544967005693312591928092448767568728501330214";
+  disabled = isPy3k;  # see https://bitbucket.org/pypy/pypy/issue/1190/
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "17v98bhh3nd6rkw0kk1xmnc9vm5ql0fji4in2wyd4zlvlfhmgb88";
+  };
+
+  patches = [
+    (fetchpatch {
+      name = "pycryptopp-cryptopp_6.patch";
+      url = "https://aur.archlinux.org/cgit/aur.git/plain/api_change.patch?h=pycryptopp&id=55f2973d6ca5e9e70438f2eadb7fb575b1a5048d";
+      sha256 = "0lvl2d32d2vkb0v6d39p9whda5bdrmlsjd41zy0x0znqm53a9i99";
+      stripLen = 1;
+      extraPrefix = "src/";
+    })
+  ];
+
+  # Prefer crypto++ library from the Nix store over the one that's included
+  # in the pycryptopp distribution.
+  preConfigure = "export PYCRYPTOPP_DISABLE_EMBEDDED_CRYPTOPP=1";
+
+  buildInputs = [ setuptoolsDarcs darcsver pkgs.cryptopp ];
+
+  meta = with lib; {
+    homepage = "https://tahoe-lafs.org/trac/pycryptopp";
+    description = "Python wrappers for the Crypto++ library";
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+  };
+
+}
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..b2314e6edfeb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyct/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, param
+, pyyaml
+, requests
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "pyct";
+  version = "0.4.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "23d7525b5a1567535c093aea4b9c33809415aa5f018dd77f6eb738b1226df6f7";
+  };
+
+  doCheck = !isPy27;
+  checkInputs = [ pytest ];
+  propagatedBuildInputs = [
+    param
+    pyyaml
+    requests
+  ];
+
+  checkPhase = ''
+    pytest
+  '';
+
+  meta = with lib; {
+    description = "Cli for python common tasks for users";
+    homepage = "https://github.com/pyviz/pyct";
+    license = licenses.bsd3;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..1db5df28e32a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycuda/default.nix
@@ -0,0 +1,70 @@
+{ buildPythonPackage
+, fetchPypi
+, fetchFromGitHub
+, Mako
+, boost
+, numpy
+, pytools
+, pytest
+, decorator
+, appdirs
+, six
+, cudatoolkit
+, python
+, mkDerivation
+, lib
+}:
+let
+  compyte = import ./compyte.nix {
+    inherit mkDerivation fetchFromGitHub;
+  };
+in
+buildPythonPackage rec {
+  pname = "pycuda";
+  version = "2020.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "effa3b99b55af67f3afba9b0d1b64b4a0add4dd6a33bdd6786df1aa4cc8761a5";
+  };
+
+  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
+  '';
+
+  # Requires access to libcuda.so.1 which is provided by the driver
+  doCheck = false;
+
+  checkPhase = ''
+    py.test
+  '';
+
+  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..fe62d1be1ea1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycurl/default.nix
@@ -0,0 +1,64 @@
+{ buildPythonPackage
+, isPyPy
+, fetchPypi
+, pythonOlder
+, curl
+, openssl
+, bottle
+, pytest
+, nose
+, flaky
+}:
+
+buildPythonPackage rec {
+  pname = "pycurl";
+  version = "7.43.0.6";
+  disabled = isPyPy || (pythonOlder "3.5"); # https://github.com/pycurl/pycurl/issues/208
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "8301518689daefa53726b59ded6b48f33751c383cf987b0ccfbbc4ed40281325";
+  };
+
+  buildInputs = [
+    curl
+    openssl.out
+  ];
+
+  nativeBuildInputs = [
+    curl
+  ];
+
+  checkInputs = [
+    bottle
+    pytest
+    nose
+    flaky
+  ];
+
+  # skip impure or flakey tests
+  # See also:
+  #   * https://github.com/NixOS/nixpkgs/issues/77304
+  checkPhase = ''
+    HOME=$TMPDIR pytest tests -k "not test_ssl_in_static_libs \
+                     and not test_keyfunction \
+                     and not test_keyfunction_bogus_return \
+                     and not test_libcurl_ssl_gnutls \
+                     and not test_libcurl_ssl_nss \
+                     and not test_libcurl_ssl_openssl" \
+                 --ignore=tests/getinfo_test.py \
+                 --ignore=tests/memory_mgmt_test.py \
+                 --ignore=tests/multi_memory_mgmt_test.py \
+                 --ignore=tests/multi_timer_test.py
+  '';
+
+  preConfigure = ''
+    substituteInPlace setup.py --replace '--static-libs' '--libs'
+    export PYCURL_SSL_LIBRARY=openssl
+  '';
+
+  meta = {
+    homepage = "http://pycurl.sourceforge.net/";
+    description = "Python wrapper for libcurl";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pycurl2/default.nix b/nixpkgs/pkgs/development/python-modules/pycurl2/default.nix
new file mode 100644
index 000000000000..1cdfb6c4413f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycurl2/default.nix
@@ -0,0 +1,34 @@
+{ lib, buildPythonPackage, fetchFromGitHub
+, isPy3k
+, simplejson
+, unittest2
+, nose
+, pkgs
+}:
+
+buildPythonPackage {
+  pname = "pycurl2";
+  version = "7.20.0";
+  disabled = isPy3k;
+
+  src = fetchFromGitHub {
+    owner = "Lispython";
+    repo = "pycurl";
+    rev = "0f00109950b883d680bd85dc6e8a9c731a7d0d13";
+    sha256 = "1qmw3cm93kxj94s71a8db9lwv2cxmr2wjv7kp1r8zildwdzhaw7j";
+  };
+
+  # error: (6, "Couldn't resolve host 'h.wrttn.me'")
+  doCheck = false;
+
+  nativeBuildInputs = [ pkgs.curl.dev ];
+  buildInputs = [ simplejson unittest2 nose ];
+
+  meta = with lib; {
+    homepage = "https://pypi.python.org/pypi/pycurl2";
+    description = "A fork from original PycURL library that no maintained from 7.19.0";
+    license = licenses.mit;
+    platforms = platforms.linux;
+  };
+
+}
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/pydantic/default.nix b/nixpkgs/pkgs/development/python-modules/pydantic/default.nix
new file mode 100644
index 000000000000..9bf4bede1faf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pydantic/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, ujson
+, email_validator
+, typing-extensions
+, python
+, isPy3k
+, pytest
+, pytestcov
+, pytest-mock
+}:
+
+buildPythonPackage rec {
+  pname = "pydantic";
+  version = "1.7.3";
+  disabled = !isPy3k;
+
+  src = fetchFromGitHub {
+    owner = "samuelcolvin";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "xihEDmly0vprmA+VdeCoGXg9PjWRPmBWAwk/9f2DLts=";
+  };
+
+  propagatedBuildInputs = [
+    ujson
+    email_validator
+    typing-extensions
+  ];
+
+  checkInputs = [
+    pytest
+    pytestcov
+    pytest-mock
+  ];
+
+  checkPhase = ''
+    pytest
+  '';
+
+  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/pydbus/default.nix b/nixpkgs/pkgs/development/python-modules/pydbus/default.nix
new file mode 100644
index 000000000000..09f777b01813
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pydbus/default.nix
@@ -0,0 +1,20 @@
+{ lib, buildPythonPackage, fetchPypi, pygobject3 }:
+
+buildPythonPackage rec {
+  pname = "pydbus";
+  version = "0.6.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0b0gipvz7vcfa9ddmwq2jrx16d4apb0hdnl5q4i3h8jlzwp1c1s2";
+  };
+
+  propagatedBuildInputs = [ pygobject3 ];
+
+  meta = {
+    homepage = "https://github.com/LEW21/pydbus";
+    description = "Pythonic DBus library";
+    license = lib.licenses.lgpl2Plus;
+    maintainers = with lib.maintainers; [ gnidorah ];
+  };
+}
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..763cfb9b8456
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pydenticon/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv
+, 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/pydexcom/default.nix b/nixpkgs/pkgs/development/python-modules/pydexcom/default.nix
new file mode 100644
index 000000000000..f83d3cbf1102
--- /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.0";
+
+  src = fetchFromGitHub {
+    owner = "gagebenne";
+    repo = pname;
+    rev = version;
+    sha256 = "19h7r0qbsqd6k6g4nz6z3k9kdmk0sx5zpsrgxwnhsff5fqi0y2ls";
+  };
+
+  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..08c5f099d28c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pydicom/default.nix
@@ -0,0 +1,60 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, isPy27
+, pytestrunner
+, pytestCheckHook
+, numpy
+, pillow
+}:
+
+let
+  pname = "pydicom";
+  version = "2.1.2";
+
+  src = fetchFromGitHub {
+    owner = "${pname}";
+    repo = "${pname}";
+    rev = "v${version}";
+    sha256 = "sha256-iExy+mUs1uqs/u9N6btlqyP6/TvoPVsuOuzs56zZAS8=";
+  };
+
+  # Pydicom needs pydicom-data to run some tests. If these files are downloaded
+  # before the package creation, it'll try to download during the checkPhase.
+  test_data = fetchFromGitHub {
+    owner = "${pname}";
+    repo = "${pname}-data";
+    rev = "bbb723879690bb77e077a6d57657930998e92bd5";
+    sha256 = "sha256-dCI1temvpNWiWJYVfQZKy/YJ4ad5B0e9hEKHJnEeqzk=";
+  };
+
+in
+buildPythonPackage {
+  inherit pname version src;
+  disabled = isPy27;
+
+  propagatedBuildInputs = [ numpy pillow ];
+
+  checkInputs = [ pytestrunner 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
+  '';
+
+  # This test try to remove a dicom inside $HOME/.pydicom/data/ and download it again.
+  disabledTests = [
+    "test_fetch_data_files"
+  ];
+
+  meta = with lib; {
+    homepage = "https://pydicom.github.io";
+    description = "Pure-Python package for working with DICOM files";
+    license = licenses.mit;
+    maintainers = with maintainers; [ bcdarwin ];
+  };
+}
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..d132fad73138
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pydispatcher/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv
+, 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/pydns/default.nix b/nixpkgs/pkgs/development/python-modules/pydns/default.nix
new file mode 100644
index 000000000000..a93820bfaef2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pydns/default.nix
@@ -0,0 +1,23 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "pydns";
+  version = "2.3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0qnv7i9824nb5h9psj0rwzjyprwgfiwh5s5raa9avbqazy5hv5pi";
+  };
+
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Python DNS library";
+    homepage = "http://pydns.sourceforge.net/";
+    license = licenses.psfl;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pydocstyle/2.nix b/nixpkgs/pkgs/development/python-modules/pydocstyle/2.nix
new file mode 100644
index 000000000000..9ce4ffc0f816
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pydocstyle/2.nix
@@ -0,0 +1,33 @@
+{ lib, buildPythonPackage, fetchFromGitHub, isPy3k, pythonOlder
+, snowballstemmer, six, configparser
+, pytest, mock, pathlib }:
+
+buildPythonPackage rec {
+  pname = "pydocstyle";
+  version = "2.1.1";
+
+  # no tests on PyPI
+  # https://github.com/PyCQA/pydocstyle/issues/302
+  src = fetchFromGitHub {
+    owner = "PyCQA";
+    repo = pname;
+    rev = version;
+    sha256 = "1h0k8lpx14svc8dini62j0kqiam10pck5sdzvxa4xhsx7y689g5l";
+  };
+
+  propagatedBuildInputs = [ snowballstemmer six ] ++ lib.optional (!isPy3k) configparser;
+
+  checkInputs = [ pytest mock ] ++ lib.optional (pythonOlder "3.4") pathlib;
+
+  checkPhase = ''
+    # test_integration.py installs packages via pip
+    py.test --cache-clear -vv src/tests -k "not test_integration"
+  '';
+
+  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/pydocstyle/default.nix b/nixpkgs/pkgs/development/python-modules/pydocstyle/default.nix
new file mode 100644
index 000000000000..36c61ace8563
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pydocstyle/default.nix
@@ -0,0 +1,34 @@
+{ lib, buildPythonPackage, fetchFromGitHub, isPy3k
+, mock
+, pytest
+, snowballstemmer
+}:
+
+buildPythonPackage rec {
+  pname = "pydocstyle";
+  version = "5.0.2";
+  disabled = !isPy3k;
+
+  src = fetchFromGitHub {
+    owner = "PyCQA";
+    repo = pname;
+    rev = version;
+    sha256 = "03z8miyppm2xncrc9yjilwl7z5c5cpv51zha580v64p8sb2l0j7j";
+  };
+
+  propagatedBuildInputs = [ snowballstemmer ];
+
+  checkInputs = [ pytest mock ];
+
+  checkPhase = ''
+    # test_integration.py installs packages via pip
+    py.test --cache-clear -vv src/tests -k "not test_integration"
+  '';
+
+  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/pydot/default.nix b/nixpkgs/pkgs/development/python-modules/pydot/default.nix
new file mode 100644
index 000000000000..0a637a48ba2f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pydot/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, substituteAll
+, graphviz
+, python
+, chardet
+, pyparsing
+}:
+
+buildPythonPackage rec {
+  pname = "pydot";
+  version = "1.4.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d49c9d4dd1913beec2a997f831543c8cbd53e535b1a739e921642fe416235f01";
+  };
+
+  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"
+  '';
+
+  propagatedBuildInputs = [ pyparsing ];
+
+  checkInputs = [ chardet ];
+
+  checkPhase = ''
+    cd test
+    ${python.interpreter} pydot_unittest.py
+  '';
+
+  meta = {
+    homepage = "https://github.com/erocarrera/pydot";
+    description = "Allows to easily create both directed and non directed graphs from Python";
+    license = lib.licenses.mit;
+  };
+}
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/pydrive/default.nix b/nixpkgs/pkgs/development/python-modules/pydrive/default.nix
new file mode 100644
index 000000000000..aa0515323e29
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pydrive/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, google_api_python_client
+, oauth2client
+, pyyaml
+}:
+
+buildPythonPackage rec {
+  pname = "pydrive";
+  version = "1.3.1";
+
+  src = fetchPypi {
+    pname = "PyDrive";
+    inherit version;
+    sha256 = "11q7l94mb34hfh9wkdwfrh5xw99y13wa33ba7xp1q23q4b60v2c3";
+  };
+
+  propagatedBuildInputs = [
+    google_api_python_client
+    oauth2client
+    pyyaml
+  ];
+
+  # requires client_secrets.json
+  doCheck = false;
+
+  meta = {
+    description = "Google Drive API Python wrapper library";
+    homepage = "https://github.com/gsuitedevs/PyDrive";
+    license = lib.licenses.asl20;
+  };
+}
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..655adecd5c89
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pydsdl/default.nix
@@ -0,0 +1,37 @@
+{ lib, buildPythonPackage, fetchFromGitHub, pythonOlder }:
+
+ buildPythonPackage rec {
+  pname = "pydsdl";
+  version = "1.4.2";
+  disabled = pythonOlder "3.5"; # only python>=3.5 is supported
+
+  src = fetchFromGitHub {
+    owner = "UAVCAN";
+    repo = pname;
+    rev = version;
+    sha256 = "03kbpzdrjzj5vpgz5rhc110pm1axdn3ynv88b42zq6iyab4k8k1x";
+  };
+
+  propagatedBuildInputs = [
+  ];
+
+  # allow for writable directory for darwin
+  preBuild = ''
+    export HOME=$TMPDIR
+  '';
+
+  # repo doesn't contain tests, ensure imports aren't broken
+  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..884df63ce036
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pydub/default.nix
@@ -0,0 +1,33 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub, scipy, ffmpeg-full }:
+
+buildPythonPackage rec {
+  pname = "pydub";
+  version = "0.24.1";
+  # pypi version doesn't include required data files for tests
+  src = fetchFromGitHub {
+    owner = "jiaaro";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1pv4n54kkjpbjlvwh9b6a7zyq1ylg0fjmd2q4ws9nc2a6mrcivhc";
+  };
+
+
+  # disable a test that fails on aarch64 due to rounding errors
+  postPatch = lib.optionalString stdenv.isAarch64 ''
+    substituteInPlace test/test.py \
+      --replace "test_overlay_with_gain_change" "notest_overlay_with_gain_change"
+  '';
+
+  checkInputs = [ scipy ffmpeg-full ];
+
+  checkPhase = ''
+    python test/test.py
+  '';
+
+  meta = with lib; {
+    description = "Manipulate audio with a simple and easy high level interface.";
+    homepage    = "http://pydub.com/";
+    license     = licenses.mit;
+    platforms   = platforms.all;
+  };
+}
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..82556ac1a710
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pydy/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, nose
+, cython
+, numpy
+, scipy
+, sympy
+}:
+
+buildPythonPackage rec {
+  pname = "pydy";
+  version = "0.5.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1b487a62b55a8c8664009b09bf789254b2c942cd704a380bedb1057418c94fa2";
+  };
+
+  checkInputs = [
+    nose
+    cython
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    scipy
+    sympy
+  ];
+
+  checkPhase = ''
+    nosetests
+  '';
+
+  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/pyechonest/default.nix b/nixpkgs/pkgs/development/python-modules/pyechonest/default.nix
new file mode 100644
index 000000000000..10ade4fa2cab
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyechonest/default.nix
@@ -0,0 +1,17 @@
+{ lib, stdenv, 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/pyee/default.nix b/nixpkgs/pkgs/development/python-modules/pyee/default.nix
new file mode 100644
index 000000000000..712db3e87123
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyee/default.nix
@@ -0,0 +1,37 @@
+{ buildPythonPackage, fetchPypi, lib, vcversioner, pytestrunner, mock, pytest, pytest-asyncio, pytest-trio, twisted, zipp, pyparsing, pyhamcrest, futures, attrs, stdenv, isPy27 }:
+
+buildPythonPackage rec {
+  pname = "pyee";
+  version = "8.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "92dacc5bd2bdb8f95aa8dd2585d47ca1c4840e2adb95ccf90034d64f725bfd31";
+  };
+
+  buildInputs = [
+    vcversioner
+  ];
+
+  checkInputs = [
+    mock
+    pyhamcrest
+    pytest
+    pytest-asyncio
+    pytest-trio
+    pytestrunner
+    twisted
+  ] ++ lib.optional isPy27 [
+    attrs
+    futures
+    pyparsing
+    zipp
+  ];
+
+  meta = {
+    description = "A port of Node.js's EventEmitter to python";
+    homepage = "https://github.com/jfhbrook/pyee";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ kmein ];
+  };
+}
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..258c97a3c112
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyelftools/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, python
+, stdenv
+}:
+
+buildPythonPackage rec {
+  pname = "pyelftools";
+  version = "0.27";
+
+  src = fetchFromGitHub {
+    owner = "eliben";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "09igdym2qj2fvfcazbz25qybmgz7ccrn25xn3havfkdkka0z0i3p";
+  };
+
+  doCheck = stdenv.is64bit && !stdenv.isDarwin;
+
+  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/pyemd/default.nix b/nixpkgs/pkgs/development/python-modules/pyemd/default.nix
new file mode 100644
index 000000000000..4e7594fbab5b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyemd/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv, 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..fe4182fd53d8
--- /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.1.1";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ce0915d7acd771fde6e8c2dce8ad0cb0e6f7c4fa8430cc96e3e7134e99aeb12f";
+  };
+
+  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/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..26a61ddca540
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyerfa/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+, liberfa
+, packaging
+, numpy
+}:
+
+buildPythonPackage rec {
+  pname = "pyerfa";
+  format = "pyproject";
+  version = "1.7.1.1";
+
+  doCheck = false;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "09i2qcsvxd3q04a5yaf6fwzg79paaslpksinan9d8smj7viql15i";
+  };
+
+  nativeBuildInputs = [ packaging ];
+  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/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..15014cdafd28
--- /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.4";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "00f15f4bae2947de49b3206f2600f78780008e044380f7aafe0ce52969cda4ca";
+  };
+
+  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..34d11830e570
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyexcel-xls/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pyexcel-io
+, xlrd
+, xlwt
+, nose
+, pyexcel
+, mock
+}:
+
+buildPythonPackage rec {
+  pname = "pyexcel-xls";
+  version = "0.6.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "c4cc1fb4ac5d1682a44d9a368a43ec2e089ad6fc46884648ccfad46863e3da0a";
+  };
+
+  propagatedBuildInputs = [
+    pyexcel-io
+    xlrd
+    xlwt
+  ];
+
+  checkInputs = [
+    nose
+    pyexcel
+    mock
+  ];
+
+  checkPhase = "nosetests";
+
+  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..ca562ca5586b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyexcel/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+, lml
+, pyexcel-io
+, texttable
+, nose
+}:
+
+buildPythonPackage rec {
+  pname = "pyexcel";
+  version = "0.6.6";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "39b0bb8f033d9b5523b126cf5a5259d1990ea82b8a23c8eab7aa5e23116803df";
+  };
+
+  propagatedBuildInputs = [
+    lml
+    pyexcel-io
+    texttable
+  ];
+
+  checkInputs = [
+    nose
+  ];
+
+  # Tests depend on pyexcel-xls & co. causing circular dependency.
+  # https://github.com/pyexcel/pyexcel/blob/dev/tests/requirements.txt
+  doCheck = false;
+
+  pythonImportsCheck = [ "pyexcel" ];
+
+  checkPhase = "nosetests";
+
+  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/pyexcelerator/default.nix b/nixpkgs/pkgs/development/python-modules/pyexcelerator/default.nix
new file mode 100644
index 000000000000..373885073949
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyexcelerator/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "pyexcelerator";
+  version = "0.6.4.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "18rcnc9f71lj06h8nppnv6idzb7xfmh2rp1zfqayskcg686lilrb";
+  };
+
+  disabled = isPy3k;
+
+  # No tests are included in archive
+  doCheck = false;
+
+  meta = with lib; {
+    description = "library for generating Excel 97/2000/XP/2003 and OpenOffice Calc compatible spreadsheets.";
+    homepage = "https://sourceforge.net/projects/pyexcelerator";
+    license = licenses.bsdOriginal;
+    maintainers = with maintainers; [ womfoo ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyexiv2/default.nix b/nixpkgs/pkgs/development/python-modules/pyexiv2/default.nix
new file mode 100644
index 000000000000..bf7afdf79e2c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyexiv2/default.nix
@@ -0,0 +1,28 @@
+{ lib, buildPythonPackage, fetchurl, python, exiv2, scons, boost }:
+
+buildPythonPackage rec {
+  pname = "pyexiv2";
+  version = "0.3.2";
+  format = "other";
+
+  src = fetchurl {
+    url = "https://launchpad.net/pyexiv2/0.3.x/0.3.2/+download/${pname}-${version}.tar.bz2";
+    sha256 = "09r1ga6kj5cnmrldpkqzvdhh7xi7aad9g4fbcr1gawgsd9y13g0a";
+  };
+
+  preBuild = ''
+    sed -i -e "s@env = Environment()@env = Environment( ENV = os.environ )@" src/SConscript
+  '';
+
+  preInstall = ''
+    sed -i -e "s@    python_lib_path = get_python_lib(plat_specific=True)@    python_lib_path = \'/lib/python2.7/site-packages\'@" src/SConscript
+  '';
+
+  buildInputs = [ python exiv2 scons boost ];
+
+  meta = with lib; {
+    platforms = platforms.linux;
+    # Likely needs an older boost which does not have `boost_pythonXY` but `boost_python`.
+    broken = true; # 2018-06-23
+  };
+}
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..befbd3c2de1d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyext/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv, 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/pyface/default.nix b/nixpkgs/pkgs/development/python-modules/pyface/default.nix
new file mode 100644
index 000000000000..d317ebdf21b8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyface/default.nix
@@ -0,0 +1,24 @@
+{ lib, fetchPypi, buildPythonPackage
+, setuptools, six, traits
+}:
+
+buildPythonPackage rec {
+  pname = "pyface";
+  version = "7.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a3e22a4d31429f0d5b9ff50aaac3fb47e4f7da678b6b0439a7b91ef40675f88d";
+  };
+
+  propagatedBuildInputs = [ setuptools six traits ];
+
+  doCheck = false; # Needs X server
+
+  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..9e21854a7c42
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyfaidx/default.nix
@@ -0,0 +1,24 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "pyfaidx";
+  version = "0.5.9.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "73e740eaa45c097a09e543450f88d5ed06c0ece4b6936dad7e71077f67797b74";
+  };
+
+  propagatedBuildInputs = [ six ];
+
+  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 = [ 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..64ec58487c45
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyfakefs/default.nix
@@ -0,0 +1,44 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, pythonOlder, python, pytest, glibcLocales }:
+
+buildPythonPackage rec {
+  version = "4.3.2";
+  pname = "pyfakefs";
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "dfeed4715e2056e3e56b9c5f51a679ce2934897eef926f3d14e5364e43f19070";
+  };
+
+  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"
+    substituteInPlace pyfakefs/tests/fake_filesystem_unittest_test.py \
+      --replace "test_copy_real_file" "notest_copy_real_file"
+  '' + (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 = [ pytest glibcLocales ];
+
+  checkPhase = ''
+    export LC_ALL=en_US.UTF-8
+    ${python.interpreter} -m pyfakefs.tests.all_tests
+    ${python.interpreter} -m pyfakefs.tests.all_tests_without_extra_packages
+    ${python.interpreter} -m pytest pyfakefs/pytest_tests/pytest_plugin_test.py
+  '';
+
+  meta = with lib; {
+    description = "Fake file system that mocks the Python file system modules";
+    license     = licenses.asl20;
+    homepage    = "http://pyfakefs.org/";
+    changelog   = "https://github.com/jmcgeheeiv/pyfakefs/blob/master/CHANGES.md";
+    maintainers = with maintainers; [ gebner ];
+  };
+}
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..a17388b34b5c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyfantom/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv
+, 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 = "http://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..8fdb051a4846
--- /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.7";
+
+  src = fetchFromGitHub {
+    owner = "olucurious";
+    repo = "pyfcm";
+    rev = version;
+    sha256 = "0aj10yvjsc04j15zbn403i83j7ra5yg35pi3ywkyakk8n1s0s3qg";
+  };
+
+  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..ff66dc8f8675
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyfftw/default.nix
@@ -0,0 +1,34 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi
+, fftw, fftwFloat, fftwLongDouble, numpy, scipy, cython, dask }:
+
+buildPythonPackage rec {
+  version = "0.12.0";
+  pname = "pyFFTW";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "60988e823ca75808a26fd79d88dbae1de3699e72a293f812aa4534f8a0a58cb0";
+  };
+
+  buildInputs = [ fftw fftwFloat fftwLongDouble];
+
+  propagatedBuildInputs = [ numpy scipy cython dask ];
+
+  # Tests cannot import pyfftw. pyfftw works fine though.
+  doCheck = false;
+
+  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"
+  '';
+  #+ optionalString isDarwin ''
+  #  export DYLD_LIBRARY_PATH="${pkgs.fftw.out}/lib"
+  #'';
+
+  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..a4fe9ec9dfe6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyfiglet/default.nix
@@ -0,0 +1,19 @@
+{ lib, stdenv, 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/pyflakes/default.nix b/nixpkgs/pkgs/development/python-modules/pyflakes/default.nix
new file mode 100644
index 000000000000..2ff88a78a4e7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyflakes/default.nix
@@ -0,0 +1,23 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, pythonOlder, unittest2 }:
+
+buildPythonPackage rec {
+  pname = "pyflakes";
+  version = "2.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "35b2d75ee967ea93b55750aa9edbbf72813e06a66ba54438df2cfac9e3c27fc8";
+  };
+
+  checkInputs = [ unittest2 ];
+
+  # some tests are output dependent, which have changed slightly
+  doCheck = pythonOlder "3.9";
+
+  meta = with lib; {
+    homepage = "https://launchpad.net/pyflakes";
+    description = "A simple program which checks Python source files for errors";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
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..936f9c2a02df
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyfma/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pybind11
+, numpy
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "pyfma";
+  version = "0.1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "2c9ea44c5e30ca8318ca794ff1e3941d3dc7958901b1a9c430d38734bf7b6f8d";
+  };
+
+  buildInputs = [
+    pybind11
+  ];
+
+  checkInputs = [
+    numpy
+    pytest
+  ];
+
+  preBuild = ''
+    export HOME=$(mktemp -d)
+  '';
+
+  checkPhase = ''
+    pytest test
+  '';
+
+  meta = with lib; {
+    description = "Fused multiply-add for Python";
+    homepage = "https://github.com/nschloe/pyfma";
+    license = licenses.mit;
+    maintainers = [ 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/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..7c5dfecd269b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyfritzhome/default.nix
@@ -0,0 +1,34 @@
+{ lib, buildPythonPackage, fetchPypi, pythonOlder
+, requests
+, nose, mock }:
+
+buildPythonPackage rec {
+  pname = "pyfritzhome";
+  version = "0.4.2";
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+   inherit pname version;
+   sha256 = "0ncyv8svw0fhs01ijjkb1gcinb3jpyjvv9xw1bhnf4ri7b27g6ww";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  checkInputs = [
+    mock
+    nose
+  ];
+
+  checkPhase = ''
+    nosetests --with-coverage
+  '';
+
+  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/pyftdi/default.nix b/nixpkgs/pkgs/development/python-modules/pyftdi/default.nix
new file mode 100644
index 000000000000..2b46a4ce6825
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyftdi/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pyserial
+, pythonOlder
+, pyusb
+}:
+
+buildPythonPackage rec {
+  pname = "pyftdi";
+  version = "0.52.9";
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "eblot";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "07q9wmpl97a6laxfbcjqhv373msbsjppsyf5i77h0f6ccil0q1i6";
+  };
+
+  propagatedBuildInputs = [ pyusb pyserial ];
+
+  # tests requires 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..5d0d72eb4959
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyftpdlib/default.nix
@@ -0,0 +1,32 @@
+{ lib, stdenv
+, 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..8648ad4f876d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyfttt/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv, 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..33479cc66e40
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyfuse3/default.nix
@@ -0,0 +1,42 @@
+{ lib, buildPythonPackage, fetchPypi, fetchpatch, pkg-config, fuse3, trio, pytestCheckHook, pytest-trio, which }:
+
+buildPythonPackage rec {
+  pname = "pyfuse3";
+  version = "3.1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "9feb42a8639dc4815522ee6af6f7221552cfd2df1c7a7e9df96767be65e18667";
+  };
+
+  patches = [
+    # Fixes tests with pytest 6, to be removed in next stable version
+    (fetchpatch {
+      url = "https://github.com/libfuse/pyfuse3/commit/0070eddfc33fc2fba8eb4fe9353a2d2fa1ae575b.patch";
+      sha256 = "0lb4x1j31ihs3qkn61x41k2vqwcjl2fp1c2qx2jg9br6yqhjmg3b";
+    })
+  ];
+
+  nativeBuildInputs = [ pkg-config ];
+
+  buildInputs = [ fuse3 ];
+
+  propagatedBuildInputs = [ trio ];
+
+  checkInputs = [
+    pytestCheckHook
+    pytest-trio
+    which
+    fuse3
+  ];
+
+  # Checks if a /usr/bin directory exists, can't work on NixOS
+  disabledTests = [ "test_listdir" ];
+
+  meta = with lib; {
+    description = "Python 3 bindings for libfuse 3 with async I/O support";
+    homepage = "https://github.com/libfuse/pyfuse3";
+    license = licenses.gpl2;
+    maintainers = with maintainers; [ nyanloutre ];
+  };
+}
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..eb5403c2b968
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyfxa/default.nix
@@ -0,0 +1,37 @@
+{ lib, buildPythonPackage, fetchPypi
+, requests, cryptography, pybrowserid, hawkauthlib, six
+, grequests, mock, responses, pytest, pyjwt }:
+
+buildPythonPackage rec {
+  pname = "PyFxA";
+  version = "0.7.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "6c85cd08cf05f7138dee1cf2a8a1d68fd428b7b5ad488917c70a2a763d651cdb";
+  };
+
+  postPatch = ''
+    # Requires network access
+    rm fxa/tests/test_core.py
+  '';
+
+  propagatedBuildInputs = [
+    pyjwt requests cryptography pybrowserid hawkauthlib six
+  ];
+
+  checkInputs = [
+    grequests mock responses pytest
+  ];
+
+  # test_oath is mostly network calls
+  checkPhase = ''
+    pytest --ignore=fxa/tests/test_oauth.py
+  '';
+
+  meta = with lib; {
+    description = "Firefox Accounts client library for Python";
+    homepage = "https://github.com/mozilla/PyFxA";
+    license = licenses.mpl20;
+  };
+}
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..6855c9e4f02c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygal/default.nix
@@ -0,0 +1,67 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, isPyPy
+, flask
+, pyquery
+, pytest
+, pytestrunner
+, cairosvg
+, tinycss
+, cssselect
+, lxml
+}:
+
+buildPythonPackage rec {
+  pname = "pygal";
+  version = "2.4.0";
+
+  doCheck = !isPyPy; # one check fails with pypy
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "9204f05380b02a8a32f9bf99d310b51aa2a932cba5b369f7a4dc3705f0a4ce83";
+  };
+  patches = [
+    # Fixes compatibility with latest pytest. October 12, 2020.
+    # Should be included in the next release after 2.4.0
+    (fetchpatch {
+      url = "https://github.com/Kozea/pygal/commit/19e5399be18a054b3b293f4a8a2777d2df4f9c18.patch";
+      sha256 = "1j0hpcvd2mhi449wmlr0ml9gw4cakqk3av1j79bi2qy86dyrss2l";
+    })
+  ];
+
+  buildInputs = [
+    flask
+    pyquery
+
+    # Should be a check input, but upstream lists it under "setup_requires".
+    # https://github.com/Kozea/pygal/issues/430
+    pytestrunner
+  ];
+
+  checkInputs = [
+    pytest
+  ];
+
+  preCheck = ''
+    # necessary on darwin to pass the testsuite
+    export LANG=en_US.UTF-8
+  '';
+
+  postPatch = ''
+    substituteInPlace setup.cfg --replace "[pytest]" "[tool:pytest]"
+  '';
+
+  propagatedBuildInputs = [ cairosvg tinycss cssselect ]
+    ++ lib.optionals (!isPyPy) [ lxml ];
+
+  meta = with lib; {
+    description = "Sexy and simple python charting";
+    homepage = "http://www.pygal.org";
+    license = licenses.lgpl3Plus;
+    maintainers = with maintainers; [ sjourdois ];
+  };
+
+}
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..333312d6aa0b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygame/default.nix
@@ -0,0 +1,48 @@
+{ lib, fetchPypi, buildPythonPackage, python, pkg-config, libX11
+, SDL2, SDL2_image, SDL2_mixer, SDL2_ttf, libpng, libjpeg, portmidi, freetype
+}:
+
+buildPythonPackage rec {
+  pname = "pygame";
+  version = "2.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "8b1e7b63f47aafcdd8849933b206778747ef1802bd3d526aca45ed77141e4001";
+  };
+
+  nativeBuildInputs = [
+    pkg-config SDL2
+  ];
+
+  buildInputs = [
+    SDL2 SDL2_image SDL2_mixer SDL2_ttf libpng libjpeg
+    portmidi libX11 freetype
+  ];
+
+  # Tests fail because of no audio device and display.
+  doCheck = false;
+
+  preConfigure = ''
+    sed \
+      -e "s/origincdirs = .*/origincdirs = []/" \
+      -e "s/origlibdirs = .*/origlibdirs = []/" \
+      -e "/linux-gnu/d" \
+      -i buildconfig/config_unix.py
+    ${lib.concatMapStrings (dep: ''
+      sed \
+        -e "/origincdirs =/a\        origincdirs += ['${lib.getDev dep}/include']" \
+        -e "/origlibdirs =/a\        origlibdirs += ['${lib.getLib dep}/lib']" \
+        -i buildconfig/config_unix.py
+      '') buildInputs
+    }
+    LOCALBASE=/ ${python.interpreter} buildconfig/config.py
+  '';
+
+  meta = with lib; {
+    description = "Python library for games";
+    homepage = "http://www.pygame.org/";
+    license = licenses.lgpl21Plus;
+    platforms = platforms.linux;
+  };
+}
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..afca3dd7bc19
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygame_sdl2/default.nix
@@ -0,0 +1,44 @@
+{ lib, stdenv, buildPythonPackage, fetchurl, isPy27
+, cython, SDL2, SDL2_image, SDL2_ttf, SDL2_mixer, libjpeg, libpng }:
+
+buildPythonPackage rec {
+  pname = "pygame_sdl2";
+  version = "2.1.0";
+  renpy_version = "7.2.0";
+  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 = "1amgsb6mm8ssf7vdcs5dr8rlxrgyhh29m4i573z1cw61ynd7vgcw";
+  };
+
+  # 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/pygbm/default.nix b/nixpkgs/pkgs/development/python-modules/pygbm/default.nix
new file mode 100644
index 000000000000..0d2747c1cb46
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygbm/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, scipy
+, numpy
+, numba
+, scikitlearn
+, 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
+    scikitlearn
+  ];
+
+  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..a1a6b0222b83
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygccxml/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv, castxml, fetchFromGitHub, buildPythonPackage,
+llvmPackages }:
+buildPythonPackage rec {
+  pname = "pygccxml";
+  version = "1.9.1";
+
+  src = fetchFromGitHub {
+    owner  = "gccxml";
+    repo   = "pygccxml";
+    rev    = "v${version}";
+    sha256 = "02ip03s0vmp7czzflbvf7qnybibfrd0rzqbc5zfmq3zmpnck3hvm";
+  };
+
+  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..b3d1fb3d26df
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygdbmi/default.nix
@@ -0,0 +1,38 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchFromGitHub
+, gdb
+}:
+
+buildPythonPackage rec {
+  pname = "pygdbmi";
+  version = "0.9.0.2";
+
+  src = fetchFromGitHub {
+    #inherit pname version;
+    #inherit pname version;
+    owner = "cs01";
+    repo = "pygdbmi";
+    rev = version;
+    sha256 = "01isx7912dbalmc3xsafk1a1n6bzzfrjn2363djcq0v57rqii53d";
+  };
+
+  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..7aa16ac1e9a8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygeoip/default.nix
@@ -0,0 +1,23 @@
+{ lib, stdenv, 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/pygit2/default.nix b/nixpkgs/pkgs/development/python-modules/pygit2/default.nix
new file mode 100644
index 000000000000..5326a1963aa8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygit2/default.nix
@@ -0,0 +1,52 @@
+{ stdenv, lib, buildPythonPackage, fetchPypi, isPyPy, isPy3k, libgit2, cached-property, pytestCheckHook, cffi, cacert }:
+
+buildPythonPackage rec {
+  pname = "pygit2";
+  version = "1.4.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "cbeb38ab1df9b5d8896548a11e63aae8a064763ab5f1eabe4475e6b8a78ee1c8";
+  };
+
+  preConfigure = lib.optionalString stdenv.isDarwin ''
+    export DYLD_LIBRARY_PATH="${libgit2}/lib"
+  '';
+
+  buildInputs = [
+    libgit2
+  ];
+
+  propagatedBuildInputs = [
+    cached-property
+  ] ++ lib.optional (!isPyPy) cffi;
+
+  checkInputs = [ pytestCheckHook ];
+
+  preCheck = ''
+    # disable tests that require networking
+    rm test/test_repository.py
+    rm test/test_credentials.py
+    rm 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;
+
+  disabled = !isPy3k;
+
+  meta = with lib; {
+    description = "A set of Python bindings to the libgit2 shared library";
+    homepage = "https://pypi.python.org/pypi/pygit2";
+    license = licenses.gpl2;
+  };
+}
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..1bb36d6029ec
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyglet/default.nix
@@ -0,0 +1,84 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, libGL
+, libGLU
+, xorg
+, future
+, pytest
+, glibc
+, gtk2-x11
+, gdk-pixbuf
+, fontconfig
+, freetype
+, ffmpeg-full
+}:
+
+buildPythonPackage rec {
+  version = "1.4.2";
+  pname = "pyglet";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1dxxrl4nc7xh3aai1clgzvk48bvd35r7ksirsddz0mwhx7jmm8px";
+  };
+
+  # 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 == '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}'
+            if path is not None:
+                return ctypes.cdll.LoadLibrary(path)
+        raise Exception("Could not load library {}".format(names))
+    EOF
+  '';
+
+  propagatedBuildInputs = [ future ];
+
+  # needs an X server. Keep an eye on
+  # https://bitbucket.org/pyglet/pyglet/issues/219/egl-support-headless-rendering
+  doCheck = false;
+
+  checkInputs = [
+    pytest
+  ];
+
+  checkPhase = ''
+    py.test tests/unit tests/integration
+  '';
+
+  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..edd5d9bc3100
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygls/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, isPy3k
+, fetchFromGitHub
+, mock
+, pytest-asyncio
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pygls";
+  version = "0.9.1";
+  disabled = !isPy3k;
+
+  src = fetchFromGitHub {
+    owner = "openlawlibrary";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1v7x5598d6jg8ya0spqjma56y062rznwimsrp8nq6fkskqgfm0ds";
+  };
+
+  checkInputs = [ mock pytest-asyncio pytestCheckHook ];
+
+  meta = with lib; {
+    description = "Pythonic generic implementation of the Language Server Protocol";
+    homepage = "https://github.com/openlawlibrary/pygls";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ metadark ];
+  };
+}
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..2e5d6271c66a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygments-better-html/default.nix
@@ -0,0 +1,31 @@
+{ lib, stdenv
+, 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..31a6b043494d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygments-markdown-lexer/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv
+, 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/pygmo/default.nix b/nixpkgs/pkgs/development/python-modules/pygmo/default.nix
new file mode 100644
index 000000000000..d846cc4f18c7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygmo/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, eigen
+, nlopt
+, ipopt
+, boost
+, pagmo2
+, numpy
+, cloudpickle
+, ipyparallel
+, numba
+, python
+}:
+
+let
+  propagatedBuildInputs = [ numpy cloudpickle ipyparallel numba ];
+
+  pagmo2WithPython = pagmo2.overrideAttrs (oldAttrs: {
+    cmakeFlags = oldAttrs.cmakeFlags ++ [
+      "-DPAGMO_BUILD_PYGMO=yes"
+      "-DPAGMO_BUILD_PAGMO=no"
+      "-DPagmo_DIR=${pagmo2}"
+    ];
+    buildInputs = [ eigen nlopt ipopt boost pagmo2 ] ++ propagatedBuildInputs;
+    postInstall = ''
+      mv wheel $out
+    '';
+  });
+
+in buildPythonPackage {
+  pname = "pygmo";
+  version = pagmo2WithPython.version;
+
+  inherit propagatedBuildInputs;
+
+  src = pagmo2WithPython;
+
+  preBuild = ''
+    mv ${python.sitePackages}/pygmo wheel
+    cd wheel
+  '';
+
+  # dont do tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Parallel optimisation for Python";
+    homepage = "https://esa.github.io/pagmo2/";
+    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..318706edd930
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygmt/default.nix
@@ -0,0 +1,47 @@
+{ lib, stdenv
+, pythonOlder
+, buildPythonPackage
+, fetchFromGitHub
+, gmt
+, numpy
+, netcdf4
+, pandas
+, packaging
+, xarray
+}:
+
+buildPythonPackage rec {
+  pname = "pygmt";
+  version = "0.2.0";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "GenericMappingTools";
+    repo = "pygmt";
+    rev = "v${version}";
+    sha256 = "1yx1n6mxfmwg69ls5560nm6d3jxyghv27981iplz7m7990bbp468";
+  };
+
+  postPatch = ''
+    substituteInPlace pygmt/clib/loading.py \
+      --replace "env.get(\"GMT_LIBRARY_PATH\", \"\")" "env.get(\"GMT_LIBRARY_PATH\", \"${gmt}/lib\")"
+  '';
+
+  propagatedBuildInputs = [ numpy netcdf4 pandas packaging xarray ];
+
+  doCheck = false; # requires network access
+
+  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.36.nix b/nixpkgs/pkgs/development/python-modules/pygobject/3.36.nix
new file mode 100644
index 000000000000..ccad57eba1ed
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygobject/3.36.nix
@@ -0,0 +1,40 @@
+{ lib, stdenv, fetchurl, buildPythonPackage, pkg-config, glib, gobject-introspection,
+pycairo, cairo, which, ncurses, meson, ninja, isPy3k, gnome3 }:
+
+buildPythonPackage rec {
+  pname = "pygobject";
+  version = "3.36.1";
+
+  format = "other";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
+    sha256 = "0b9CgC0c7BE7Wtqg579/N0W0RSHcIWNYjSdtXNYdcY8=";
+  };
+
+  outputs = [ "out" "dev" ];
+
+  mesonFlags = [
+    "-Dpython=python${if isPy3k then "3" else "2" }"
+  ];
+
+  nativeBuildInputs = [ pkg-config meson ninja gobject-introspection ];
+  buildInputs = [ glib gobject-introspection ]
+                 ++ lib.optionals stdenv.isDarwin [ which ncurses ];
+  propagatedBuildInputs = [ pycairo cairo ];
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = pname;
+      attrPath = "python3.pkgs.${pname}3";
+    };
+  };
+
+  meta = with lib; {
+    homepage = "https://pygobject.readthedocs.io/";
+    description = "Python bindings for Glib";
+    license = licenses.gpl2;
+    maintainers = with maintainers; [ orivej ];
+    platforms = platforms.unix;
+  };
+}
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..8c26ec6174b2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygobject/3.nix
@@ -0,0 +1,38 @@
+{ lib, stdenv, fetchurl, buildPythonPackage, pkg-config, glib, gobject-introspection,
+pycairo, cairo, which, ncurses, meson, ninja, isPy3k, gnome3 }:
+
+buildPythonPackage rec {
+  pname = "pygobject";
+  version = "3.38.0";
+
+  disabled = ! isPy3k;
+
+  format = "other";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
+    sha256 = "A3LRu5Ei/Bn1AKJJsfOMK7Z0hQAPWIdJe0sgWz5whNU=";
+  };
+
+  outputs = [ "out" "dev" ];
+
+  nativeBuildInputs = [ pkg-config meson ninja gobject-introspection ];
+  buildInputs = [ glib gobject-introspection ]
+                 ++ lib.optionals stdenv.isDarwin [ which ncurses ];
+  propagatedBuildInputs = [ pycairo cairo ];
+
+  passthru = {
+    updateScript = gnome3.updateScript {
+      packageName = pname;
+      attrPath = "python3.pkgs.${pname}3";
+    };
+  };
+
+  meta = with lib; {
+    homepage = "https://pygobject.readthedocs.io/";
+    description = "Python bindings for Glib";
+    license = licenses.gpl2;
+    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..89031c9610aa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygogo/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, pythonOlder
+, buildPythonPackage
+, fetchFromGitHub
+, pkutils
+  # Check Inputs
+, pytestCheckHook
+, nose
+}:
+
+buildPythonPackage rec {
+  pname = "pygogo";
+  version = "0.13.2";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "reubano";
+    repo = "pygogo";
+    rev = "v${version}";
+    sha256 = "19rdf4sjrm5lp1vq1bki21a9lrkzz8sgrfwgjdkq4sgy90hn1jn9";
+  };
+
+  nativeBuildInputs = [ pkutils ];
+
+  checkInputs = [ nose ];
+  checkPhase = "nosetests";
+  pythonImportsCheck = [ "pygogo" ];
+
+  meta = with lib; {
+    description = "A Python logging library with super powers";
+    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..416410ab3ce7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygpgme/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv, 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..f239647bafa5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygraphviz/default.nix
@@ -0,0 +1,40 @@
+{ lib, stdenv, buildPythonPackage, isPy3k, fetchPypi, substituteAll, graphviz
+, pkg-config, doctest-ignore-unicode, mock, nose }:
+
+buildPythonPackage rec {
+  pname = "pygraphviz";
+  version = "1.6";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "411ae84a5bc313e3e1523a1cace59159f512336318a510573b47f824edef8860";
+    extension = "zip";
+  };
+
+  nativeBuildInputs = [ pkg-config ];
+  buildInputs = [ graphviz ];
+  checkInputs = [ doctest-ignore-unicode mock nose ];
+
+  patches = [
+    # pygraphviz depends on graphviz being in PATH. This patch always prepends
+    # graphviz to PATH.
+    (substituteAll {
+      src = ./graphviz-path.patch;
+      inherit graphviz;
+    })
+  ];
+
+  # The tests are currently failing because of a bug in graphviz 2.40.1.
+  # Upstream does not want to skip the relevant tests:
+  # https://github.com/pygraphviz/pygraphviz/pull/129
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Python interface to Graphviz graph drawing package";
+    homepage = "https://github.com/pygraphviz/pygraphviz";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ matthiasbeyer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pygraphviz/graphviz-path.patch b/nixpkgs/pkgs/development/python-modules/pygraphviz/graphviz-path.patch
new file mode 100644
index 000000000000..e4ff925009d7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygraphviz/graphviz-path.patch
@@ -0,0 +1,13 @@
+diff --git a/pygraphviz/agraph.py b/pygraphviz/agraph.py
+index 8f72024..2d8358e 100644
+--- a/pygraphviz/agraph.py
++++ b/pygraphviz/agraph.py
+@@ -1557,7 +1557,7 @@ class AGraph(object):
+         import os
+         import glob
+ 
+-        paths = os.environ["PATH"]
++        paths = '@graphviz@/bin:' + os.environ["PATH"]
+         if os.name == "nt":
+             exe = ".exe"
+         else:
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..20a96d1f8f2c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygreat/default.nix
@@ -0,0 +1,31 @@
+{ lib, stdenv, 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..8f694a117fe5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygrok/default.nix
@@ -0,0 +1,28 @@
+{ stdenv, 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/pygtk/default.nix b/nixpkgs/pkgs/development/python-modules/pygtk/default.nix
new file mode 100644
index 000000000000..938b55630c06
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygtk/default.nix
@@ -0,0 +1,74 @@
+{ lib, stdenv, fetchurl, fetchpatch, python, pkg-config, gtk2, pygobject2, pycairo, pango
+, buildPythonPackage, libglade ? null, isPy3k }:
+
+buildPythonPackage rec {
+  pname = "pygtk";
+  version = "2.24.0";
+
+  disabled = isPy3k;
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${lib.versions.majorMinor version}/${pname}-${version}.tar.bz2";
+    sha256 = "04k942gn8vl95kwf0qskkv6npclfm31d78ljkrkgyqxxcni1w76d";
+  };
+
+  patches = [
+    # https://bugzilla.gnome.org/show_bug.cgi?id=660216 - fixes some memory leaks
+    (fetchpatch {
+      url = "https://gitlab.gnome.org/Archive/pygtk/commit/eca72baa5616fbe4dbebea43c7e5940847dc5ab8.diff";
+      sha256 = "031px4w5cshcx1sns430sdbr2i007b9zyb2carb3z65nzr77dpdd";
+    })
+    (fetchpatch {
+      url = "https://gitlab.gnome.org/Archive/pygtk/commit/4aaa48eb80c6802aec6d03e5695d2a0ff20e0fc2.patch";
+      sha256 = "0z8cg7nr3qki8gg8alasdzzyxcihfjlxn518glq5ajglk3q5pzsn";
+    })
+  ];
+
+  nativeBuildInputs = [ pkg-config ];
+  buildInputs = [
+    pango
+  ] ++ lib.optional (libglade != null) libglade;
+
+  propagatedBuildInputs = [ gtk2 pygobject2 pycairo ];
+
+  configurePhase = "configurePhase";
+
+  buildPhase = "buildPhase";
+
+  NIX_CFLAGS_COMPILE = lib.optionalString stdenv.isDarwin "-ObjC";
+
+  installPhase = "installPhase";
+
+  checkPhase = lib.optionalString (libglade == null)
+    ''
+      sed -i -e "s/glade = importModule('gtk.glade', buildDir)//" \
+             tests/common.py
+      sed -i -e "s/, glade$//" \
+             -e "s/.*testGlade.*//" \
+             -e "s/.*(glade.*//" \
+             tests/test_api.py
+    '' + ''
+      sed -i -e "s/sys.path.insert(0, os.path.join(buildDir, 'gtk'))//" \
+             -e "s/sys.path.insert(0, buildDir)//" \
+             tests/common.py
+      make check
+    '';
+  # XXX: TypeError: Unsupported type: <class 'gtk._gtk.WindowType'>
+  # The check phase was not executed in the previous
+  # non-buildPythonPackage setup - not sure why not.
+  doCheck = false;
+
+  postInstall = ''
+    rm $out/bin/pygtk-codegen-2.0
+    ln -s ${pygobject2}/bin/pygobject-codegen-2.0  $out/bin/pygtk-codegen-2.0
+    ln -s ${pygobject2}/lib/${python.libPrefix}/site-packages/pygobject-${pygobject2.version}.pth \
+                  $out/lib/${python.libPrefix}/site-packages/${pname}-${version}.pth
+  '';
+
+  meta = with lib; {
+    description = "GTK 2 Python bindings";
+    homepage = "https://gitlab.gnome.org/Archive/pygtk";
+    platforms = platforms.all;
+    license = with licenses; [ lgpl21Plus ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pygtksourceview/codegendir.patch b/nixpkgs/pkgs/development/python-modules/pygtksourceview/codegendir.patch
new file mode 100644
index 000000000000..783c5e2d4671
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygtksourceview/codegendir.patch
@@ -0,0 +1,25 @@
+diff -Nur pygtksourceview-2.10.1-orig/configure pygtksourceview-2.10.1/configure
+--- pygtksourceview-2.10.1-orig/configure	2010-04-18 15:29:55.000000000 +0200
++++ pygtksourceview-2.10.1/configure	2015-01-30 20:36:31.784541887 +0100
+@@ -12950,7 +12950,7 @@
+ 
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pygtk codegen" >&5
+ $as_echo_n "checking for pygtk codegen... " >&6; }
+-CODEGENDIR=`$PKG_CONFIG --variable=codegendir pygtk-2.0`
++CODEGENDIR=`$PKG_CONFIG --variable=codegendir pygobject-2.0`
+ echo $CODEGENDIR
+ if test -f $CODEGENDIR/codegen.py; then
+ 	CODEGEN=$CODEGENDIR/codegen.py
+diff -Nur pygtksourceview-2.10.1-orig/configure.ac pygtksourceview-2.10.1/configure.ac
+--- pygtksourceview-2.10.1-orig/configure.ac	2010-04-18 15:28:39.000000000 +0200
++++ pygtksourceview-2.10.1/configure.ac	2015-01-30 20:36:42.781648830 +0100
+@@ -116,7 +116,7 @@
+ 
+ dnl codegen
+ AC_MSG_CHECKING(for pygtk codegen)
+-CODEGENDIR=`$PKG_CONFIG --variable=codegendir pygtk-2.0`
++CODEGENDIR=`$PKG_CONFIG --variable=codegendir pygobject-2.0`
+ echo $CODEGENDIR
+ if test -f $CODEGENDIR/codegen.py; then
+ 	CODEGEN=$CODEGENDIR/codegen.py
+
diff --git a/nixpkgs/pkgs/development/python-modules/pygtksourceview/default.nix b/nixpkgs/pkgs/development/python-modules/pygtksourceview/default.nix
new file mode 100644
index 000000000000..57a21f1e1784
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygtksourceview/default.nix
@@ -0,0 +1,21 @@
+{ lib, fetchurl, python, buildPythonPackage, pkg-config, pygobject2, glib, pygtk, gnome2 }:
+
+buildPythonPackage rec {
+  pname = "pygtksourceview";
+  format = "other";
+  version = "2.10.1";
+
+  src = fetchurl {
+    url = "http://ftp.gnome.org/pub/gnome/sources/pygtksourceview/2.10/pygtksourceview-${version}.tar.bz2";
+    sha256 = "0x2r9k547ad68sfddr5am341ap6zvy8k0rh3rd0n38k7xdd7rd5l";
+  };
+
+  patches = [ ./codegendir.patch ];
+
+  nativeBuildInputs = [ pkg-config ];
+  buildInputs = [ python pygobject2 glib pygtk gnome2.gtksourceview ];
+
+  meta = {
+    platforms = lib.platforms.unix;
+  };
+}
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..e22af4b52068
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygtrie/default.nix
@@ -0,0 +1,15 @@
+{ lib, fetchPypi, buildPythonPackage, ... }:
+buildPythonPackage rec {
+  pname = "pygtrie";
+  version = "2.4.1";
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "4367b87d92eaf475107421dce0295a9d4d72156702908c96c430a426b654aee7";
+  };
+  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/1.nix b/nixpkgs/pkgs/development/python-modules/pyhamcrest/1.nix
new file mode 100644
index 000000000000..5df52d9b658c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyhamcrest/1.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi
+, mock, pytest
+, six
+}:
+buildPythonPackage rec {
+  pname = "PyHamcrest";
+  version = "1.10.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0x08lfcnsak7pkym32xrdn0sn3wcf26n1jff3d11mwbizpfikbpp";
+  };
+
+  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/pyhamcrest/default.nix b/nixpkgs/pkgs/development/python-modules/pyhamcrest/default.nix
new file mode 100644
index 000000000000..a66e26b1319a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyhamcrest/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi
+, mock, pytest
+, six
+}:
+buildPythonPackage rec {
+  pname = "PyHamcrest";
+  version = "2.0.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "412e00137858f04bde0729913874a48485665f2d36fe9ee449f26be864af9316";
+  };
+
+  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/pyhaversion/default.nix b/nixpkgs/pkgs/development/python-modules/pyhaversion/default.nix
new file mode 100644
index 000000000000..22290695cc0a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyhaversion/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, aiohttp
+, aresponses
+, async-timeout
+, awesomeversion
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytest-asyncio
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pyhaversion";
+  version = "20.12.1";
+
+  # Only 3.8.0 and beyond are supported
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "ludeeus";
+    repo = pname;
+    rev = version;
+    sha256 = "17yl67dgw75dghljcfwzblm11kqnh6sxf47w62mxz86aq9zrvcxd";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    async-timeout
+    awesomeversion
+  ];
+
+  checkInputs = [
+    aresponses
+    awesomeversion
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  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/pyhocon/default.nix b/nixpkgs/pkgs/development/python-modules/pyhocon/default.nix
new file mode 100644
index 000000000000..487f7ca66f31
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyhocon/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+# Runtime inputs:
+, pyparsing
+# Check inputs:
+, pytest
+, mock
+}:
+
+buildPythonPackage rec {
+  pname = "pyhocon";
+  version = "0.3.53";
+
+  src = fetchFromGitHub {
+    owner = "chimpler";
+    repo = "pyhocon";
+    rev = version;
+    sha256 = "1lr56piiasnq1aiwli8ldw2wc3xjfck8az991mr5rdbqqsrh9vkv";
+  };
+
+  propagatedBuildInputs = [ pyparsing ];
+
+  checkInputs = [ pytest mock ];
+
+  # Tests fail because necessary data files aren't packaged for PyPi yet.
+  # See https://github.com/chimpler/pyhocon/pull/203
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/chimpler/pyhocon/";
+    description = "HOCON parser for Python";
+    # Long description copied from
+    # https://github.com/chimpler/pyhocon/blob/55a9ea3ebeeac5764bdebebfbeacbf099f64db26/setup.py
+    # (the tip of master as of 2019-03-24).
+    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 = [ 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..502d648b4007
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyhomematic/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv, buildPythonPackage, isPy3k, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "pyhomematic";
+  version = "0.1.71";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0z09bw2mlhg7n9jyqmcyir306wpxr5nw1qsp5ps2iaw1qnyz5s9n";
+  };
+
+  # PyPI tarball does not include tests/ directory
+  # Unreliable timing: https://github.com/danielperna84/pyhomematic/issues/126
+  doCheck = false;
+
+  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/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/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/pyicloud/default.nix b/nixpkgs/pkgs/development/python-modules/pyicloud/default.nix
new file mode 100644
index 000000000000..6e808a010585
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyicloud/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, requests
+, keyring
+, keyrings-alt
+, click
+, six
+, tzlocal
+, certifi
+, bitstring
+, unittest2
+, future
+}:
+
+buildPythonPackage rec {
+  pname = "pyicloud";
+  version = "0.9.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "dcebb32e474bc28aa77b944a0a64949ef3b5b852cbef6256fbc95347a04e777c";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    keyring
+    keyrings-alt
+    click
+    six
+    tzlocal
+    certifi
+    bitstring
+    future
+  ];
+
+  checkInputs = [ unittest2 ];
+
+  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..3512e33c81d7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyicu/default.nix
@@ -0,0 +1,40 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, pytest
+, six
+, fetchpatch
+, icu
+}:
+
+buildPythonPackage rec {
+  pname = "PyICU";
+  version = "2.3.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ddb2b453853b4c25db382bc5e8c4cde09b3f4696ef1e1494f8294e174f459cf4";
+  };
+
+  patches = [
+    (fetchpatch {
+      url = "https://salsa.debian.org/python-team/modules/pyicu/raw/debian/2.2-2/"
+            + "debian/patches/icu_test.patch";
+      sha256 = "1iavdkyqixm9i753svl17barla93b7jzgkw09dn3hnggamx7zwx9";
+    })
+  ];
+
+  nativeBuildInputs = [ icu ]; # for icu-config
+  buildInputs = [ icu ];
+  checkInputs = [ pytest ];
+  propagatedBuildInputs = [ six ];
+
+  meta = with lib; {
+    homepage = "https://pypi.python.org/pypi/PyICU/";
+    description = "Python extension wrapping the ICU C++ API";
+    license = licenses.mit;
+    platforms = platforms.unix;
+    maintainers = [ maintainers.rycee ];
+  };
+
+}
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..92c2f5bb6717
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyinotify/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv
+, 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..a52a0bb40010
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyinputevent/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv
+, 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..8596883326ba
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyinsteon/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, aiofiles
+, aiohttp
+, async_generator
+, pypubsub
+, pyserial
+, pyserial-asyncio
+, pyyaml
+, pytestCheckHook
+, pythonOlder
+, pytest-cov
+, pytest-asyncio
+, pytest-timeout
+}:
+
+buildPythonPackage rec {
+  pname = "pyinsteon";
+  version = "1.0.8";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = version;
+    sha256 = "0d028fcqmdzxp0vsz7digx794s9l65ydsnsyvyx275z6577x7h4h";
+  };
+
+  propagatedBuildInputs = [
+    aiofiles
+    aiohttp
+    async_generator
+    pypubsub
+    pyserial
+    pyserial-asyncio
+    pyyaml
+  ];
+
+  checkInputs = [
+    pytest-asyncio
+    pytest-cov
+    pytest-timeout
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "pyinsteon" ];
+
+  meta = with lib; {
+    description = "Python library to support Insteon home automation projects";
+    longDescription = ''
+      This is a Python package to interface with an Insteon Modem. It has been
+      tested to work with most USB or RS-232 serial based devices such as the
+      2413U, 2412S, 2448A7 and Hub models 2242 and 2245.
+    '';
+    homepage = "https://github.com/pyinsteon/pyinsteon";
+    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..ed5a5f4576ab
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyipp/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, aiohttp
+, aresponses
+, buildPythonPackage
+, deepmerge
+, fetchFromGitHub
+, pytest-asyncio
+, pytestCheckHook
+, pytestcov
+, 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
+    pytestcov
+    pytestCheckHook
+  ];
+
+  # Some tests are failing due to encoding issues
+  # https://github.com/ctalkington/python-ipp/issues/121
+  disabledTests = [
+    "test_internal_session"
+    "test_request_port"
+    "est_http_error426"
+    "test_unexpected_response"
+    "test_printer"
+    "test_raw"
+    "test_ipp_request"
+    "test_request_tls"
+    "test_ipp_error_0x0503"
+  ];
+
+  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..762e39fe4b14
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyiqvia/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, aiohttp
+, aresponses
+, fetchFromGitHub
+, poetry
+, pytest-aiohttp
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyiqvia";
+  version = "0.3.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "bachya";
+    repo = pname;
+    rev = version;
+    sha256 = "1yjsbq4p040a35n8g2l0wgnv83wkjirv4rj73s2mjzn3cxf395bz";
+  };
+
+  nativeBuildInputs = [ poetry ];
+
+  propagatedBuildInputs = [ aiohttp ];
+
+  checkInputs = [
+    aresponses
+    pytest-aiohttp
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  # Ignore the examples as they are prefixed with test_
+  pytestFlagsArray = [ "--ignore examples/" ];
+  pythonImportsCheck = [ "pyiqvia" ];
+
+  meta = with lib; {
+    description = "Python3 API for 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/pyjet/default.nix b/nixpkgs/pkgs/development/python-modules/pyjet/default.nix
new file mode 100644
index 000000000000..abf4beaada0d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyjet/default.nix
@@ -0,0 +1,37 @@
+{ lib, buildPythonPackage, fetchFromGitHub, cython, pytest, numpy }:
+
+buildPythonPackage rec {
+  pname = "pyjet";
+  version = "1.6.0";
+
+  # tests not included in pypi tarball
+  src = fetchFromGitHub {
+    owner = "scikit-hep";
+    repo = pname;
+    rev = version;
+    sha256 = "0b68jnbfk2rw9i1nnwsrbrbgkj7r0w1nw0i9f8fah1wmn78k9csv";
+  };
+
+  # fix for python37
+  # https://github.com/scikit-hep/pyjet/issues/8
+  nativeBuildInputs = [ cython ];
+  preBuild = ''
+    for f in pyjet/src/*.{pyx,pxd}; do
+      cython --cplus "$f"
+    done
+  '';
+
+  propagatedBuildInputs = [ numpy ];
+  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.gpl3;
+    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/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..9255c02ac2ee
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyjwt/default.nix
@@ -0,0 +1,33 @@
+{ lib, buildPythonPackage, fetchPypi
+, cryptography, ecdsa
+, pytestrunner, pytestcov, pytest }:
+
+buildPythonPackage rec {
+  pname = "PyJWT";
+  version = "1.7.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "8d59a976fb773f3e6a39c85636357c4f0e242707394cadadd9814f5cbaa20e96";
+  };
+
+  propagatedBuildInputs = [ cryptography ecdsa ];
+
+  checkInputs = [ pytestrunner pytestcov pytest ];
+
+  postPatch = ''
+    substituteInPlace setup.py --replace "pytest>=4.0.1,<5.0.0" "pytest"
+  '';
+
+  # ecdsa changed internal behavior
+  checkPhase = ''
+    pytest tests -k 'not ec_verify_should_return_false_if_signature_invalid'
+  '';
+
+  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/pykdl/default.nix b/nixpkgs/pkgs/development/python-modules/pykdl/default.nix
new file mode 100644
index 000000000000..674a43f5f3e0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pykdl/default.nix
@@ -0,0 +1,30 @@
+{ lib, stdenv, toPythonModule, fetchpatch, cmake, orocos-kdl, python, sip }:
+
+toPythonModule (stdenv.mkDerivation {
+  pname = "pykdl";
+  inherit (orocos-kdl) version src;
+
+  patches = [
+    # Fix build with SIP 4.19.23+. Can be removed with version 1.5.
+    # https://github.com/orocos/orocos_kinematics_dynamics/pull/270
+    (fetchpatch {
+      url = "https://github.com/orocos/orocos_kinematics_dynamics/commit/d8d087ad0e1c41f3489d1a255ebfa27b5695196b.patch";
+      sha256 = "0qyskqxv4a982kidzzyh34xj2iiw791ipbbl29jg4qb4l21xwqlg";
+      stripLen = 1;
+    })
+  ];
+
+  sourceRoot = "source/python_orocos_kdl";
+
+  nativeBuildInputs = [ cmake ];
+  buildInputs = [ orocos-kdl ];
+  propagatedBuildInputs = [ python sip ];
+
+  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..f37ddb2483e1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pykdtree/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, numpy, nose, openmp }:
+
+buildPythonPackage rec {
+  pname = "pykdtree";
+  version = "1.3.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "bebe5c608129f2997e88510c00010b9a78581b394924c0e3ecd131d52415165d";
+  };
+
+  buildInputs = [ openmp ];
+
+  propagatedBuildInputs = [ numpy ];
+
+  checkInputs = [ nose ];
+
+  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..584c98f6cb09
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pykeepass/default.nix
@@ -0,0 +1,33 @@
+{ lib, fetchPypi, buildPythonPackage
+, lxml, pycryptodomex, construct
+, argon2_cffi, dateutil, future
+}:
+
+buildPythonPackage rec {
+  pname   = "pykeepass";
+  version = "3.2.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b3e07eb2dd3aeb1dfa1a2d2d17be77066ee560c1e770f1c72d7ea5608117d284";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py --replace "==" ">="
+  '';
+
+  propagatedBuildInputs = [
+    lxml pycryptodomex construct
+    argon2_cffi dateutil future
+  ];
+
+  # no tests in PyPI tarball
+  doCheck = false;
+
+  meta = {
+    homepage = "https://github.com/pschmitt/pykeepass";
+    description = "Python library to interact with keepass databases (supports KDBX3 and KDBX4)";
+    license = lib.licenses.gpl3;
+  };
+
+}
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..07a32a25a0c6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pykerberos/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv, fetchPypi, buildPythonPackage, krb5 }:
+
+buildPythonPackage rec {
+  pname = "pykerberos";
+  version = "1.2.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0v47p840myqgc7hr4lir72xshcfpa0w8j9n077h3njpqyn6wlbag";
+  };
+
+  nativeBuildInputs = [ krb5 ]; # for krb5-config
+
+  buildInputs = [ krb5 ];
+
+  # there are no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "High-level interface to Kerberos";
+    license     = licenses.asl20;
+    maintainers = with maintainers; [ catern ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pykickstart/default.nix b/nixpkgs/pkgs/development/python-modules/pykickstart/default.nix
new file mode 100644
index 000000000000..bc10295e232a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pykickstart/default.nix
@@ -0,0 +1,38 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchurl
+, urlgrabber
+, python
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "pykickstart";
+  version = "1.99.39";
+  md5_path = "d249f60aa89b1b4facd63f776925116d";
+  disabled = isPy3k;
+
+  src = fetchurl {
+    url = "https://src.fedoraproject.org/repo/pkgs/pykickstart/"
+    + "${pname}-${version}.tar.gz/${md5_path}/${pname}-${version}.tar.gz";
+    sha256 = "e0d0f98ac4c5607e6a48d5c1fba2d50cc804de1081043f9da68cbfc69cad957a";
+  };
+
+  postPatch = ''
+    sed -i -e "s/for tst in tstList/for tst in sorted(tstList, \
+               key=lambda m: m.__name__)/" tests/baseclass.py
+  '';
+
+  propagatedBuildInputs = [ urlgrabber ];
+
+  checkPhase = ''
+    ${python.interpreter} tests/baseclass.py -vv
+  '';
+
+  meta = with lib; {
+    homepage = "http://fedoraproject.org/wiki/Pykickstart";
+    description = "Read and write Fedora kickstart files";
+    license = licenses.gpl2Plus;
+  };
+
+}
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..075b607c772e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pykka/default.nix
@@ -0,0 +1,21 @@
+{ lib, buildPythonPackage, fetchPypi, pytestCheckHook, pytest-mock }:
+
+buildPythonPackage rec {
+  pname = "Pykka";
+  version = "2.0.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "4b9d2363365b3455a0204bf163f09bd351d24b938c618c79d975a9510e128e95";
+  };
+
+  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 = [ maintainers.marsam ];
+    license = licenses.asl20;
+  };
+}
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..d2b31ebbf4cd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pykwalify/default.nix
@@ -0,0 +1,53 @@
+{ lib, buildPythonPackage, fetchPypi
+, dateutil, docopt, pyyaml
+, pytest, testfixtures
+}:
+
+buildPythonPackage rec {
+  version = "1.7.0";
+  pname = "pykwalify";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1cnfzkg1b01f825ikpw2fhjclf9c8akxjfrbd1vc22x1lg2kk2vy";
+  };
+
+  propagatedBuildInputs = [
+    dateutil
+    docopt
+    pyyaml
+  ];
+
+  checkInputs = [
+    pytest
+    testfixtures
+  ];
+
+  checkPhase = ''
+    pytest \
+      -k 'not test_multi_file_support'
+  '';
+
+  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/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..1aa96dfe464d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pylama/default.nix
@@ -0,0 +1,34 @@
+{ lib, buildPythonPackage, fetchPypi
+, eradicate, mccabe, pycodestyle, pydocstyle, pyflakes
+, pytest, ipdb }:
+
+buildPythonPackage rec {
+  pname = "pylama";
+  version = "7.7.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "9bae53ef9c1a431371d6a8dca406816a60d547147b60a4934721898f553b7d8f";
+  };
+
+  propagatedBuildInputs = [
+    eradicate
+    mccabe
+    pycodestyle
+    pydocstyle
+    pyflakes
+  ];
+
+  checkInputs = [ pytest ipdb ];
+
+  # tries to mess with the file system
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Code audit tool for python";
+    homepage = "https://github.com/klen/pylama";
+    # ambiguous license declarations: https://github.com/klen/pylama/issues/64
+    license = [ licenses.lgpl3 ];
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
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..707554be5599
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pylast/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, isPy3k, certifi, six
+, setuptools_scm
+}:
+
+buildPythonPackage rec {
+  pname = "pylast";
+  version = "4.1.0";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ad084aec1bf7e307bc42d7cc1a003851f5bee1ad24fb697a9fdc300bbfe63932";
+  };
+
+  nativeBuildInputs = [ setuptools_scm ];
+  propagatedBuildInputs = [ certifi six ];
+
+  # tests require last.fm credentials
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/pylast/pylast";
+    description = "A python interface to last.fm (and compatibles)";
+    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..e53472c6ead3
--- /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.8";
+
+  src = fetchFromGitHub {
+    owner = "phfaist";
+    repo = "pylatexenc";
+    rev = "v${version}";
+    sha256 = "0m9vrbh1gmbgq6dqm7xzklar3accadw0pn896rqsdi5jbgd3w0mh";
+  };
+
+  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/pylev/default.nix b/nixpkgs/pkgs/development/python-modules/pylev/default.nix
new file mode 100644
index 000000000000..5df0ce4690ef
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pylev/default.nix
@@ -0,0 +1,24 @@
+{ lib, buildPythonPackage, fetchFromGitHub }:
+
+buildPythonPackage {
+  pname = "pylev";
+  version = "1.3.0";
+
+  # No tests in PyPi tarball
+  src = fetchFromGitHub {
+    owner = "toastdriven";
+    repo = "pylev";
+    # Can't use a tag because it's missing
+    # https://github.com/toastdriven/pylev/issues/10
+    # rev = "v${version};
+    rev = "72e3d490515c3188e2acac9c15ea1b466f9ff938";
+    sha256 = "18dg1rfnqgfl6x4vafiq4la9d7f65xak19gcvngslq0bm1z6hyd8";
+  };
+
+  meta = with lib; {
+    homepage = "https://github.com/toastdriven/pylev";
+    description = "A pure Python Levenshtein implementation that's not freaking GPL'd";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ jakewaksbaum ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pylibacl/0.5.nix b/nixpkgs/pkgs/development/python-modules/pylibacl/0.5.nix
new file mode 100644
index 000000000000..284a795b4c22
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pylibacl/0.5.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pkgs
+}:
+
+buildPythonPackage rec {
+  pname = "pylibacl";
+  version = "0.5.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0drvxb21y7p0aikcv3jx90vdcjk96kibf9x8qgxic2prxxd3f3q6";
+  };
+
+  # 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/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..25989d0353e0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pylibconfig2/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv, 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..c001594d625a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pylibftdi/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, libftdi1
+, libusb1
+}:
+
+buildPythonPackage rec {
+  pname = "pylibftdi";
+  version = "0.19.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "bb0ec74df292ef884aa37bf1e98fb9df4d338718e1559eebda363317a792123e";
+  };
+
+  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://bitbucket.org/codedstructure/pylibftdi/src/default/";
+    description = "Minimal pythonic 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..454f08fd10ed
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyliblo/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv
+, 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..8bb62c091348
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pylibmc/default.nix
@@ -0,0 +1,23 @@
+{ buildPythonPackage, fetchPypi, lib, stdenv, libmemcached, zlib, cyrus_sasl }:
+
+buildPythonPackage rec {
+  version = "1.6.1";
+  pname = "pylibmc";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1sg7d9j0v6g3xg3finf4l1hb72c13vcyyi6rqrc9shbx903d93ca";
+  };
+
+  buildInputs = [ libmemcached zlib cyrus_sasl ];
+  setupPyBuildFlags = [ "--with-sasl2" ];
+
+  # requires an external memcached server running
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Quick and small memcached client for Python";
+    homepage = "http://sendapatch.se/projects/pylibmc/";
+    license = licenses.bsd3;
+  };
+}
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..c5dfbd48fe12
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pylint-django/default.nix
@@ -0,0 +1,50 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, isPy3k
+, lib
+
+# pythonPackages
+, django
+, pylint-plugin-utils
+
+# pythonPackages for checkInputs
+, coverage
+, factory_boy
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "pylint-django";
+  version = "2.3.0";
+  disabled = !isPy3k;
+
+  src = fetchFromGitHub {
+    owner = "PyCQA";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1088waraiigi2bnlighn7bvnvqmpx5fbw70c8jd8sh25mj38wgly";
+  };
+
+  propagatedBuildInputs = [
+    django
+    pylint-plugin-utils
+  ];
+
+  checkInputs = [ coverage factory_boy pytest ];
+
+  # Check command taken from scripts/test.sh
+  # Skip test external_django_tables2_noerror_meta_class:
+  # requires an unpackaged django_tables2
+  checkPhase = ''
+      python pylint_django/tests/test_func.py -v -k "not tables2"
+  '';
+
+  meta = with lib; {
+    description = "A Pylint plugin to analyze Django applications";
+    homepage = "https://github.com/PyCQA/pylint-django";
+    license = licenses.gpl2;
+    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..f2bbef2cc8c1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pylint-plugin-utils/default.nix
@@ -0,0 +1,39 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, isPy3k
+, lib
+
+# pythonPackages
+, pylint
+, toml
+}:
+
+buildPythonPackage rec {
+  pname = "pylint-plugin-utils";
+  version = "0.6";
+  disabled = !isPy3k;
+
+  src = fetchFromGitHub {
+    owner = "PyCQA";
+    repo = pname;
+    rev = version;
+    sha256 = "1zapmbczxs1phrwbd0yvpfxhljd2pyv4pi9rwggaq38lcnc325s7";
+  };
+
+  propagatedBuildInputs = [
+    pylint toml
+  ];
+
+  checkPhase = ''
+    python tests.py
+  '';
+
+  meta = with lib; {
+    description = "Utilities and helpers for writing Pylint plugins";
+    homepage = "https://github.com/PyCQA/pylint-plugin-utils";
+    license = licenses.gpl2;
+    maintainers = with maintainers; [
+      kamadorueda
+    ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pylint/1.9.nix b/nixpkgs/pkgs/development/python-modules/pylint/1.9.nix
new file mode 100644
index 000000000000..e283cc10d16a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pylint/1.9.nix
@@ -0,0 +1,51 @@
+{ stdenv, lib, buildPythonPackage, fetchPypi, astroid, six, isort,
+  mccabe, configparser, backports_functools_lru_cache, singledispatch,
+  pytest, pytestrunner, setuptools }:
+
+buildPythonPackage rec {
+  pname = "pylint";
+  version = "1.9.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "004kfapkqxqy2s85pmddqv0fabxdxywxrlbi549p0v237pr2v94p";
+  };
+
+  checkInputs = [ pytest pytestrunner ];
+
+  propagatedBuildInputs = [ astroid six isort mccabe configparser backports_functools_lru_cache singledispatch setuptools ];
+
+  postPatch = lib.optionalString stdenv.isDarwin ''
+    # Remove broken darwin test
+    rm -vf pylint/test/test_functional.py
+  '';
+
+  checkPhase = ''
+    pytest pylint/test -k "not ${lib.concatStringsSep " and not " (
+      [ # Broken test
+        "test_good_comprehension_checks"
+        # requires setuptools
+        "test_pkginfo"
+        # See PyCQA/pylint#2535
+        "test_libmodule" ] ++
+      # Disable broken darwin tests
+      lib.optionals stdenv.isDarwin [
+        "test_parallel_execution"
+        "test_py3k_jobs_option"
+      ]
+    )}"
+  '';
+
+  postInstall = ''
+    mkdir -p $out/share/emacs/site-lisp
+    cp "elisp/"*.el $out/share/emacs/site-lisp/
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/PyCQA/pylint";
+    description = "A bug and style checker for Python";
+    platforms = platforms.all;
+    license = licenses.gpl1Plus;
+    maintainers = with maintainers; [ nand0p ];
+  };
+}
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..102619b2b31e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pylint/default.nix
@@ -0,0 +1,55 @@
+{ stdenv, lib, buildPythonPackage, fetchPypi, pythonOlder, astroid, installShellFiles,
+  isort, mccabe, pytestCheckHook, pytest-benchmark, pytestrunner, toml }:
+
+buildPythonPackage rec {
+  pname = "pylint";
+  version = "2.6.0";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "bb4a908c9dadbc3aac18860550e870f58e1a02c9f2c204fdf5693d73be061210";
+  };
+
+  nativeBuildInputs = [ pytestrunner installShellFiles ];
+
+  checkInputs = [ pytestCheckHook pytest-benchmark ];
+
+  propagatedBuildInputs = [ astroid isort mccabe toml ];
+
+  postPatch = lib.optionalString stdenv.isDarwin ''
+    # Remove broken darwin test
+    rm -vf pylint/test/test_functional.py
+  '';
+
+  disabledTests = [
+    # https://github.com/PyCQA/pylint/issues/3198
+    "test_by_module_statement_value"
+    # has issues with local directories
+    "test_version"
+   ] ++ lib.optionals stdenv.isDarwin [
+      "test_parallel_execution"
+      "test_py3k_jobs_option"
+   ];
+
+  # calls executable in one of the tests
+  preCheck = ''
+    export PATH=$PATH:$out/bin
+  '';
+
+  dontUseSetuptoolsCheck = true;
+
+  postInstall = ''
+    mkdir -p $out/share/emacs/site-lisp
+    cp "elisp/"*.el $out/share/emacs/site-lisp/
+    installManPage man/*.1
+  '';
+
+  meta = with lib; {
+    homepage = "https://pylint.pycqa.org/";
+    description = "A bug and style checker for Python";
+    license = licenses.gpl1Plus;
+    maintainers = with maintainers; [ nand0p ];
+  };
+}
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..8ca565834d4a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pylru/default.nix
@@ -0,0 +1,18 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "pylru";
+  version = "1.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "492f934bb98dc6c8b2370c02c95c65516ddc08c8f64d27f70087eb038621d297";
+  };
+
+  meta = with lib; {
+    homepage = "https://github.com/jlhutch/pylru";
+    description = "A least recently used (LRU) cache implementation";
+    license = licenses.gpl2;
+    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..c59a67606ee6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyls-black/default.nix
@@ -0,0 +1,32 @@
+{ lib, buildPythonPackage, fetchFromGitHub
+, black, toml, pytest, python-language-server, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "pyls-black";
+  version = "0.4.6";
+
+  src = fetchFromGitHub {
+    owner = "rupert";
+    repo = "pyls-black";
+    rev = "v${version}";
+    sha256 = "0cjf0mjn156qp0x6md6mncs31hdpzfim769c2lixaczhyzwywqnj";
+  };
+
+  disabled = !isPy3k;
+
+  checkPhase = ''
+    pytest
+  '';
+
+  checkInputs = [ pytest ];
+
+  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 = [ maintainers.mic92 ];
+  };
+}
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..9dc614035e0e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyls-isort/default.nix
@@ -0,0 +1,29 @@
+{ lib, buildPythonPackage, fetchFromGitHub
+, python-language-server, isort
+}:
+
+buildPythonPackage rec {
+  pname = "pyls-isort";
+  version = "0.1.1";
+
+  src = fetchFromGitHub {
+    owner = "paradoxxxzero";
+    repo = "pyls-isort";
+    rev = version;
+    sha256 = "0mf8c6dw5lsj9np20p0vrhr1yfycq2awjk2pil28l579xj9nr0dc";
+  };
+
+  # no tests
+  doCheck = false;
+
+  propagatedBuildInputs = [
+    isort python-language-server
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/paradoxxxzero/pyls-isort";
+    description = "Isort plugin for python-language-server";
+    license = licenses.mit;
+    maintainers = [ maintainers.mic92 ];
+  };
+}
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..b9cf9738ed42
--- /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, isPy3k, pytestcov, 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 pytestcov 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 = [ maintainers.mic92 ];
+  };
+}
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..7e1fa0606191
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyls-spyder/default.nix
@@ -0,0 +1,24 @@
+{ lib, buildPythonPackage, fetchPypi, python-language-server }:
+
+buildPythonPackage rec {
+  pname = "pyls-spyder";
+  version = "0.3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "07apxh12b8ybkx5izr7pg8kbg5g5wgzw7vh5iy2n8dhiqarzp7s1";
+  };
+
+  propagatedBuildInputs = [ python-language-server ];
+
+  # no tests
+  doCheck = false;
+  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/pylti/default.nix b/nixpkgs/pkgs/development/python-modules/pylti/default.nix
new file mode 100644
index 000000000000..a6778a4aa7e8
--- /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
+, pytestcov
+, 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 pytestcov 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/default.nix b/nixpkgs/pkgs/development/python-modules/pylutron/default.nix
new file mode 100644
index 000000000000..90a45640812e
--- /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.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1q8qdy26s9hvfsh75pak7xiqjwrwsgq18p4d86dwf4dwmy5s4qj1";
+  };
+
+  # 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/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..3b35ce3e7166
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymaging/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv
+, 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..64ea5b4ff5b0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymaging_png/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv
+, 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/pymata-express/default.nix b/nixpkgs/pkgs/development/python-modules/pymata-express/default.nix
new file mode 100644
index 000000000000..1a50a91a3092
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymata-express/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pyserial
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pymata-express";
+  version = "1.19";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "MrYsLab";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0gfjmqcxwsnfjgll6ql5xd1n3xp4klf4fcaajaivh053i02p0a79";
+  };
+
+  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..c80472a6730a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymatgen-lammps/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, fetchurl
+, buildPythonPackage
+, pymatgen
+, pytestrunner
+, pytest
+, 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 = [ pytestrunner ];
+  checkInputs = [ pytest ];
+  propagatedBuildInputs = [ pymatgen ];
+
+  meta = {
+    description = "A LAMMPS wrapper using pymatgen";
+    homepage = "https://gitlab.com/costrouc/pymatgen-lammps";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ costrouc ];
+  };
+}
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..84fcdbef6a3f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymatgen/default.nix
@@ -0,0 +1,62 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi
+, enum34
+, glibcLocales
+, matplotlib
+, monty
+, networkx
+, numpy
+, palettable
+, pandas
+, plotly
+, pydispatcher
+, requests
+, ruamel_yaml
+, scipy
+, six
+, spglib
+, sympy
+, tabulate
+, uncertainties
+}:
+
+buildPythonPackage rec {
+  pname = "pymatgen";
+  version = "2020.12.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a7ae7aba87e88965c3e1490f5b9742c95e06150f2fc73da69647a9366dd88018";
+  };
+
+  nativeBuildInputs = [ glibcLocales ];
+
+  propagatedBuildInputs = [
+    enum34
+    matplotlib
+    monty
+    networkx
+    numpy
+    palettable
+    pandas
+    plotly
+    pydispatcher
+    requests
+    ruamel_yaml
+    scipy
+    six
+    spglib
+    sympy
+    tabulate
+    uncertainties
+  ];
+
+  # No tests in pypi tarball.
+  doCheck = false;
+
+  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/pymavlink/default.nix b/nixpkgs/pkgs/development/python-modules/pymavlink/default.nix
new file mode 100644
index 000000000000..cf8c95130026
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymavlink/default.nix
@@ -0,0 +1,23 @@
+{ lib, buildPythonPackage, fetchPypi, future, lxml }:
+
+buildPythonPackage rec {
+  pname = "pymavlink";
+  version = "2.4.14";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "3bc3709c735ebb3f98f19e96c8887868f4671077d4808076cfc5445912633881";
+  };
+
+  propagatedBuildInputs = [ future lxml ];
+
+  # No tests included in PyPI tarball
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Python MAVLink interface and utilities";
+    homepage = "https://github.com/ArduPilot/pymavlink";
+    license = licenses.lgpl3;
+    maintainers = with maintainers; [ lopsided98 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pymbolic/default.nix b/nixpkgs/pkgs/development/python-modules/pymbolic/default.nix
new file mode 100644
index 000000000000..23c88ca28d45
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymbolic/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytools
+, pytest
+, six
+, sympy
+, pexpect
+, symengine
+}:
+
+buildPythonPackage rec {
+  pname = "pymbolic";
+  version = "2020.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ca029399f9480f6d51fbac0349fddbb42d937620deb03befa0ba94ac08895e6b";
+  };
+
+  postConfigure = ''
+    substituteInPlace setup.py \
+      --replace "\"pytest>=2.3\"," ""
+  '';
+
+  checkInputs = [ sympy pexpect symengine pytest ];
+  propagatedBuildInputs = [
+    pytools
+    six
+  ];
+
+  # too many tests fail
+  doCheck = false;
+  checkPhase = ''
+    pytest test
+  '';
+
+  meta = with lib; {
+    description = "A package for symbolic computation";
+    homepage = "https://mathema.tician.de/software/pymbolic";
+    license = licenses.mit;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pymc3/default.nix b/nixpkgs/pkgs/development/python-modules/pymc3/default.nix
new file mode 100644
index 000000000000..dfbfe90d2421
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymc3/default.nix
@@ -0,0 +1,72 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, pythonOlder
+, Theano
+, pandas
+, patsy
+, joblib
+, tqdm
+, six
+, h5py
+, arviz
+, packaging
+, pytest
+, nose
+, parameterized
+, fastprogress
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "pymc3";
+  version = "3.9.3";
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "abe046f5a5d0e5baee80b7c4bc0a4c218f61b517b62d77be4f89cf4784c27d78";
+  };
+
+  # No need for coverage stats in Nix builds
+  postPatch = ''
+    substituteInPlace setup.py --replace ", 'pytest-cov'" ""
+  '';
+
+  propagatedBuildInputs = [
+    Theano
+    pandas
+    patsy
+    joblib
+    tqdm
+    six
+    h5py
+    arviz
+    packaging
+    fastprogress
+    typing-extensions
+  ];
+
+  checkInputs = [
+    pytest
+    nose
+    parameterized
+  ];
+
+  # The test suite is computationally intensive and test failures are not
+  # indicative for package usability hence tests are disabled by default.
+  doCheck = false;
+  pythonImportsCheck = [ "pymc3" ];
+
+  # For some reason tests are run as a part of the *install* phase if enabled.
+  # Theano writes compiled code to ~/.theano hence we set $HOME.
+  preInstall = "export HOME=$(mktemp -d)";
+  postInstall = "rm -rf $HOME";
+
+  meta = {
+    description = "Bayesian estimation, particularly using Markov chain Monte Carlo (MCMC)";
+    homepage = "https://github.com/pymc-devs/pymc3";
+    license = lib.licenses.asl20;
+    maintainers = with lib.maintainers; [ ilya-kolpakov ];
+  };
+}
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..b04276f1f559
--- /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.0.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ea61a3b0e0ed6de42ebb2233cf1a9312c57dce95101c025f9f081c10ecec48fb";
+  };
+
+  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/pymeeus/default.nix b/nixpkgs/pkgs/development/python-modules/pymeeus/default.nix
new file mode 100644
index 000000000000..96fb9d6f6943
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymeeus/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, pytest }:
+
+buildPythonPackage rec {
+  pname = "PyMeeus";
+  version = "0.3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0qjnk9sc65i4by2x4zm6w941a4i31fmhgwbkpbqkk87rwq4h4hsn";
+  };
+
+  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/pymemoize/default.nix b/nixpkgs/pkgs/development/python-modules/pymemoize/default.nix
new file mode 100644
index 000000000000..b44ff9fef491
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymemoize/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv
+, 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..84139091ae49
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymetar/default.nix
@@ -0,0 +1,30 @@
+{ lib, stdenv, python, buildPythonPackage, isPy3k, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "pymetar";
+  version = "1.1";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0y42l7mmp7jn4pzg66x3k57c6hqpxc22mgzgaqqpblkx2kzh42n9";
+  };
+
+  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 = "http://www.schwarzvogel.de/software/pymetar.html";
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ erosennin ];
+  };
+}
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..2b10e2f164fb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymetno/default.nix
@@ -0,0 +1,31 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, aiohttp
+, async-timeout
+, pytz
+, xmltodict
+}:
+
+buildPythonPackage rec {
+  pname = "PyMetno";
+  version = "0.8.1";
+
+  src = fetchFromGitHub {
+    repo = pname;
+    owner = "Danielhiversen";
+    rev = version;
+    sha256 = "1jngf0mbn5hn166pqh1ga5snwwvv7n5kv1k9kaksrfibixkvpw6h";
+  };
+
+  propagatedBuildInputs = [ aiohttp async-timeout pytz xmltodict ];
+
+  pythonImportsCheck = [ "metno"];
+
+  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/pymodbus/default.nix b/nixpkgs/pkgs/development/python-modules/pymodbus/default.nix
new file mode 100644
index 000000000000..76f2e9a9338b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymodbus/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, asynctest
+, buildPythonPackage
+, fetchFromGitHub
+, mock
+, pyserial
+, pyserial-asyncio
+, pytestCheckHook
+, pythonOlder
+, redis
+, sqlalchemy
+, tornado
+, twisted
+}:
+
+buildPythonPackage rec {
+  pname = "pymodbus";
+  version = "2.4.0";
+
+  src = fetchFromGitHub {
+    owner = "riptideio";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0x0dv02shcc2yxxm9kvcbhip111sna74dvcfssxdzzy967vnq76v";
+  };
+
+  # Twisted asynchronous version is not supported due to a missing dependency
+  propagatedBuildInputs = [
+    pyserial
+    pyserial-asyncio
+    tornado
+  ];
+
+  checkInputs = [
+    asynctest
+    mock
+    pyserial-asyncio
+    pytestCheckHook
+    redis
+    sqlalchemy
+    tornado
+    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..18c697fec445
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymongo/default.nix
@@ -0,0 +1,20 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "pymongo";
+  version = "3.11.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a9c1a2538cd120283e7137ac97ce27ebdfcb675730c5055d6332b0043f4e5a55";
+  };
+
+  # Tests call a running mongodb instance
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/mongodb/mongo-python-driver";
+    license = licenses.asl20;
+    description = "Python driver for MongoDB";
+  };
+}
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..856458bf043f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pympler/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "Pympler";
+  version = "0.9";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f2cbe7df622117af890249f2dea884eb702108a12d729d264b7c5983a6e06e47";
+  };
+
+  postPatch = ''
+   rm test/asizeof/test_asizeof.py
+  '';
+
+  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..d69c0011ac53
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymsgbox/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv, fetchPypi, buildPythonPackage, tkinter }:
+
+buildPythonPackage rec {
+  pname = "PyMsgBox";
+  version = "1.0.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0kmd00w7p6maiyqpqqb2j8m6v2gh9c0h5i198pa02bc1c1m1321q";
+    extension = "zip";
+  };
+
+  propagatedBuildInputs = [ tkinter ];
+
+  # Finding tests fails
+  doCheck = false;
+
+  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/pymumble/default.nix b/nixpkgs/pkgs/development/python-modules/pymumble/default.nix
new file mode 100644
index 000000000000..6e72309a58d3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymumble/default.nix
@@ -0,0 +1,31 @@
+{ buildPythonPackage,
+  fetchFromGitHub,
+  isPy27,
+  lib,
+  opuslib,
+  protobuf,
+}:
+
+buildPythonPackage rec {
+  pname = "pymumble";
+  version = "0.3.1";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "azlux";
+    repo = "pymumble";
+    rev = "1dd6d6d4df2fdef33202f17e2acf3ba9678a5737";
+    sha256 = "1r1sch8xrpbzffsb72lhp5xjr3ac3xb599n44vsfmaam3xklz6vz";
+  };
+
+  propagatedBuildInputs = [ opuslib protobuf ];
+
+  pythonImportsCheck = [ "pymumble_py3" ];
+
+  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.gpl3;
+    maintainers = with maintainers; [ thelegy ];
+  };
+}
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..8ce7d5a19c6f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymupdf/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, mupdf, swig }:
+buildPythonPackage rec {
+  pname = "pymupdf";
+  version = "1.18.0";
+
+  src = fetchPypi {
+    pname = "PyMuPDF";
+    inherit version;
+    sha256 = "64ce58f92d9edd2631e447175fa13b4024ac3b6dce6e718e0b003c41de6f7952";
+  };
+
+  patchPhase = ''
+    substituteInPlace setup.py \
+        --replace '/usr/include/mupdf' ${mupdf.dev}/include/mupdf
+    '';
+  nativeBuildInputs = [ swig ];
+  buildInputs = [ mupdf ];
+
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Python bindings for MuPDF's rendering library.";
+    homepage = "https://github.com/pymupdf/PyMuPDF";
+    maintainers = with maintainers; [ teto ];
+    license =  licenses.agpl3;
+    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..2500909d534e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymyq/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, aiodns
+, aiohttp
+, async-timeout
+, buildPythonPackage
+, fetchFromGitHub
+}:
+
+buildPythonPackage rec {
+  pname = "pymyq";
+  version = "2.0.14";
+
+  src = fetchFromGitHub {
+    owner = "arraylabs";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "18825b9c6qk4zcvva79hpg6098z4zqxyapnqmjsli23npw0zh67w";
+  };
+
+  propagatedBuildInputs = [
+    aiodns
+    aiohttp
+    async-timeout
+  ];
+
+  # 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/pymysql/default.nix b/nixpkgs/pkgs/development/python-modules/pymysql/default.nix
new file mode 100644
index 000000000000..c243bf8f9540
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymysql/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, cryptography
+}:
+
+buildPythonPackage rec {
+  pname = "PyMySQL";
+  version = "0.10.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "263040d2779a3b84930f7ac9da5132be0fefcd6f453a885756656103f8ee1fdd";
+  };
+
+  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..6009b03e5086
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymysqlsa/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv
+, 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..656825a36bbb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pynac/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv
+, 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..be69bf3d8023
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pynacl/default.nix
@@ -0,0 +1,37 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, pytest
+, libsodium
+, cffi
+, six
+, hypothesis
+}:
+
+buildPythonPackage rec {
+  pname = "pynacl";
+  version = "1.4.0";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "PyNaCl";
+    sha256 = "01b56hxrbif3hx8l6rwz5kljrgvlbj7shmmd2rjh0hn7974a5sal";
+  };
+
+  checkInputs = [ pytest hypothesis ];
+  buildInputs = [ libsodium ];
+  propagatedBuildInputs = [ cffi six ];
+
+  SODIUM_INSTALL = "system";
+
+  checkPhase = ''
+    py.test
+  '';
+
+  meta = with lib; {
+    maintainers = with maintainers; [ va1entin ];
+    description = "Python binding to the Networking and Cryptography (NaCl) library";
+    homepage = "https://github.com/pyca/pynacl/";
+    license = licenses.asl20;
+  };
+}
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..53df38b5836b
--- /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 = "4.3.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ced47c200073dbbfafb10b26931b9c9bf3c6b898f41dffa3676f5c2e2eddc2f0";
+  };
+
+  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..40e2783aa577
--- /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.0.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "2ced000e3c37f4e2ce0ea177d924af71c97007de9e4fd0ef37dcd7b4a6d1b622";
+  };
+
+  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..9506b8bae953
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pync/default.nix
@@ -0,0 +1,34 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, dateutil
+, pkgs
+}:
+
+buildPythonPackage rec {
+  version  = "2.0.3";
+  pname = "pync";
+  disabled = ! isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "38b9e61735a3161f9211a5773c5f5ea698f36af4ff7f77fa03e8d1ff0caa117f";
+  };
+
+  buildInputs = [ pkgs.coreutils ];
+  propagatedBuildInputs = [ 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/1.4";
+    license     = licenses.mit;
+    platforms   = platforms.darwin;
+    maintainers = with maintainers; [ lovek323 ];
+  };
+
+}
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..6214f3db42b2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pynest2d/default.nix
@@ -0,0 +1,31 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub, python3, cmake
+, pythonOlder, libnest2d, sip, clipper }:
+
+buildPythonPackage rec {
+  version = "4.8.0";
+  pname = "pynest2d";
+  format = "other";
+
+  src = fetchFromGitHub {
+    owner = "Ultimaker";
+    repo = "pynest2d";
+    rev = version;
+    sha256 = "18dn92vgr4gvf9scfh93yg9bwrhdjvq62di08rpi7pqjrrvq2nvp";
+  };
+
+  propagatedBuildInputs = [ libnest2d sip clipper ];
+  nativeBuildInputs = [ cmake ];
+
+  CLIPPER_PATH = "${clipper.out}";
+
+  postPatch = ''
+     sed -i 's#''${Python3_SITEARCH}#${placeholder "out"}/${python3.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/pynisher/default.nix b/nixpkgs/pkgs/development/python-modules/pynisher/default.nix
new file mode 100644
index 000000000000..0ecac704e1e8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pynisher/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, psutil, docutils }:
+
+buildPythonPackage rec {
+  pname = "pynisher";
+  version = "0.6.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "e4e1d9366fc4ca60b4b2354b6d12e65600600a8c7bf4392c84f2f4ff4abc85ff";
+  };
+
+  propagatedBuildInputs = [ psutil docutils ];
+
+  # no tests in the Pypi archive
+  doCheck = false;
+
+  meta = with lib; {
+    description = "The pynisher is a little 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..de208c7a9dbb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pynmea2/default.nix
@@ -0,0 +1,21 @@
+{ lib, buildPythonPackage, fetchPypi, pytest }:
+
+buildPythonPackage rec {
+  pname = "pynmea2";
+  version = "1.15.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "8b83fa7e3e668af5e182ef1c2fd4a535433ecadf60d7b627280172d695a1646b";
+  };
+
+  checkInputs = [ pytest ];
+  checkPhase = "pytest";
+
+  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/pynput/default.nix b/nixpkgs/pkgs/development/python-modules/pynput/default.nix
new file mode 100644
index 000000000000..49da01f8e716
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pynput/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, sphinx, setuptools-lint, xlib, evdev }:
+
+buildPythonPackage rec {
+  pname = "pynput";
+  version = "1.7.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "5a5598bfb14322eff980ac6ca820635fce9028faa4f64a8e1581243aaf6785ee";
+  };
+
+  nativeBuildInputs = [ sphinx ];
+
+  propagatedBuildInputs = [ setuptools-lint xlib ]
+  ++ lib.optionals stdenv.isLinux [
+    evdev
+  ];
+
+  doCheck = false;
+
+  meta = with lib; {
+    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..7a136176cf64
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pynrrd/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, numpy
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "pynrrd";
+  version = "0.4.2";
+
+  src = fetchFromGitHub {
+    owner = "mhe";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1wn3ara3i19fi1y9a5j4imyczpa6dkkzd5djggxg4kkl1ff9awrj";
+  };
+
+  propagatedBuildInputs = [ numpy ];
+
+  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/pynvim/default.nix b/nixpkgs/pkgs/development/python-modules/pynvim/default.nix
new file mode 100644
index 000000000000..53bb06b13dd0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pynvim/default.nix
@@ -0,0 +1,40 @@
+{ buildPythonPackage
+, fetchPypi
+, lib
+, nose
+, msgpack
+, greenlet
+, trollius
+, pythonOlder
+, isPyPy
+, pytestrunner
+}:
+
+buildPythonPackage rec {
+  pname = "pynvim";
+  version = "0.4.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "6bc6204d465de5888a0c5e3e783fe01988b032e22ae87875912280bef0e40f8f";
+  };
+
+  nativeBuildInputs = [
+    pytestrunner
+  ];
+
+  # Tests require pkgs.neovim,
+  # which we cannot add because of circular dependency.
+  doCheck = false;
+
+  propagatedBuildInputs = [ msgpack ]
+    ++ lib.optional (!isPyPy) greenlet
+    ++ lib.optional (pythonOlder "3.4") trollius;
+
+  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..75d8056fa557
--- /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 = "8.0.4";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0pfykj1amqh1rixp90rg85v1nj6qmx89fahqr6ii4zlcckffmm68";
+  };
+
+  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/pynzb/default.nix b/nixpkgs/pkgs/development/python-modules/pynzb/default.nix
new file mode 100644
index 000000000000..294c2374f537
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pynzb/default.nix
@@ -0,0 +1,30 @@
+{ lib, stdenv
+, 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/pyobjc/default.nix b/nixpkgs/pkgs/development/python-modules/pyobjc/default.nix
new file mode 100644
index 000000000000..4b27bea10bc5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyobjc/default.nix
@@ -0,0 +1,22 @@
+{ lib, fetchPypi, isPy3k, buildPythonPackage }:
+
+buildPythonPackage rec {
+  pname = "pyobjc";
+  version = "7.0";
+
+  # Gives "No matching distribution found for
+  # pyobjc-framework-Collaboration==4.0b1 (from pyobjc==4.0b1)"
+  disabled = isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "2b6c3e98f1408564ace1df36927154d7827c8e2f382386ab5d2db95c891e35a0";
+  };
+
+  meta = with lib; {
+    description = "A bridge between the Python and Objective-C programming languages";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+    homepage = "https://pythonhosted.org/pyobjc/";
+  };
+}
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..8cfce9ba43f1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyocr/default.nix
@@ -0,0 +1,36 @@
+{ lib, fetchFromGitLab, buildPythonPackage, pillow, setuptools_scm,
+setuptools-scm-git-archive , tesseract, cuneiform, isPy3k, substituteAll,
+pytest, tox }:
+
+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;
+  })
+  ];
+
+  buildInputs = [ setuptools_scm setuptools-scm-git-archive ];
+  propagatedBuildInputs = [ pillow ];
+  checkInputs = [ pytest tox ];
+  checkPhase = "pytest";
+
+  meta = {
+    inherit (src.meta) homepage;
+    description = "A Python wrapper for Tesseract and Cuneiform";
+    license = lib.licenses.gpl3Plus;
+  };
+}
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/pyodbc/default.nix b/nixpkgs/pkgs/development/python-modules/pyodbc/default.nix
new file mode 100644
index 000000000000..2dec1d8705bb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyodbc/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, isPyPy, unixODBC }:
+
+buildPythonPackage rec {
+  pname = "pyodbc";
+  version = "4.0.30";
+  disabled = isPyPy;  # use pypypdbc instead
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0skjpraar6hcwsy82612bpj8nw016ncyvvq88j5syrikxgp5saw5";
+  };
+
+  buildInputs = [ unixODBC ];
+
+  doCheck = false; # tests require a database server
+
+  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/pyomo/default.nix b/nixpkgs/pkgs/development/python-modules/pyomo/default.nix
new file mode 100644
index 000000000000..99f002b9317b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyomo/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, pyutilib
+, appdirs
+, ply
+, six
+, nose
+}:
+
+buildPythonPackage rec {
+  pname = "pyomo";
+  version = "5.6.1";
+  disabled = isPy27; # unable to import pyutilib.th
+
+  src = fetchPypi {
+    pname = "Pyomo";
+    inherit version;
+    sha256 = "449be9a4c9b3caee7c89dbe5f0e4e5ad0eaeef8be110a860641cd249986e362c";
+  };
+
+  checkInputs = [ nose ];
+  propagatedBuildInputs = [
+    pyutilib
+    appdirs
+    ply
+    six
+  ];
+
+  checkPhase = ''
+    rm pyomo/bilevel/tests/test_blp.py \
+       pyomo/version/tests/test_installer.py
+    nosetests
+  '';
+
+  meta = with lib; {
+    description = "Pyomo: Python Optimization Modeling Objects";
+    homepage = "http://pyomo.org";
+    license = licenses.bsd3;
+    maintainers = [ 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..4171eaeeb57e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyopencl/default.nix
@@ -0,0 +1,49 @@
+{ lib, stdenv
+, fetchPypi
+, buildPythonPackage
+, Mako
+, pytest
+, numpy
+, cffi
+, pytools
+, decorator
+, appdirs
+, six
+, opencl-headers
+, ocl-icd
+, pybind11
+}:
+
+buildPythonPackage rec {
+  pname = "pyopencl";
+  version = "2020.3.1";
+
+  checkInputs = [ pytest ];
+  buildInputs = [ opencl-headers ocl-icd pybind11 ];
+
+  propagatedBuildInputs = [ numpy cffi pytools decorator appdirs six Mako ];
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "abc689307cf34d3dcc94d43815f64e2265469b50ecce6c903a3180589666fb36";
+  };
+
+  # 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..23de6b2323f0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyopengl-accelerate/default.nix
@@ -0,0 +1,23 @@
+{ stdenv
+, buildPythonPackage
+, fetchPypi
+, lib
+}:
+
+buildPythonPackage rec {
+  pname = "pyopengl-accelerate";
+  version = "3.1.5";
+
+  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..b2d62e3730d1
--- /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.4";
+
+  src = fetchPypi {
+    pname = "PyOpenGL";
+    inherit version;
+    sha256 = "0bdf5ed600df30c8830455702338902528717c0af85ac5914f1dc5aa0bfa6eee";
+  };
+
+  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..c8b3bd4158c4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyopenssl/default.nix
@@ -0,0 +1,92 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, openssl
+, cryptography
+, pyasn1
+, idna
+, pytest
+, pretend
+, flaky
+, glibcLocales
+, six
+, fetchpatch
+}:
+
+let
+  # https://github.com/pyca/pyopenssl/issues/791
+  # These tests, we disable in the case that libressl is passed in as openssl.
+  failingLibresslTests = [
+    "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"
+  ];
+
+  # these tests are extremely tightly wed to the exact output of the openssl cli tool,
+  # including exact punctuation.
+  failingOpenSSL_1_1Tests = [
+    "test_dump_certificate"
+    "test_dump_privatekey_text"
+    "test_dump_certificate_request"
+    "test_export_text"
+  ];
+
+  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"
+  ] ++ (
+    lib.optionals (lib.hasPrefix "libressl" openssl.meta.name) failingLibresslTests
+  ) ++ (
+    lib.optionals (lib.versionAtLeast (lib.getVersion openssl.name) "1.1") failingOpenSSL_1_1Tests
+  ) ++ (
+    # https://github.com/pyca/pyopenssl/issues/974
+    lib.optionals stdenv.is32bit [ "test_verify_with_time" ]
+  );
+
+  # Compose the final string expression, including the "-k" and the single quotes.
+  testExpression = lib.optionalString (disabledTests != [])
+    "-k 'not ${lib.concatStringsSep " and not " disabledTests}'";
+
+in
+
+buildPythonPackage rec {
+  pname = "pyOpenSSL";
+  version = "20.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1i8ab5zn9i9iq2ksizp3rd42v157kacddzz88kviqw3kpp68xw4j";
+  };
+
+  outputs = [ "out" "dev" ];
+
+  checkPhase = ''
+    runHook preCheck
+    export LANG="en_US.UTF-8"
+    py.test tests ${testExpression}
+    runHook postCheck
+  '';
+
+  # 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 pyasn1 idna six ];
+
+  checkInputs = [ pytest pretend flaky glibcLocales ];
+}
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/pyosf/default.nix b/nixpkgs/pkgs/development/python-modules/pyosf/default.nix
new file mode 100644
index 000000000000..c25b1b114355
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyosf/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, isPy27
+, pytestrunner
+, 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 = [ pytestrunner ];  # 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..577f00fd1114
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyosmium/default.nix
@@ -0,0 +1,33 @@
+{ lib, buildPythonPackage, fetchFromGitHub, cmake, python
+, libosmium, protozero, boost, expat, bzip2, zlib, pybind11
+, nose, shapely, pythonOlder, isPyPy }:
+
+buildPythonPackage rec {
+  pname = "pyosmium";
+  version = "3.1.0";
+
+  disabled = pythonOlder "3.4" || isPyPy;
+
+  src = fetchFromGitHub {
+    owner = "osmcode";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0m11hdgiysdhyi5yn6nj8a8ycjzx5hpjy7n1c4j6q5caifj7rf7h";
+  };
+
+  nativeBuildInputs = [ cmake ];
+  buildInputs = [ libosmium protozero boost expat bzip2 zlib pybind11 ];
+
+  preBuild = "cd ..";
+
+  checkInputs = [ nose shapely ];
+
+  checkPhase = "(cd test && ${python.interpreter} run_tests.py)";
+
+  meta = with lib; {
+    description = "Python bindings for libosmium";
+    homepage = "https://osmcode.org/pyosmium";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ sikmir ];
+  };
+}
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..7ad07b3a6e8c
--- /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.4.1";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "038a3f70b34eaad3f72459e8b411662ef8dfcdd95f7d9203fa489e987a75584b";
+  };
+
+  pythonImportsCheck = [ "pyotp" ];
+
+  meta = with lib; {
+    description = "Python One Time Password Library";
+    homepage = "https://github.com/pyotp/pyotp";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
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..423d38ab25d8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyowm/default.nix
@@ -0,0 +1,30 @@
+{ lib, buildPythonPackage, fetchPypi, pythonOlder, requests, geojson }:
+
+buildPythonPackage rec {
+  pname = "pyowm";
+  version = "3.1.1";
+
+  disabled = pythonOlder "3.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a7b18297a9189dbe5f6b454b12d61a407e35c7eb9ca75bcabfe5e1c83245290d";
+  };
+
+  propagatedBuildInputs = [ requests geojson ];
+
+  # This may actually break the package.
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "requests>=2.18.2,<2.19" "requests"
+  '';
+
+  # No tests in archive
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A Python wrapper around the OpenWeatherMap web API";
+    homepage = "https://pyowm.readthedocs.io/";
+    license = licenses.mit;
+  };
+}
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..ffe7bf014232
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pypandoc/default.nix
@@ -0,0 +1,41 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub, fetchpatch
+, pandoc, haskellPackages, texlive }:
+
+buildPythonPackage rec {
+  pname = "pypandoc";
+  version = "1.5";
+
+  src = fetchFromGitHub {
+    owner = "bebraw";
+    repo = pname;
+    rev = version;
+    sha256 = "1lpslfns6zxx7b0xr13bzg921lwrj5am8za0b2dviywk6iiib0ld";
+  };
+
+  # https://github.com/bebraw/pypandoc/pull/204
+  patches = [
+    (fetchpatch {
+      url = "https://github.com/sternenseemann/pypandoc/commit/e422e277dd667c77dae11fad931dbb6015e9a784.patch";
+      sha256 = "11l11kh2a4k0h1g4yvijb60076kzxlkrvda3x6dc1s8fz352bpg3";
+    })
+  ];
+
+  postPatch = ''
+    # set pandoc path statically
+    sed -i '/^__pandoc_path = None$/c__pandoc_path = "${pandoc}/bin/pandoc"' pypandoc/__init__.py
+
+    # Skip test that requires network access
+    sed -i '/test_basic_conversion_from_http_url/i\\    @unittest.skip\("no network access during checkPhase"\)' tests.py
+  '';
+
+  preCheck = ''
+    export PATH="${haskellPackages.pandoc-citeproc}/bin:${texlive.combined.scheme-small}/bin:$PATH"
+  '';
+
+  meta = with lib; {
+    description = "Thin wrapper for pandoc";
+    homepage = "https://github.com/bebraw/pypandoc";
+    license = licenses.mit;
+    maintainers = with maintainers; [ sternenseemann bennofs ];
+  };
+}
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..5ecfdfb88839
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyparsing/default.nix
@@ -0,0 +1,35 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, lib
+
+# pythonPackages
+, coverage
+}:
+
+buildPythonPackage rec {
+  pname = "pyparsing";
+  version = "2.4.7";
+
+  src = fetchFromGitHub {
+    owner = "pyparsing";
+    repo = pname;
+    rev = "pyparsing_${version}";
+    sha256 = "14pfy80q2flgzjcx8jkracvnxxnr59kjzp3kdm5nh232gk1v6g6h";
+  };
+
+  # https://github.com/pyparsing/pyparsing/blob/847af590154743bae61a32c3dc1a6c2a19009f42/tox.ini#L6
+  checkInputs = [ coverage ];
+  checkPhase = ''
+    coverage run --branch simple_unit_tests.py
+    coverage run --branch unitTests.py
+  '';
+
+  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
+    ];
+  };
+}
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..f46a5d2db827
--- /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.11.4";
+  disabled = isPyPy;
+
+  src = fetchFromGitHub {
+    repo = pname;
+    owner = "dcantrell";
+    rev = "v${version}";
+    sha256 = "0wd0xhv1y1zw7djzcnimj8irif3mg0shbhgz0jn5yi914is88h6n";
+  };
+
+  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.pkgconfig ];
+  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..f3e49452c89a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pypass/default.nix
@@ -0,0 +1,84 @@
+{ 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; {
+    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/pypcap/default.nix b/nixpkgs/pkgs/development/python-modules/pypcap/default.nix
new file mode 100644
index 000000000000..08c90d828986
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pypcap/default.nix
@@ -0,0 +1,39 @@
+{ lib, writeText, buildPythonPackage, fetchPypi, libpcap, dpkt }:
+
+buildPythonPackage rec {
+  pname = "pypcap";
+  version = "1.2.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1w5i79gh7cswvznr8rhilcmzhnh2y5c4jwh2qrfnpx05zqigm1xd";
+  };
+
+  patches = [
+    # The default setup.py searchs for pcap.h in a static list of default
+    # folders. So we have to add the path to libpcap in the nix-store.
+    (writeText "libpcap-path.patch"
+      ''
+      --- a/setup.py
+      +++ b/setup.py
+      @@ -28,6 +28,7 @@ def recursive_search(path, target_files):
+
+       def find_prefix_and_pcap_h():
+           prefixes = chain.from_iterable((
+      +        '${libpcap}',
+               ('/usr', sys.prefix),
+               glob.glob('/opt/libpcap*'),
+               glob.glob('../libpcap*'),
+      '')
+  ];
+
+  buildInputs = [ libpcap ];
+  checkInputs = [ dpkt ];
+
+  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..3d39b3516b69
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pypck/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-asyncio
+, pytest-cov
+, pytest-timeout
+, pytestCheckHook
+, pythonOlder
+, stdenv
+}:
+
+buildPythonPackage rec {
+  pname = "pypck";
+  version = "0.7.9";
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "alengwenus";
+    repo = pname;
+    rev = version;
+    sha256 = "0clpi6bplzw7qg2m0hgwqr71zwxrh901gwprhd1yjykn30njp5bw";
+  };
+
+  checkInputs = [
+    pytest-asyncio
+    pytest-cov
+    pytest-timeout
+    pytestCheckHook
+  ];
+
+  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/pypdf/default.nix b/nixpkgs/pkgs/development/python-modules/pypdf/default.nix
new file mode 100644
index 000000000000..d69b1078aeef
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pypdf/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "pyPdf";
+  version = "1.13";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "3aede4c3c9c6ad07c98f059f90db0b09ed383f7c791c46100f649e1cabda0e3b";
+  };
+
+  # Not supported. Package is no longer maintained.
+  disabled = isPy3k;
+
+  meta = with lib; {
+    description = "Pure-Python PDF toolkit";
+    homepage = "http://pybrary.net/pyPdf/";
+    license = licenses.bsd3;
+  };
+
+}
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..cd91cc347a4f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pypdf2/default.nix
@@ -0,0 +1,35 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, glibcLocales
+, python
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "PyPDF2";
+  version = "1.26.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "11a3aqljg4sawjijkvzhs3irpw0y67zivqpbjpm065ha5wpr13z2";
+  };
+
+  LC_ALL = "en_US.UTF-8";
+  buildInputs = [ glibcLocales ];
+
+  checkPhase = ''
+    ${python.interpreter} -m unittest discover -s Tests
+  '';
+
+  # 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/pypeg2/default.nix b/nixpkgs/pkgs/development/python-modules/pypeg2/default.nix
new file mode 100644
index 000000000000..1f16a307a0c1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pypeg2/default.nix
@@ -0,0 +1,30 @@
+{ lib, stdenv
+, 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/pyperclip/default.nix b/nixpkgs/pkgs/development/python-modules/pyperclip/default.nix
new file mode 100644
index 000000000000..0df0da0cc5ed
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyperclip/default.nix
@@ -0,0 +1,19 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  version = "1.8.1";
+  pname = "pyperclip";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "9abef1e79ce635eb62309ecae02dfb5a3eb952fa7d6dce09c1aef063f81424d3";
+  };
+
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/asweigart/pyperclip";
+    license = licenses.bsdOriginal;
+    description = "Cross-platform clipboard module";
+  };
+}
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..f17f83bd17b9
--- /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.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "2189fbc4af08d519f85468e70e32c902eab0f1341b2c41028b94b2832d3169a7";
+  };
+
+  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..d8b9abcf97a3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyphen/default.nix
@@ -0,0 +1,18 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "Pyphen";
+  version = "0.10.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "719b21dfb4b04fbc11cc0f6112418535fe35474021120cccfffc43a25fe63128";
+  };
+
+  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..bc0e45359990
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pypillowfight/default.nix
@@ -0,0 +1,38 @@
+{ lib, stdenv, 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/pyplatec/default.nix b/nixpkgs/pkgs/development/python-modules/pyplatec/default.nix
new file mode 100644
index 000000000000..8747840fd7c0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyplatec/default.nix
@@ -0,0 +1,21 @@
+{ 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;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pypoppler/default.nix b/nixpkgs/pkgs/development/python-modules/pypoppler/default.nix
new file mode 100644
index 000000000000..83190bc292ab
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pypoppler/default.nix
@@ -0,0 +1,41 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+, pycairo
+, pygobject2
+, pkgs
+}:
+
+buildPythonPackage rec {
+  pname = "pypoppler";
+  version = "0.12.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "47e6ac99e5b114b9abf2d1dd1bca06f22c028d025432512989f659142470810f";
+  };
+
+  NIX_CFLAGS_COMPILE="-I${pkgs.poppler.dev}/include/poppler/";
+  nativeBuildInputs = [ pkgs.pkgconfig ];
+  buildInputs = [ pkgs.poppler.dev ];
+  propagatedBuildInputs = [ pycairo pygobject2 ];
+
+  patches = [
+    ./pypoppler-0.39.0.patch
+    ./pypoppler-poppler.c.patch
+  ];
+
+  # Not supported.
+  disabled = isPy3k;
+
+  # No tests in archive
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://code.launchpad.net/~mriedesel/poppler-python/main";
+    description = "Python bindings for poppler-glib, unofficial branch including bug fixes, and removal of gtk dependencies";
+    license = licenses.gpl2;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pypoppler/pypoppler-0.39.0.patch b/nixpkgs/pkgs/development/python-modules/pypoppler/pypoppler-0.39.0.patch
new file mode 100644
index 000000000000..b9e02242e003
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pypoppler/pypoppler-0.39.0.patch
@@ -0,0 +1,23 @@
+diff --git a/poppler.defs b/poppler.defs
+index 8b12e03..2b8fc16 100644
+--- a/poppler.defs
++++ b/poppler.defs
+@@ -570,18 +570,6 @@
+   )
+ )
+ 
+-(define-enum Orientation
+-  (in-module "Poppler")
+-  (c-name "PopplerOrientation")
+-  (gtype-id "POPPLER_TYPE_ORIENTATION")
+-  (values
+-    '("portrait" "POPPLER_ORIENTATION_PORTRAIT")
+-    '("landscape" "POPPLER_ORIENTATION_LANDSCAPE")
+-    '("upsidedown" "POPPLER_ORIENTATION_UPSIDEDOWN")
+-    '("seascape" "POPPLER_ORIENTATION_SEASCAPE")
+-  )
+-)
+-
+ (define-enum PageTransitionType
+   (in-module "Poppler")
+   (c-name "PopplerPageTransitionType")
diff --git a/nixpkgs/pkgs/development/python-modules/pypoppler/pypoppler-poppler.c.patch b/nixpkgs/pkgs/development/python-modules/pypoppler/pypoppler-poppler.c.patch
new file mode 100644
index 000000000000..1104097cd3e7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pypoppler/pypoppler-poppler.c.patch
@@ -0,0 +1,12 @@
+diff --git a/poppler.c b/poppler.c
+index 31b4489..16d0838 100644
+--- a/poppler.c
++++ b/poppler.c
+@@ -4501,7 +4501,6 @@ py_poppler_add_constants(PyObject *module, const gchar *strip_prefix)
+   pyg_enum_add(module, "FormTextType", strip_prefix, POPPLER_TYPE_FORM_TEXT_TYPE);
+   pyg_enum_add(module, "FormChoiceType", strip_prefix, POPPLER_TYPE_FORM_CHOICE_TYPE);
+   pyg_enum_add(module, "Error", strip_prefix, POPPLER_TYPE_ERROR);
+-  pyg_enum_add(module, "Orientation", strip_prefix, POPPLER_TYPE_ORIENTATION);
+   pyg_enum_add(module, "PageTransitionType", strip_prefix, POPPLER_TYPE_PAGE_TRANSITION_TYPE);
+   pyg_enum_add(module, "PageTransitionAlignment", strip_prefix, POPPLER_TYPE_PAGE_TRANSITION_ALIGNMENT);
+   pyg_enum_add(module, "PageTransitionDirection", strip_prefix, POPPLER_TYPE_PAGE_TRANSITION_DIRECTION);
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..a15f7aadb88c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyppeteer/default.nix
@@ -0,0 +1,29 @@
+{ buildPythonPackage, fetchPypi, lib, urllib3, pyee, tqdm, websockets, appdirs }:
+
+buildPythonPackage rec {
+  pname = "pyppeteer";
+  version = "0.2.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d1bcc61575ff788249d3bcaee696d856fa1153401a5428cb7376d826dd68dd9b";
+  };
+
+  # tests want to write to /homeless-shelter
+  doCheck = false;
+
+  propagatedBuildInputs = [
+    appdirs
+    websockets
+    tqdm
+    pyee
+    urllib3
+  ];
+
+  meta = {
+    description = "Headless chrome/chromium automation library (unofficial port of puppeteer)";
+    homepage = "https://github.com/pyppeteer/pyppeteer";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ kmein ];
+  };
+}
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..d270136558fc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyprind/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv, fetchPypi, buildPythonPackage
+, psutil
+, pytest }:
+
+buildPythonPackage rec {
+  pname = "PyPrind";
+  version = "2.11.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0xg6m5hr33h9bdlrr42kc58jm2m87a9zsagy7n2m4n407d2snv64";
+  };
+
+  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..52e0a80f739d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyproj/001.proj.patch
@@ -0,0 +1,62 @@
+diff -Nur a/pyproj/datadir.py b/pyproj/datadir.py
+--- a/pyproj/datadir.py	2020-03-24 12:53:39.417440608 +0100
++++ b/pyproj/datadir.py	2020-03-24 12:56:19.870089479 +0100
+@@ -66,9 +66,7 @@
+     if _VALIDATED_PROJ_DATA is not None:
+         return _VALIDATED_PROJ_DATA
+     global _USER_PROJ_DATA
+-    internal_datadir = os.path.join(
+-        os.path.dirname(os.path.abspath(__file__)), "proj_dir", "share", "proj"
+-    )
++    internal_datadir = "@proj@/share/proj"
+     proj_lib_dirs = os.environ.get("PROJ_LIB", "")
+     prefix_datadir = os.path.join(sys.prefix, "share", "proj")
+ 
+diff -Nur a/setup.py b/setup.py
+--- a/setup.py	2020-03-24 12:53:39.415440624 +0100
++++ b/setup.py	2020-03-24 12:52:05.311232522 +0100
+@@ -11,7 +11,7 @@
+ PROJ_MIN_VERSION = parse_version("6.2.0")
+ CURRENT_FILE_PATH = os.path.dirname(os.path.abspath(__file__))
+ BASE_INTERNAL_PROJ_DIR = "proj_dir"
+-INTERNAL_PROJ_DIR = os.path.join(CURRENT_FILE_PATH, "pyproj", BASE_INTERNAL_PROJ_DIR)
++INTERNAL_PROJ_DIR = "@proj@"
+ 
+ 
+ def check_proj_version(proj_dir):
+@@ -146,7 +146,7 @@
+     # 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("@projdev@")
+ 
+     # setup extension options
+     ext_options = {
+diff -Nur a/test/conftest.py b/test/conftest.py
+--- a/test/conftest.py	2020-03-24 12:53:39.417440608 +0100
++++ b/test/conftest.py	2020-03-24 23:16:47.373972786 +0100
+@@ -1,6 +1,7 @@
+ import os
+ import shutil
+ import tempfile
++import stat
+ 
+ import pytest
+ 
+@@ -17,6 +18,15 @@
+     with tempfile.TemporaryDirectory() as tmpdir:
+         tmp_data_dir = os.path.join(tmpdir, "proj")
+         shutil.copytree(data_dir, tmp_data_dir)
++
++        # Data copied from the nix store is readonly (causes cleanup problem).
++        # Make it writable.
++        for r, d, files in os.walk(tmp_data_dir):
++            os.chmod(r, os.stat(r).st_mode | stat.S_IWUSR)
++            for f in files:
++                fpath = os.path.join(r, f)
++                os.chmod(fpath, os.stat(fpath).st_mode | stat.S_IWUSR)
++
+         try:
+             os.remove(os.path.join(str(tmp_data_dir), "ntv2_0.gsb"))
+         except OSError:
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..c000283e6de8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyproj/default.nix
@@ -0,0 +1,60 @@
+{ lib, buildPythonPackage, fetchFromGitHub, python, pkgs, pythonOlder, isPy27, substituteAll
+, aenum
+, cython
+, pytestCheckHook
+, mock
+, numpy
+, shapely
+}:
+
+buildPythonPackage rec {
+  pname = "pyproj";
+  version = "2.6.0";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "pyproj4";
+    repo = "pyproj";
+    rev = "v${version}rel";
+    sha256 = "0fyggkbr3kp8mlq4c0r8sl5ah58bdg2mj4kzql9p3qyrkcdlgixh";
+  };
+
+  # force pyproj to use ${pkgs.proj}
+  patches = [
+    (substituteAll {
+      src = ./001.proj.patch;
+      proj = pkgs.proj;
+      projdev = pkgs.proj.dev;
+    })
+  ];
+
+  buildInputs = [ cython pkgs.proj ];
+
+  propagatedBuildInputs = [
+    numpy shapely
+  ] ++ lib.optional (pythonOlder "3.6") aenum;
+
+  checkInputs = [ pytestCheckHook mock ];
+
+  # prevent importing local directory
+  preCheck = "cd test";
+  pytestFlagsArray = [
+    "--ignore=test_doctest_wrapper.py"
+    "--ignore=test_datadir.py"
+  ];
+
+  disabledTests = [
+    "alternative_grid_name"
+    "transform_wgs84_to_alaska"
+    "transformer_group__unavailable"
+    "transform_group__missing_best"
+    "datum"
+    "repr"
+  ];
+
+  meta = {
+    description = "Python interface to PROJ.4 library";
+    homepage = "https://github.com/jswhit/pyproj";
+    license = with lib.licenses; [ isc ];
+  };
+}
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..af2575d21431
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyptlib/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv
+, 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..b806177b4d7d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pypugjs/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, fetchpatch, six, chardet, nose
+, django, jinja2, tornado, pyramid, pyramid_mako, Mako }:
+
+buildPythonPackage rec {
+  pname = "pypugjs";
+  version = "5.9.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1iy8k56rbslxcylhamdik2bd6gqqirrix55mrdn29zz9gl6vg1xi";
+  };
+
+  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..2e5f19e1d12d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pypykatz/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, aiowinreg
+, buildPythonPackage
+, fetchFromGitHub
+, minidump
+, minikerberos
+, msldap
+, winsspi
+}:
+
+buildPythonPackage rec {
+  pname = "pypykatz";
+  version = "0.3.15";
+
+  src = fetchFromGitHub {
+    owner = "skelsec";
+    repo = pname;
+    rev = version;
+    sha256 = "0bx2jdcfr1pdy3jgzg8fr5id9ffl2m1nc81dqhcplxdj8p214yri";
+  };
+
+  propagatedBuildInputs = [
+    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/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/4.x.nix b/nixpkgs/pkgs/development/python-modules/pyqt/4.x.nix
new file mode 100644
index 000000000000..3427438b8a26
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyqt/4.x.nix
@@ -0,0 +1,69 @@
+{ lib, stdenv, fetchurl, buildPythonPackage, python, dbus-python, sip, qt4, pkg-config, lndir, dbus, makeWrapper }:
+
+buildPythonPackage rec {
+  pname = "PyQt-x11-gpl";
+  version = "4.12";
+  format = "other";
+
+  src = fetchurl {
+    url = "mirror://sourceforge/pyqt/PyQt4_gpl_x11-${version}.tar.gz";
+    sha256 = "1nw8r88a5g2d550yvklawlvns8gd5slw53yy688kxnsa65aln79w";
+  };
+
+  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 ];
+
+  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..26bf5dc1c4b8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyqt/5.x.nix
@@ -0,0 +1,160 @@
+{ lib, pythonPackages, pkg-config
+, dbus
+, qmake, lndir
+, qtbase
+, qtsvg
+, qtdeclarative
+, qtwebchannel
+, withConnectivity ? false, qtconnectivity
+, withMultimedia ? false, qtmultimedia
+, withWebKit ? false, qtwebkit
+, withWebSockets ? false, qtwebsockets
+}:
+
+let
+
+  inherit (pythonPackages) buildPythonPackage python isPy3k dbus-python enum34;
+
+  sip = if isPy3k then
+    pythonPackages.sip_5
+  else
+    (pythonPackages.sip.override { sip-module = "PyQt5.sip"; }).overridePythonAttrs(oldAttrs: {
+      # If we install sip in another folder, then we need to create a __init__.py as well
+      # if we want to be able to import it with Python 2.
+      # Python 3 could rely on it being an implicit namespace package, however,
+      # PyQt5 we made an explicit namespace package so sip should be as well.
+      postInstall = ''
+        cat << EOF > $out/${python.sitePackages}/PyQt5/__init__.py
+        from pkgutil import extend_path
+        __path__ = extend_path(__path__, __name__)
+        EOF
+      '';
+    });
+
+  pyqt5_sip = buildPythonPackage rec {
+    pname = "PyQt5_sip";
+    version = "12.8.1";
+
+    src = pythonPackages.fetchPypi {
+      inherit pname version;
+      sha256 = "30e944db9abee9cc757aea16906d4198129558533eb7fadbe48c5da2bd18e0bd";
+    };
+
+    # 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;
+  };
+
+in buildPythonPackage rec {
+  pname = "PyQt5";
+  version = "5.15.2";
+  format = "other";
+
+  src = pythonPackages.fetchPypi {
+    inherit pname version;
+    sha256 = "1z74295i69cha52llsqffzhb5zz7qnbjc64h8qg21l91jgf0harp";
+  };
+
+  outputs = [ "out" "dev" ];
+
+  nativeBuildInputs = [
+    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
+  ;
+
+  buildInputs = [
+    dbus
+    qtbase
+    qtsvg
+    qtdeclarative
+  ]
+    ++ lib.optional withConnectivity qtconnectivity
+    ++ lib.optional withWebKit qtwebkit
+    ++ lib.optional withWebSockets qtwebsockets
+  ;
+
+  propagatedBuildInputs = [
+    dbus-python
+  ] ++ (if isPy3k then [ pyqt5_sip ] else [ sip enum34 ]);
+
+  patches = [
+    # Fix some wrong assumptions by ./configure.py
+    # TODO: figure out how to send this upstream
+    ./pyqt5-fix-dbus-mainloop-support.patch
+  ];
+
+  passthru = {
+    inherit sip;
+    multimediaEnabled = withMultimedia;
+    webKitEnabled = withWebKit;
+    WebSocketsEnabled = withWebSockets;
+  };
+
+  configurePhase = ''
+    runHook preConfigure
+
+    export PYTHONPATH=$PYTHONPATH:$out/${python.sitePackages}
+
+    ${python.executable} configure.py  -w \
+      --confirm-license \
+      --dbus-moduledir=$out/${python.sitePackages}/dbus/mainloop \
+      --no-qml-plugin \
+      --bindir=$out/bin \
+      --destdir=$out/${python.sitePackages} \
+      --stubsdir=$out/${python.sitePackages}/PyQt5 \
+      --sipdir=$out/share/sip/PyQt5 \
+      --designer-plugindir=$out/plugins/designer
+
+    runHook postConfigure
+  '';
+
+  postInstall = lib.optionalString (!isPy3k) ''
+    ln -s ${sip}/${python.sitePackages}/PyQt5/sip.* $out/${python.sitePackages}/PyQt5/
+    for i in $out/bin/*; do
+      wrapProgram $i --prefix PYTHONPATH : "$PYTHONPATH"
+    done
+
+    # Let's make it a namespace package
+    cat << EOF > $out/${python.sitePackages}/PyQt5/__init__.py
+    from pkgutil import extend_path
+    __path__ = extend_path(__path__, __name__)
+    EOF
+  '';
+
+  # 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"
+  ;
+
+  enableParallelBuilding = true;
+
+  meta = with lib; {
+    description = "Python bindings for Qt5";
+    homepage    = "http://www.riverbankcomputing.co.uk";
+    license     = licenses.gpl3;
+    platforms   = platforms.mesaPlatforms;
+    maintainers = with maintainers; [ sander ];
+  };
+}
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..faa36fa1913d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyqt/pyqt5-fix-dbus-mainloop-support.patch
@@ -0,0 +1,70 @@
+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 a3450ca3..440d90a2 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
+ 
+@@ -1184,6 +1187,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.
+@@ -2149,7 +2157,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")
+@@ -2178,7 +2186,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).
+-- 
+2.18.0
+
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..98b30b247077
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyqtgraph/default.nix
@@ -0,0 +1,34 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, numpy
+, pyopengl
+, pyqt5
+, scipy
+}:
+
+buildPythonPackage rec {
+  pname = "pyqtgraph";
+  version = "0.11.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0p5k73wjfh0zzjvby8b5107cx7x0c2rdj66zh1nc8y95i0anf2na";
+  };
+
+  propagatedBuildInputs = [ numpy pyopengl pyqt5 scipy ];
+
+  doCheck = false;  # tries to create windows (QApps) on collection, which fails (probably due to no display)
+
+  pythonImportsCheck = [ "pyqtgraph" ];
+
+  meta = with lib; {
+    description = "Scientific Graphics and GUI Library for Python";
+    homepage = "http://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..262c5a17504a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyqtwebengine/default.nix
@@ -0,0 +1,99 @@
+{ lib, pythonPackages, pkg-config
+, qmake, qtbase, qtsvg, qtwebengine
+, wrapQtAppsHook
+}:
+
+let
+
+  inherit (pythonPackages) buildPythonPackage python isPy3k pyqt5 enum34;
+  inherit (pyqt5) sip;
+  # source: https://www.riverbankcomputing.com/pipermail/pyqt/2020-June/042985.html
+  patches = lib.optional (lib.hasPrefix "5.14" pyqt5.version)
+    [ ./fix-build-with-qt-514.patch ]
+  ;
+
+in buildPythonPackage rec {
+  pname = "PyQtWebEngine";
+  version = "5.15.0";
+  format = "other";
+
+  src = pythonPackages.fetchPypi {
+    inherit pname version;
+    sha256 = "0xdzhl07x3mzfnr5cf4d640168vxi7fyl0fz1pvpbgs0irl14237";
+  };
+
+  inherit patches;
+
+  outputs = [ "out" "dev" ];
+
+  nativeBuildInputs = [
+    pkg-config
+    qmake
+    sip
+    qtbase
+    qtsvg
+    qtwebengine
+  ];
+
+  buildInputs = [
+    sip
+    qtbase
+    qtsvg
+    qtwebengine
+  ];
+
+  propagatedBuildInputs = [ pyqt5 ]
+    ++ lib.optional (!isPy3k) enum34;
+
+  configurePhase = ''
+    runHook preConfigure
+
+    mkdir -p "$out/share/sip/PyQt5"
+
+    # FIXME: Without --no-dist-info, I get
+    #     unable to create /nix/store/yv4pzx3lxk3lscq0pw3hqzs7k4x76xsm-python3-3.7.2/lib/python3.7/site-packages/PyQtWebEngine-5.12.dist-info
+    ${python.executable} configure.py -w \
+      --destdir="$out/${python.sitePackages}/PyQt5" \
+      --no-dist-info \
+      --apidir="$out/api/${python.libPrefix}" \
+      --sipdir="$out/share/sip/PyQt5" \
+      --pyqt-sipdir="${pyqt5}/share/sip/PyQt5" \
+      --stubsdir="$out/${python.sitePackages}/PyQt5"
+
+    runHook postConfigure
+  '';
+
+  postInstall = ''
+    # Let's make it a namespace package
+    cat << EOF > $out/${python.sitePackages}/PyQt5/__init__.py
+    from pkgutil import extend_path
+    __path__ = extend_path(__path__, __name__)
+    EOF
+  '';
+
+  installCheckPhase = let
+    modules = [
+      "PyQt5.QtWebEngine"
+      "PyQt5.QtWebEngineWidgets"
+    ];
+    imports = lib.concatMapStrings (module: "import ${module};") modules;
+  in ''
+    echo "Checking whether modules can be imported..."
+    PYTHONPATH=$PYTHONPATH:$out/${python.sitePackages} ${python.interpreter} -c "${imports}"
+  '';
+
+  doCheck = true;
+
+  enableParallelBuilding = true;
+
+  passthru = {
+    inherit wrapQtAppsHook;
+  };
+
+  meta = with lib; {
+    description = "Python bindings for Qt5";
+    homepage    = "http://www.riverbankcomputing.co.uk";
+    license     = licenses.gpl3;
+    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/pyquery/default.nix b/nixpkgs/pkgs/development/python-modules/pyquery/default.nix
new file mode 100644
index 000000000000..2496d9d968fc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyquery/default.nix
@@ -0,0 +1,30 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, cssselect
+, lxml
+, webob
+}:
+
+buildPythonPackage rec {
+  pname = "pyquery";
+  version = "1.2.9";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "00p6f1dfma65192hc72dxd506491lsq3g5wgxqafi1xpg2w1xia6";
+  };
+
+  propagatedBuildInputs = [ cssselect lxml webob ];
+
+  # circular dependency on webtest
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/gawel/pyquery";
+    description = "A jquery-like library for python";
+    license = licenses.bsd0;
+  };
+
+}
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..31cbf77d94e0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyrad/default.nix
@@ -0,0 +1,27 @@
+{ buildPythonPackage, fetchFromGitHub, lib, netaddr, six, nose }:
+
+buildPythonPackage rec {
+  pname = "pyrad";
+  version = "2.3";
+
+  src = fetchFromGitHub {
+    owner = "pyradius";
+    repo = pname;
+    rev = version;
+    sha256 = "0hy7999av47s8100afbhxfjb8phbmrqcv530xlvskndby4a8w94k";
+  };
+
+  propagatedBuildInputs = [ netaddr six ];
+  checkInputs = [ nose ];
+
+  checkPhase = ''
+    nosetests -e testBind
+  '';
+
+  meta = with lib; {
+    description = "Python RADIUS Implementation";
+    homepage = "https://bitbucket.org/zzzeek/sqlsoup";
+    license = licenses.mit;
+    maintainers = [ maintainers.globin ];
+  };
+}
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..5f1e5c7d75a8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyramid/default.nix
@@ -0,0 +1,43 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, webtest
+, zope_component
+, hupper
+, PasteDeploy
+, plaster
+, plaster-pastedeploy
+, repoze_lru
+, translationstring
+, venusian
+, webob
+, zope_deprecation
+, zope_interface
+, isPy35
+}:
+
+buildPythonPackage rec {
+  pname = "pyramid";
+  version = "1.10.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "fe1bd1140e6b79fe07f0053981d49be2dc66656cc8b481dd7ffcaa872fc25467";
+  };
+
+  checkInputs = [ webtest zope_component ];
+
+  propagatedBuildInputs = [ hupper PasteDeploy plaster plaster-pastedeploy repoze_lru translationstring venusian webob zope_deprecation zope_interface ];
+
+  # Failing tests
+  # https://github.com/Pylons/pyramid/issues/1899
+  doCheck = !isPy35;
+
+  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..88dc62886fc6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyramid_beaker/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv, 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; {
+    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..2bb5a03bdb91
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyramid_chameleon/default.nix
@@ -0,0 +1,33 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, chameleon
+, pyramid
+, zope_interface
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "pyramid_chameleon";
+  version = "0.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d176792a50eb015d7865b44bd9b24a7bd0489fa9a5cebbd17b9e05048cef9017";
+  };
+
+  patches = [
+    # https://github.com/Pylons/pyramid_chameleon/pull/25
+    ./test-renderers-pyramid-import.patch
+  ];
+
+  propagatedBuildInputs = [ chameleon pyramid zope_interface setuptools ];
+
+  meta = with lib; {
+    description = "Chameleon template compiler for pyramid";
+    homepage = "https://github.com/Pylons/pyramid_chameleon";
+    license = licenses.bsd0;
+    maintainers = with maintainers; [ domenkozar ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyramid_chameleon/test-renderers-pyramid-import.patch b/nixpkgs/pkgs/development/python-modules/pyramid_chameleon/test-renderers-pyramid-import.patch
new file mode 100644
index 000000000000..635ed3510fc7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyramid_chameleon/test-renderers-pyramid-import.patch
@@ -0,0 +1,11 @@
+--- a/pyramid_chameleon/tests/test_renderers.py
++++ b/pyramid_chameleon/tests/test_renderers.py
+@@ -258,7 +258,7 @@ class TestChameleonRendererLookup(unittest.TestCase):
+         self.assertRaises(ValueError, lookup.__call__, info)
+ 
+     def test___call__spec_alreadyregistered(self):
+-        from pyramid import tests
++        from pyramid_chameleon import tests
+         module_name = tests.__name__
+         relpath = 'test_renderers.py'
+         spec = '%s:%s' % (module_name, relpath)
diff --git a/nixpkgs/pkgs/development/python-modules/pyramid_exclog/default.nix b/nixpkgs/pkgs/development/python-modules/pyramid_exclog/default.nix
new file mode 100644
index 000000000000..80514cc91b48
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyramid_exclog/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, pyramid
+}:
+
+buildPythonPackage rec {
+  pname = "pyramid_exclog";
+  version = "1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d05ced5c12407507154de6750036bc83861b85c11be70b3ec3098c929652c14b";
+  };
+
+  propagatedBuildInputs = [ pyramid ];
+
+  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..ab4025b72309
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyramid_hawkauth/default.nix
@@ -0,0 +1,30 @@
+{ lib, stdenv
+, 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 ];
+
+  meta = with lib; {
+    homepage = "https://github.com/mozilla-services/pyramid_hawkauth";
+    description = "A Pyramid authentication plugin for HAWK";
+    license = licenses.mpl20;
+  };
+
+}
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..0497ab79613f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyramid_jinja2/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, webtest
+, jinja2
+, pyramid
+}:
+
+buildPythonPackage rec {
+  pname = "pyramid_jinja2";
+  version = "2.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "81e0615cb3108f2a251ff3141ad0d698a5d03685819f3a836ea84787e8489502";
+  };
+
+  buildInputs = [ webtest ];
+  propagatedBuildInputs = [ jinja2 pyramid ];
+
+  meta = with lib; {
+    description = "Jinja2 template bindings for the Pyramid web framework";
+    homepage = "https://github.com/Pylons/pyramid_jinja2";
+    license = licenses.bsd0;
+    maintainers = with maintainers; [ domenkozar ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyramid_mako/default.nix b/nixpkgs/pkgs/development/python-modules/pyramid_mako/default.nix
new file mode 100644
index 000000000000..8c71563e2d77
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyramid_mako/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, webtest
+, pyramid
+, Mako
+}:
+
+buildPythonPackage rec {
+  pname = "pyramid_mako";
+  version = "1.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0066c863441f1c3ddea60cee1ccc50d00a91a317a8052ca44131da1a12a840e2";
+  };
+
+  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;
+  };
+
+}
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..9167918fc47d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyramid_multiauth/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, pyramid
+}:
+
+buildPythonPackage rec {
+  pname = "pyramid_multiauth";
+  version = "0.9.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0lprqjyg3zcji6033p1l3s4nigjigc5423wgivkfhz46vq0jmniy";
+  };
+
+  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;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyreadability/default.nix b/nixpkgs/pkgs/development/python-modules/pyreadability/default.nix
new file mode 100644
index 000000000000..9aa87d238ec9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyreadability/default.nix
@@ -0,0 +1,25 @@
+{ lib, fetchPypi, buildPythonPackage
+, requests, chardet, cssselect, lxml
+}:
+
+buildPythonPackage rec {
+  pname   = "PyReadability";
+  version = "0.4.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1k6fq416pdmjcdqh6gdxl0y0k8kj1zlpzwp5574xsvsha18p2zpn";
+  };
+
+  propagatedBuildInputs = [ requests chardet cssselect lxml ];
+
+  # ModuleNotFoundError: No module named 'tests'
+  doCheck = false;
+
+  meta = {
+    homepage = "https://github.com/hyperlinkapp/python-readability";
+    description = "fast python port of arc90's readability tool, updated to match latest readability.js!";
+    license = lib.licenses.asl20;
+  };
+
+}
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..86a5ef6bfe0f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyregion/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, pyparsing
+, numpy
+, cython
+, astropy
+, astropy-helpers
+, pytest
+, pytest-astropy
+}:
+
+buildPythonPackage rec {
+  pname = "pyregion";
+  version = "2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a8ac5f764b53ec332f6bc43f6f2193ca13e8b7d5a3fb2e20ced6b2ea42a9d094";
+  };
+
+  propagatedBuildInputs = [
+    pyparsing
+    numpy
+    cython
+    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 ];
+
+  checkInputs = [ pytest 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
+  checkPhase = ''
+    cd build/lib.*
+    pytest
+  '';
+
+  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/pyreport/default.nix b/nixpkgs/pkgs/development/python-modules/pyreport/default.nix
new file mode 100644
index 000000000000..09a1e7c6b418
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyreport/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "pyreport";
+  version = "0.3.4c";
+  disabled = isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1584607596b7b310bf0b6ce79f424bd44238a017fd870aede11cd6732dbe0d4d";
+  };
+
+  # error: invalid command 'test'
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://pypi.python.org/pypi/pyreport";
+    license = licenses.bsd0;
+    description = "Pyreport makes notes out of a python script";
+  };
+
+}
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..6d49bd025948
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyres/default.nix
@@ -0,0 +1,45 @@
+{ lib, stdenv, fetchPypi, buildPythonPackage, fetchFromGitHub, simplejson, redis, setproctitle, nose, pkgs }:
+
+let
+
+  # the requirements of `pyres` support Redis 3.x (due to a missing upper-bound),
+  # but it doesn't support Redis 3.x.
+  redis' = redis.overridePythonAttrs (old: rec {
+    pname = "redis";
+    version = "2.10.6";
+    src = fetchPypi {
+      inherit pname version;
+      sha256 = "03vcgklykny0g0wpvqmy8p6azi2s078317wgb2xjv5m2rs9sjb52";
+    };
+  });
+
+in
+
+buildPythonPackage rec {
+  pname = "pyres";
+  version = "1.5";
+
+  # ps is used in Worker.worker_pids method
+  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";
+  };
+
+  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 ];
+  };
+}
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..f6be3c4c8974
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyrfc3339/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv
+, 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/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..54c2155a51b5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyro-ppl/default.nix
@@ -0,0 +1,42 @@
+{ buildPythonPackage, fetchPypi, lib, pytorch, contextlib2
+, graphviz, networkx, six, opt-einsum, tqdm, pyro-api }:
+
+buildPythonPackage rec {
+  version = "1.5.1";
+  pname = "pyro-ppl";
+
+  src = fetchPypi {
+    inherit version pname;
+    sha256 = "00mprgf8pf9jq3kanxjldj00cg3nbfkb5yg0mdfbdi0b1rx3vnsa";
+  };
+
+  propagatedBuildInputs = [
+    pyro-api
+    pytorch
+    contextlib2
+    # TODO(tom): graphviz pulls in a lot of dependencies - make
+    # optional when some time to figure out how.
+    graphviz
+    networkx
+    six
+    opt-einsum
+    tqdm
+  ];
+
+  # pyro not shipping tests do simple smoke test instead
+  pythonImportsCheck = [
+    "pyro"
+    "pyro.distributions"
+    "pyro.infer"
+    "pyro.optim"
+  ];
+
+  doCheck = false;
+
+  meta = {
+    description = "A Python library for probabilistic modeling and inference";
+    homepage = "http://pyro.ai";
+    license = lib.licenses.mit;
+    maintainers = with lib.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..a84b22e06567
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyro4/default.nix
@@ -0,0 +1,57 @@
+{ stdenv
+, buildPythonPackage
+, fetchPypi
+, lib
+, python
+, serpent
+, dill
+, cloudpickle
+, msgpack
+, isPy27
+, selectors34
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "Pyro4";
+  version = "4.80";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "46847ca703de3f483fbd0b2d22622f36eff03e6ef7ec7704d4ecaa3964cb2220";
+  };
+
+  propagatedBuildInputs = [
+    serpent
+  ] ++ lib.optionals isPy27 [ selectors34 ];
+
+  buildInputs = [
+    dill
+    cloudpickle
+    msgpack
+  ];
+
+  checkInputs = [ pytestCheckHook ];
+
+  # add testsupport.py to PATH
+  preCheck = "PYTHONPATH=tests/PyroTests:$PYTHONPATH";
+
+  # ignore network related tests, which fail in sandbox
+  pytestFlagsArray = [ "--ignore=tests/PyroTests/test_naming.py" ];
+
+  disabledTests = [
+    "StartNSfunc"
+    "Broadcast"
+    "GetIP"
+  ];
+
+  # otherwise the tests hang the build
+  __darwinAllowLocalNetworking = true;
+
+  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..5afce4a37dac
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyro5/default.nix
@@ -0,0 +1,33 @@
+{ buildPythonPackage
+, fetchPypi
+, lib
+, serpent
+, pythonOlder
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "Pyro5";
+  version = "5.11";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "867cdd291d85560373e0c468da7fd18754f2568ef60e0bc504af42f391d7a3e5";
+  };
+
+  propagatedBuildInputs = [ serpent ];
+
+  checkInputs = [ pytestCheckHook ];
+
+  # ignore network related tests, which fail in sandbox
+  disabledTests = [ "StartNSfunc" "Broadcast" "GetIP" "TestNameServer" "TestBCSetup" ];
+
+  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/pyroma/default.nix b/nixpkgs/pkgs/development/python-modules/pyroma/default.nix
new file mode 100644
index 000000000000..e533f6501697
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyroma/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi
+, docutils, pygments, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "pyroma";
+  version = "2.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "00j1j81kiipi5yppmk385cbfccf2ih0xyapl7pw6nqhrf8vh1764";
+  };
+
+  propagatedBuildInputs = [ docutils pygments setuptools ];
+
+  meta = with lib; {
+    description = "Test your project's packaging friendliness";
+    homepage = "https://github.com/regebro/pyroma";
+    license = licenses.mit;
+  };
+}
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..f2378863720c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyroute2/default.nix
@@ -0,0 +1,22 @@
+{lib, stdenv, buildPythonPackage, fetchPypi}:
+
+buildPythonPackage rec {
+  pname = "pyroute2";
+  version = "0.5.14";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "774c5ecf05fe40f0f601a7ab33c19ca0b24f00bf4a094e58deaa5333b7ca49b5";
+  };
+
+  # requires root priviledges
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Python Netlink library";
+    homepage = "https://github.com/svinota/pyroute2";
+    license = licenses.asl20;
+    maintainers = [maintainers.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..f8ac5d8e8675
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyrr/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv
+, 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..211bc85f5112
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyrsistent/default.nix
@@ -0,0 +1,37 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, six
+, pytest_4
+, hypothesis_4
+, pytestrunner
+}:
+
+buildPythonPackage rec {
+  pname = "pyrsistent";
+  version = "0.17.3";
+
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "2e636185d9eb976a18a8a8e96efce62f2905fea90041958d8cc2a189756ebf3e";
+  };
+
+  propagatedBuildInputs = [ six ];
+
+  checkInputs = [ pytestrunner pytest_4 hypothesis_4 ];
+
+  postPatch = ''
+    substituteInPlace setup.py --replace 'pytest<5' 'pytest'
+  '';
+
+  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..e3586e6dbf1c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyrss2gen/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv
+, 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/pysam/default.nix b/nixpkgs/pkgs/development/python-modules/pysam/default.nix
new file mode 100644
index 000000000000..2f40a2973332
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysam/default.nix
@@ -0,0 +1,114 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, bzip2
+, bcftools
+, curl
+, cython
+, htslib
+, libdeflate
+, lzma
+, pytest
+, samtools
+, zlib
+}:
+
+buildPythonPackage rec {
+  pname   = "pysam";
+  version = "0.16.0.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 = "v${version}";
+    sha256 = "168bwwm8c2k22m7paip8q0yajyl7xdxgnik0bgjl7rhqg0majz0f";
+  };
+
+  nativeBuildInputs = [ samtools ];
+  buildInputs = [
+    bzip2
+    curl
+    cython
+    libdeflate
+    lzma
+    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..7d2fdb5b4260
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysaml2/default.nix
@@ -0,0 +1,62 @@
+{ lib, stdenv
+, buildPythonPackage
+, isPy3k
+, fetchFromGitHub
+, fetchpatch
+, substituteAll
+, xmlsec
+, cryptography, defusedxml, future, pyopenssl, dateutil, pytz, requests, six
+, mock, pyasn1, pymongo, pytest, responses
+}:
+
+buildPythonPackage rec {
+  pname = "pysaml2";
+  version = "5.0.0";
+
+  disabled = !isPy3k;
+
+  # No tests in PyPI tarball
+  src = fetchFromGitHub {
+    owner = "IdentityPython";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0hwhxz45h8l1b0615hf855z7valfcmm0nb7k31bcj84v68zp5rjs";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./hardcode-xmlsec1-path.patch;
+      inherit xmlsec;
+    })
+    # remove on next release
+    (fetchpatch {
+      name = "fix-test-dates.patch";
+      url = "https://github.com/IdentityPython/pysaml2/commit/1d97d2d26f63e42611558fdd0e439bb8a7496a27.patch";
+      sha256 = "0r6d6hkk6z9yw7aqnsnylii516ysmdsc8dghwmgnwvw6cm7l388p";
+    })
+  ];
+
+  postPatch = ''
+    # fix failing tests on systems with 32bit time_t
+    sed -i 's/2999\(-.*T\)/2029\1/g' tests/*.xml
+  '';
+
+  propagatedBuildInputs = [ cryptography defusedxml future pyopenssl dateutil pytz requests six ];
+
+  checkInputs = [ mock pyasn1 pymongo pytest responses ];
+
+  # Disabled tests try to access the network
+  checkPhase = ''
+    py.test -k "not test_load_extern_incommon \
+            and not test_load_remote_encoding \
+            and not test_load_external \
+            and not test_conf_syslog"
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/rohe/pysaml2";
+    description = "Python implementation of SAML Version 2 Standard";
+    license = licenses.asl20;
+  };
+
+}
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/pysbd/default.nix b/nixpkgs/pkgs/development/python-modules/pysbd/default.nix
new file mode 100644
index 000000000000..e1e0578c83b8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysbd/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, tqdm
+, spacy
+}:
+
+buildPythonPackage rec {
+  pname = "pysbd";
+  version = "0.3.3";
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "56ab48a28a8470f0042a4cb7c9da8a6dde8621ecf87a86d75f201cbf1837e77f";
+  };
+
+  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 = [ maintainers.mic92 ];
+  };
+}
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..d02c85fb4ffd
--- /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; [ danharaj ];
+  };
+}
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..28c40e5ec5fc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyscard/default.nix
@@ -0,0 +1,39 @@
+{ lib, stdenv, fetchPypi, buildPythonPackage, swig, pcsclite, PCSC }:
+
+let
+  # Package does not support configuring the pcsc library.
+  withApplePCSC = stdenv.isDarwin;
+in
+
+buildPythonPackage rec {
+  version = "2.0.0";
+  pname = "pyscard";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0yap0p8mp6dx58n3nina6ryhc2cysaj75sq98wf3qybf33cxjr5k";
+  };
+
+  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/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/pyscreenshot/default.nix b/nixpkgs/pkgs/development/python-modules/pyscreenshot/default.nix
new file mode 100644
index 000000000000..3ca096332aea
--- /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 = "2.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "bfdc311bd6ec1ee9e3c25ece75b24a749673ad5d5f89ee02950080023054ffd5";
+  };
+
+  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/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..6da19bc48ab8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyscss/default.nix
@@ -0,0 +1,39 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, pytest
+, six
+, enum34
+, pathlib
+, ordereddict
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyScss";
+  version = "1.3.7";
+
+  src = fetchFromGitHub {
+    repo = "pyScss";
+    owner = "Kronuz";
+    rev = version;
+    sha256 = "0701hziiiw67blafgpmjhzspmrss8mfvif7fw0rs8fikddwwc9g6";
+  };
+
+  checkInputs = [ pytest ];
+
+  propagatedBuildInputs = [ six ]
+    ++ (lib.optionals (pythonOlder "3.4") [ enum34 pathlib ])
+    ++ (lib.optionals (pythonOlder "2.7") [ ordereddict ]);
+
+  checkPhase = ''
+    py.test
+  '';
+
+  meta = with lib; {
+    description = "A Scss compiler for Python";
+    homepage = "https://pyscss.readthedocs.org/en/latest/";
+    license = licenses.mit;
+  };
+
+}
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..db6895edfbf8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysdl2/PySDL2-dll.patch
@@ -0,0 +1,100 @@
+diff -ru PySDL2-0.9.7-old/sdl2/dll.py PySDL2-0.9.7/sdl2/dll.py
+--- PySDL2-0.9.7-old/sdl2/dll.py	2020-02-15 09:36:29.000000000 +0100
++++ PySDL2-0.9.7/sdl2/dll.py	2020-09-23 20:24:09.365497270 +0200
+@@ -94,15 +94,16 @@
+     """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._libname = libinfo

+         self._version = None

+-        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)

+@@ -117,9 +118,9 @@
+         if self._dll is None:

+             raise RuntimeError("found %s, but it's not usable for the library %s" %

+                                (foundlibs, libinfo))

+-        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

+@@ -220,7 +221,7 @@
+     return

+ 

+ try:

+-    dll = DLL("SDL2", ["SDL2", "SDL2-2.0"], os.getenv("PYSDL2_DLL_PATH"))

++    dll = DLL("SDL2", "@sdl2@")

+ except RuntimeError as exc:

+     raise ImportError(exc)

+ 

+diff -ru PySDL2-0.9.7-old/sdl2/sdlgfx.py PySDL2-0.9.7/sdl2/sdlgfx.py
+--- PySDL2-0.9.7-old/sdl2/sdlgfx.py	2020-02-02 11:07:00.000000000 +0100
++++ PySDL2-0.9.7/sdl2/sdlgfx.py	2020-09-23 20:23:56.997419129 +0200
+@@ -39,8 +39,7 @@
+            ]

+ 

+ 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 -ru PySDL2-0.9.7-old/sdl2/sdlimage.py PySDL2-0.9.7/sdl2/sdlimage.py
+--- PySDL2-0.9.7-old/sdl2/sdlimage.py	2020-02-02 11:07:00.000000000 +0100
++++ PySDL2-0.9.7/sdl2/sdlimage.py	2020-09-23 20:23:50.085375658 +0200
+@@ -27,8 +27,7 @@
+            ]

+ 

+ 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 -ru PySDL2-0.9.7-old/sdl2/sdlmixer.py PySDL2-0.9.7/sdl2/sdlmixer.py
+--- PySDL2-0.9.7-old/sdl2/sdlmixer.py	2020-02-02 11:07:00.000000000 +0100
++++ PySDL2-0.9.7/sdl2/sdlmixer.py	2020-09-23 20:23:46.117350771 +0200
+@@ -53,8 +53,7 @@
+           ]

+ 

+ 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 -ru PySDL2-0.9.7-old/sdl2/sdlttf.py PySDL2-0.9.7/sdl2/sdlttf.py
+--- PySDL2-0.9.7-old/sdl2/sdlttf.py	2020-02-02 11:07:00.000000000 +0100
++++ PySDL2-0.9.7/sdl2/sdlttf.py	2020-09-23 20:23:40.069312931 +0200
+@@ -39,8 +39,7 @@
+           ]

+ 

+ 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..be9663245bb5
--- /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.7";
+  # 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 = "e4fcc8aa1108e4917cb56794575ee08c2a3d9c2c52620474e3ecc8538dadf209";
+  };
+
+  # 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/pysendfile/default.nix b/nixpkgs/pkgs/development/python-modules/pysendfile/default.nix
new file mode 100644
index 000000000000..a35f2ae77f02
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysendfile/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv
+, 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; {
+    homepage = "https://github.com/giampaolo/pysendfile";
+    description = "A Python interface to sendfile(2)";
+    license = licenses.mit;
+  };
+
+}
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..214412c4ceed
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysensors/default.nix
@@ -0,0 +1,32 @@
+{ lib, stdenv, 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..ff3d624490ba
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyserial-asyncio/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, isPy3k
+, pyserial }:
+
+buildPythonPackage rec {
+  pname = "pyserial-asyncio";
+  version = "0.5";
+
+  disabled = !isPy3k; # Doesn't support python older than 3.4
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1641e5433a866eeaf6464b3ab88b741e7a89dd8cd0f851b3343b15f425138d33";
+  };
+
+  propagatedBuildInputs = [ pyserial ];
+
+  meta = with lib; {
+    description = "asyncio extension package for pyserial";
+    homepage = "https://github.com/pyserial/pyserial-asyncio";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ etu ];
+    platforms = platforms.linux;
+  };
+}
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..239568f64b76
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyserial/default.nix
@@ -0,0 +1,21 @@
+{ stdenv, lib, fetchPypi, buildPythonPackage }:
+
+buildPythonPackage rec {
+  pname = "pyserial";
+  version="3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1nyd4m4mnrz8scbfqn4zpq8gnbl4x42w5zz62vcgpzqd2waf0xrw";
+  };
+
+  checkPhase = "python -m unittest discover -s test";
+  doCheck = !stdenv.hostPlatform.isDarwin; # broken on darwin
+
+  meta = with lib; {
+    homepage = "https://github.com/pyserial/pyserial";
+    license = licenses.psfl;
+    description = "Python serial port extension";
+    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..28daf6b385e6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysftp/default.nix
@@ -0,0 +1,31 @@
+{ lib, stdenv
+, 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/pyshp/default.nix b/nixpkgs/pkgs/development/python-modules/pyshp/default.nix
new file mode 100644
index 000000000000..661c70a0ab26
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyshp/default.nix
@@ -0,0 +1,20 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi
+, setuptools }:
+
+buildPythonPackage rec {
+  version = "2.1.2";
+  pname = "pyshp";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a0aa668cd0fc09b873f10facfe96971c0496b7fe4f795684d96cc7306ac5841c";
+  };
+
+  buildInputs = [ setuptools ];
+
+  meta = with lib; {
+    description = "Pure Python read/write support for ESRI Shapefile format";
+    homepage = "https://github.com/GeospatialPython/pyshp";
+    license = licenses.mit;
+  };
+}
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..9398a62997b2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyside/apiextractor.nix
@@ -0,0 +1,30 @@
+{ lib, stdenv, fetchurl, 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 {
+  name = "pyside-apiextractor-0.10.10";
+
+  src = fetchurl {
+    url = "https://github.com/PySide/Apiextractor/archive/0.10.10.tar.gz";
+    sha256 = "1zj8yrxy08iv1pk38djxw3faimm226w6wmi0gm32w4yczblylwz3";
+  };
+
+  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..08fd8cbfa862
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyside/default.nix
@@ -0,0 +1,31 @@
+{ lib, fetchurl, cmake, buildPythonPackage, pysideGeneratorrunner, pysideShiboken, qt4, mesa, libGL }:
+
+# This derivation provides a Python module and should therefore be called via `python-packages.nix`.
+buildPythonPackage rec {
+  pname = "pyside";
+  version = "1.2.4";
+  format = "other";
+
+  src = fetchurl {
+    url = "https://github.com/PySide/PySide/archive/${version}.tar.gz";
+    sha256 = "90f2d736e2192ac69e5a2ac798fce2b5f7bf179269daa2ec262986d488c3b0f7";
+  };
+
+  outputs = [ "out" "dev" ];
+
+  preConfigure = ''
+    cmakeFlagsArray=("-DCMAKE_INSTALL_PREFIX=$dev")
+  '';
+
+  nativeBuildInputs = [ cmake pysideGeneratorrunner pysideShiboken qt4 ];
+
+  buildInputs = [ mesa libGL ];
+
+  makeFlags = [ "QT_PLUGIN_PATH=${pysideShiboken}/lib/generatorrunner" ];
+
+  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..532ee6b2b24e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyside/generatorrunner.nix
@@ -0,0 +1,32 @@
+{ lib, stdenv, fetchurl, 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 ]);
+  pname = "pyside-generatorrunner";
+  version = "0.6.16";
+in stdenv.mkDerivation {
+  name = "${pname}-${version}";
+
+  src = fetchurl {
+    url = "https://github.com/PySide/Generatorrunner/archive/0.6.16.tar.gz";
+    sha256 = "0vzk3cp0pfbhd921r8f1xkcz96znla39dhj074k623x9k26lj2sj";
+  };
+
+  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..2690422932f2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyside/shiboken.nix
@@ -0,0 +1,59 @@
+{ lib, fetchFromGitHub, buildPythonPackage
+, cmake
+, isPy35
+, isPy36
+, isPy37
+, isPy3k
+, libxml2
+, libxslt
+, pkg-config
+, pysideApiextractor
+, pysideGeneratorrunner
+, python
+, qt4
+, sphinx
+}:
+
+buildPythonPackage rec {
+  pname = "pyside-shiboken";
+  version = "1.2.4";
+  format = "other";
+  disabled = !isPy3k;
+
+  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/
+  '';
+
+  # gcc6 patch was also sent upstream: https://github.com/pyside/Shiboken/pull/86
+  patches = [ ./gcc6.patch ] ++ (lib.optional (isPy35 || isPy36 || isPy37) ./shiboken_py35.patch);
+
+  cmakeFlags = lib.optionals isPy3k [
+    "-DUSE_PYTHON3=TRUE"
+    "-DPYTHON3_INCLUDE_DIR=${lib.getDev python}/include/${python.libPrefix}"
+    "-DPYTHON3_LIBRARY=${lib.getLib python}/lib"
+  ];
+
+  meta = {
+    description = "Plugin (front-end) for pyside-generatorrunner, that generates bindings for C++ libraries using CPython source code";
+    license = lib.licenses.gpl2;
+    homepage = "http://www.pyside.org/docs/shiboken/";
+    maintainers = [ ];
+    platforms = lib.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..095a10c1047d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyside2-tools/default.nix
@@ -0,0 +1,50 @@
+{ buildPythonPackage, wrapPython, python, fetchurl, 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"
+  ];
+
+  # 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..6986c8e5384b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyside2/default.nix
@@ -0,0 +1,39 @@
+{ buildPythonPackage, python, fetchurl, lib, stdenv,
+  cmake, ninja, qt5, shiboken2 }:
+
+stdenv.mkDerivation rec {
+  pname = "pyside2";
+  version = "5.15.2";
+
+  src = fetchurl {
+    url = "https://download.qt.io/official_releases/QtForPython/pyside2/PySide2-${version}-src/pyside-setup-opensource-src-${version}.tar.xz";
+    sha256 = "060ljj1nzyp4zfz2vasbv2i7gs5rfkkjwxxbisd0fdw01d5m01mk";
+  };
+
+  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
+  ];
+  propagatedBuildInputs = [ shiboken2 ];
+
+  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/pysigset/default.nix b/nixpkgs/pkgs/development/python-modules/pysigset/default.nix
new file mode 100644
index 000000000000..8e31735db2e4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysigset/default.nix
@@ -0,0 +1,18 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "pysigset";
+  version = "0.3.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0ym44z3nwp8chfi7snmknkqnl2q9bghzv9p923r8w748i5hvyxx8";
+  };
+
+  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/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/pyslurm/default.nix b/nixpkgs/pkgs/development/python-modules/pyslurm/default.nix
new file mode 100644
index 000000000000..a113314aa403
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyslurm/default.nix
@@ -0,0 +1,27 @@
+{ lib, fetchFromGitHub, fetchpatch, buildPythonPackage, cython, slurm }:
+
+buildPythonPackage rec {
+  pname = "pyslurm";
+  version = "19-05-0";
+
+  src = fetchFromGitHub {
+    repo = "pyslurm";
+    owner = "PySlurm";
+    rev = version;
+    sha256 = "1lfb4q81y96syz5an1lzscfcvmfvlkf4cfl3i5zllw9r3gbarl2r";
+  };
+
+  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 ];
+    broken = true;  # still needs slurm-19.05, but nixpkgs has slurm-20+ now
+  };
+}
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..1382dc7efffa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysmb/default.nix
@@ -0,0 +1,38 @@
+{ buildPythonPackage
+, fetchPypi
+, lib
+
+# pythonPackages
+, pyasn1
+}:
+
+buildPythonPackage rec {
+  pname = "pysmb";
+  version = "1.2.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    format = "setuptools";
+    extension = "zip";
+    sha256 = "f16e5e796b9dcc1d17ee76f87d53dd471f205fa19b4045eeda5bc7558a57d579";
+  };
+
+  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 = {
+    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 = lib.licenses.zlib;
+    maintainers = with lib.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..6834a78f4286
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysmbc/default.nix
@@ -0,0 +1,23 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi
+, samba, pkg-config
+, setuptools }:
+
+buildPythonPackage rec {
+  version = "1.0.21";
+  pname = "pysmbc";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "tar.bz2";
+    sha256 = "14b75f358ical7zzqh3g1qkh2dxwxn2gz7sah5f5svndqkd3z8jy";
+  };
+
+  nativeBuildInputs = [ pkg-config ];
+  buildInputs = [ setuptools samba ];
+
+  meta = with lib; {
+    description = "libsmbclient binding for Python";
+    homepage = "https://github.com/hamano/pysmbc";
+    license = licenses.gpl2Plus;
+  };
+}
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..02559510100c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysmf/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, pkg-config, libsmf, glib, pytest }:
+
+buildPythonPackage rec {
+  pname = "pysmf";
+  version = "0.1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "10i7vvvdx6c3gl4afsgnpdanwgzzag087zs0fxvfipnqknazj806";
+  };
+
+  nativeBuildInputs = [ pkg-config pytest ];
+  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 = [ maintainers.gnidorah ];
+  };
+}
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..953581aa3029
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysmi/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv
+, 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/pysnmp/default.nix b/nixpkgs/pkgs/development/python-modules/pysnmp/default.nix
new file mode 100644
index 000000000000..7dce4d9b4d18
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysnmp/default.nix
@@ -0,0 +1,31 @@
+{ lib, stdenv
+, 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/pysnooper/default.nix b/nixpkgs/pkgs/development/python-modules/pysnooper/default.nix
new file mode 100644
index 000000000000..61e1de20acf9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysnooper/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest
+, isPy27
+}:
+
+buildPythonPackage rec {
+  version = "0.4.1";
+  pname = "pysnooper";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "PySnooper";
+    sha256 = "1xngly13x3ylwwcdml2ns8skpxip2myzavp3b9ff2dpqaalf0hdl";
+  };
+
+  # test dependency python-toolbox fails with py27
+  doCheck = !isPy27;
+
+  checkInputs = [
+    pytest
+  ];
+
+  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..d8d6b4f4401b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysnow/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchFromGitHub
+, poetry
+, brotli
+, ijson
+, nose
+, httpretty
+, requests_oauthlib
+, python_magic
+, pytz
+}:
+
+buildPythonPackage rec {
+  pname = "pysnow";
+  version = "0.7.16";
+
+  # tests not included in pypi tarball
+  src = fetchFromGitHub {
+    owner = "rbw";
+    repo = pname;
+    rev = version;
+    sha256 = "0dj90w742klfcjnx7yhp0nzki2mzafqzzr0rk2dp6vxn8h58z8ww";
+  };
+  format = "pyproject";
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'ijson = "^2.5.1"' 'ijson = "*"' \
+      --replace 'pytz = "^2019.3"' 'pytz = "*"' \
+      --replace 'oauthlib = "^3.1.0"' 'oauthlib = "*"'
+  '';
+
+  nativeBuildInputs = [ poetry ];
+  propagatedBuildInputs = [
+    brotli
+    ijson
+    python_magic
+    pytz
+    requests_oauthlib
+  ];
+
+  checkInputs = [ nose httpretty ];
+  checkPhase = ''
+    nosetests --cover-package=pysnow --with-coverage --cover-erase
+  '';
+  pythonImportsCheck = [ "pysnow" ];
+
+  meta = with lib; {
+    description = "ServiceNow HTTP client library written in Python";
+    homepage = "https://github.com/rbw/pysnow";
+    license = licenses.mit;
+    maintainers = [ 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..79c163726b76
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysocks/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv
+, 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/pysolr/default.nix b/nixpkgs/pkgs/development/python-modules/pysolr/default.nix
new file mode 100644
index 000000000000..bf56d7ca56e6
--- /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..893736ff1603
--- /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.10";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1q8afi6m3mfh0rfpghyvx6z76kgrpkbnlqzbs4p8ax13n0fnlkdi";
+  };
+
+  # 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..4a0fb1413bbe
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysonos/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+, xmltodict
+, requests
+, ifaddr
+
+# Test dependencies
+, pytest, pylint, flake8, graphviz
+, mock, sphinx, sphinx_rtd_theme
+}:
+
+buildPythonPackage rec {
+  pname = "pysonos";
+  version = "0.0.37";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "43a046c1c6086500fb0f4be1094ca963f5b0f555a04b692832b2b88ab741824e";
+  };
+
+  propagatedBuildInputs = [ xmltodict requests ifaddr ];
+
+  checkInputs = [
+    pytest pylint flake8 graphviz
+    mock sphinx sphinx_rtd_theme
+  ];
+
+  checkPhase = ''
+    pytest --deselect=tests/test_discovery.py::TestDiscover::test_discover
+  '';
+
+  meta = {
+    homepage = "https://github.com/amelchio/pysonos";
+    description = "A SoCo fork with fixes for Home Assistant";
+    license = lib.licenses.mit;
+    maintainers = with lib.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..342755131a3d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyspark/default.nix
@@ -0,0 +1,30 @@
+{ buildPythonPackage, fetchPypi, lib, stdenv, py4j }:
+
+buildPythonPackage rec {
+  pname = "pyspark";
+  version = "3.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "38b485d3634a86c9a2923c39c8f08f003fdd0e0a3d7f07114b2fb4392ce60479";
+  };
+
+  # 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 'py4j>=0.10.9,<0.11'
+  '';
+
+  propagatedBuildInputs = [ py4j ];
+
+  # Tests assume running spark...
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Apache Spark";
+    homepage = "https://github.com/apache/spark/tree/master/python";
+    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..fda5ad596088
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysparse/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, numpy
+, setuptools
+, 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/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..53fb7e6d248f
--- /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.4.3";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0mnyy8nr06d1al99kniyqcm0p9a8dvkg719s42sajl8yf51sayc9";
+  };
+
+  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..dcd35132c2ed
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyspinel/default.nix
@@ -0,0 +1,32 @@
+{ lib, buildPythonPackage, fetchFromGitHub, isPy27
+, future, pyserial, ipaddress
+}:
+
+buildPythonPackage rec {
+  pname = "pyspinel";
+  version = "unstable-2020-06-19";  # no versioned release since 2018
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "openthread";
+    repo = pname;
+    rev = "e0bb3f8e6f49b593ab248a75de04a71626ae8101";
+    sha256 = "0nfmdkgbhmkl82dfxjpwiiarxngm6a3fvdrzpaqp60a4b17pipqg";
+  };
+
+  propagatedBuildInputs = [
+    future
+    ipaddress
+    pyserial
+  ];
+
+  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/pyspotify/default.nix b/nixpkgs/pkgs/development/python-modules/pyspotify/default.nix
new file mode 100644
index 000000000000..302eb12de5a1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyspotify/default.nix
@@ -0,0 +1,44 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchurl
+, cffi
+, pkgs
+}:
+
+buildPythonPackage rec {
+  pname = "pyspotify";
+  version = "2.1.3";
+
+  src = fetchurl {
+    url = "https://github.com/mopidy/pyspotify/archive/v${version}.tar.gz";
+    sha256 = "1y1zqkqi9jz5m9bb2z7wmax7g40c1snm3c6di6b63726qrf26rb7";
+  };
+
+  propagatedBuildInputs = [ cffi ];
+  buildInputs = [ pkgs.libspotify ];
+
+  # python zip complains about old timestamps
+  preConfigure = ''
+    find -print0 | xargs -0 touch
+  '';
+
+  postInstall = lib.optionalString stdenv.isDarwin ''
+    find "$out" -name _spotify.so -exec \
+        install_name_tool -change \
+        @loader_path/../Frameworks/libspotify.framework/libspotify \
+        ${pkgs.libspotify}/lib/libspotify.dylib \
+        {} \;
+  '';
+
+  # There are no tests
+  doCheck = false;
+
+  meta = with lib; {
+    homepage    = "http://pyspotify.mopidy.com";
+    description = "A Python interface to Spotify’s online music streaming service";
+    license     = licenses.unfree;
+    maintainers = with maintainers; [ lovek323 ];
+    platforms   = platforms.unix;
+  };
+
+}
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..478595c1bfc5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysptk/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage, fetchPypi
+, numpy, scipy, cython, six, decorator
+}:
+
+buildPythonPackage rec {
+  pname = "pysptk";
+  version = "0.1.18";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "34c5ccc40c9e177cfd764daa9f7635c4c1e648e14ce78ba975537dae5a14c4e4";
+  };
+
+  PYSPTK_BUILD_VERSION = 0;
+
+  nativeBuildInputs = [
+    cython
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    scipy
+    six
+    decorator
+  ];
+
+  # No tests in the PyPI tarball
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A python wrapper for Speech Signal Processing Toolkit (SPTK)";
+    homepage = "https://pysptk.readthedocs.io/en/latest/";
+    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..ab3f949cf1ed
--- /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.3";
+
+  disabled = pythonAtLeast "3.9";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0c54m18h52llwkfc9zaag3qkmfzzp5a1w9jzsm5hd2nfdsxmnkk9";
+  };
+
+  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/pysqlite/default.nix b/nixpkgs/pkgs/development/python-modules/pysqlite/default.nix
new file mode 100644
index 000000000000..09cc312223ad
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysqlite/default.nix
@@ -0,0 +1,57 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+, pkgs
+}:
+
+buildPythonPackage rec {
+  pname = "pysqlite";
+  version = "2.8.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "17d3335863e8cf8392eea71add33dab3f96d060666fe68ab7382469d307f4490";
+  };
+
+  # Need to use the builtin sqlite3 on Python 3
+  disabled = isPy3k;
+
+  # Since the `.egg' file is zipped, the `NEEDED' of the `.so' files
+  # it contains is not taken into account.  Thus, we must explicitly make
+  # it a propagated input.
+  propagatedBuildInputs = [ pkgs.sqlite ];
+
+  patchPhase = ''
+    substituteInPlace "setup.cfg"                                     \
+            --replace "/usr/local/include" "${pkgs.sqlite.dev}/include"   \
+            --replace "/usr/local/lib" "${pkgs.sqlite.out}/lib"
+    ${lib.optionalString (!stdenv.isDarwin) ''export LDSHARED="$CC -pthread -shared"''}
+  '';
+
+  meta = with lib; {
+    homepage = "https://pysqlite.org/";
+    description = "Python bindings for the SQLite embedded relational database engine";
+    longDescription = ''
+      pysqlite is a DB-API 2.0-compliant database interface for SQLite.
+
+      SQLite is a relational database management system contained in
+      a relatively small C library.  It is a public domain project
+      created by D. Richard Hipp.  Unlike the usual client-server
+      paradigm, the SQLite engine is not a standalone process with
+      which the program communicates, but is linked in and thus
+      becomes an integral part of the program.  The library
+      implements most of SQL-92 standard, including transactions,
+      triggers and most of complex queries.
+
+      pysqlite makes this powerful embedded SQL engine available to
+      Python programmers.  It stays compatible with the Python
+      database API specification 2.0 as much as possible, but also
+      exposes most of SQLite's native API, so that it is for example
+      possible to create user-defined SQL functions and aggregates
+      in Python.
+    '';
+    license = licenses.bsd3;
+  };
+
+}
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..7c5d8ca5abf5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysqueezebox/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv, fetchPypi, buildPythonPackage, pythonOlder, aiohttp }:
+
+buildPythonPackage rec {
+  pname = "pysqueezebox";
+  version = "0.5.5";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "93e6a3824b560d4ea2b2e5f0a67fdf3b309b6194fbf9927e44fc0d12c7fdc6c0";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  # No tests in the Pypi distribution
+  doCheck = false;
+  pythonImportsCheck = [ "pysqueezebox" ];
+
+  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..b8570427d303
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysrim/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, pytestrunner
+, numpy
+, pyyaml
+}:
+
+buildPythonPackage rec {
+  pname = "pysrim";
+  version = "0.5.10";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ada088f73f7e1a3bf085206e81e0f83ed89c1d0b23a789ecd0ba0a250724aee8";
+  };
+
+  buildInputs = [ pytestrunner ];
+  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..4012a7324660
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysrt/default.nix
@@ -0,0 +1,31 @@
+{ lib, stdenv
+, 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..4f73ada61af6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyssim/default.nix
@@ -0,0 +1,32 @@
+{ lib, stdenv, 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..6ed036aecb1a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pystache/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv, buildPythonPackage, python, fetchPypi, isPy3k, glibcLocales }:
+
+buildPythonPackage rec {
+  pname = "pystache";
+  version = "0.5.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f7bbc265fb957b4d6c7c042b336563179444ab313fb93a719759111eabd3b85a";
+  };
+
+  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..691865919490
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pystemd/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv, python, systemd }:
+
+python.pkgs.buildPythonPackage rec {
+  pname = "pystemd";
+  version = "0.8.0";
+  src = python.pkgs.fetchPypi {
+    inherit pname version;
+    sha256 = "0wlrid2xd73dmzl4m0jgg6cqmkx3qs9v9nikvwxd8a5b8chf9hna";
+  };
+
+  disabled = python.pythonOlder "3.4";
+
+  buildInputs = [ systemd ];
+
+  checkInputs = with python.pkgs; [ pytest mock ];
+  checkPhase = "pytest tests";
+
+  meta = with lib; {
+    description = "A 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..0ba23ffec5df
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pystemmer/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv, 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..6b4bdb59f1ef
--- /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.16.0";
+
+  src = fetchFromGitHub {
+    owner = "moses-palmer";
+    repo = "pystray";
+    rev = "v${version}";
+    sha256 = "0q5yqfm5mzffx9vnp9xcnclgjzgs0b7f50i9xmxn1m1iha1zawh1";
+  };
+
+  propagatedBuildInputs = [ pillow xlib six ];
+  nativeBuildInputs = [ sphinx ];
+  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 = licenses.lgpl3;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ jojosch ];
+  };
+}
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..9e9948607093
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysvn/default.nix
@@ -0,0 +1,83 @@
+{ 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 = "http://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;
+  };
+}
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/pytabix/default.nix b/nixpkgs/pkgs/development/python-modules/pytabix/default.nix
new file mode 100644
index 000000000000..db8437d8957c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytabix/default.nix
@@ -0,0 +1,32 @@
+{ lib, stdenv
+, 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..636210c93d59
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytado/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub }:
+
+buildPythonPackage rec {
+  pname = "PyTado";
+  version = "0.2.7";
+
+  src = fetchFromGitHub {
+    owner = "wmalgadey";
+    repo = pname;
+    # Upstream hasn't tagged this release yet. This commit fixes the build.
+    rev = "79a5dfdf75cd9a3e1a1ee8a8ff0d08923aebda7b";
+    sha256 = "14xdfw4913g4j4h576hjbigm7fiw8k0dc8s98gh2ag9xrc2ifgr0";
+  };
+
+  meta = with lib; {
+    description = "Python binding for Tado web API. Pythonize your central heating!";
+    homepage = "https://github.com/wmalgadey/PyTado";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ elseym ];
+  };
+}
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..9155151950a8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytaglib/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, taglib
+, cython
+, pytest
+, glibcLocales
+, fetchpatch
+}:
+
+buildPythonPackage rec {
+  pname   = "pytaglib";
+  version = "1.4.5";
+
+  src = fetchFromGitHub {
+    owner = "supermihi";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1gvvadlgk8ny8bg76gwvvfcwp1nfgrjphi60h5f9ha7h5ff1g2wb";
+  };
+
+  patches = [
+    # fix tests on python 2.7
+    (fetchpatch {
+      url = "https://github.com/supermihi/pytaglib/commit/0c4ae750fcd5b18d2553975c7e3e183e9dca5bf1.patch";
+      sha256 = "1kv3c68vimx5dc8aacvzphiaq916avmprxddi38wji8p2ql6vngj";
+    })
+
+    # properly install pyprinttags
+    (fetchpatch {
+      url = "https://github.com/supermihi/pytaglib/commit/ba7a1406ddf35ddc41ed57f1c8d1f2bc2ed2c93a.patch";
+      sha256 = "0pi0dcq7db5fd3jnbwnfsfsgxvlhnm07z5yhpp93shk0s7ci2bwp";
+    })
+    (fetchpatch {
+      url = "https://github.com/supermihi/pytaglib/commit/28772f6f94d37f05728071381a0fa04c6a14783a.patch";
+      sha256 = "0h259vzj1l0gpibdf322yclyd10x5rh1anzhsjj2ghm6rj6q0r0m";
+    })
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py --replace "'pytest-runner', " ""
+  '';
+
+  buildInputs = [ taglib cython ];
+
+  checkInputs = [ pytest glibcLocales ];
+
+  checkPhase = ''
+    LC_ALL=en_US.utf-8 pytest .
+  '';
+
+  meta = {
+    homepage = "https://github.com/supermihi/pytaglib";
+    description = "Python 2.x/3.x bindings for the Taglib audio metadata library";
+    license = lib.licenses.gpl3;
+    maintainers = [ lib.maintainers.mrkkrp ];
+  };
+}
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..65d3d9218d06
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyte/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, pytest, pytestrunner, wcwidth }:
+
+buildPythonPackage rec {
+  pname = "pyte";
+  version = "0.8.0";
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "7e71d03e972d6f262cbe8704ff70039855f05ee6f7ad9d7129df9c977b5a88c5";
+  };
+
+  propagatedBuildInputs = [ wcwidth ];
+
+  checkInputs = [ pytest pytestrunner ];
+
+  # tries to write to os.path.dirname(__file__) in test_input_output
+  checkPhase = ''
+    py.test -k "not test_input_output"
+  '';
+
+  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/pytesseract/default.nix b/nixpkgs/pkgs/development/python-modules/pytesseract/default.nix
new file mode 100644
index 000000000000..ac3bf6dbf5be
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytesseract/default.nix
@@ -0,0 +1,31 @@
+{ buildPythonPackage, fetchPypi, lib, pillow, tesseract, substituteAll }:
+
+buildPythonPackage rec {
+  pname = "pytesseract";
+  version = "0.3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b79641b7915ff039da22d5591cb2f5ca6cb0ed7c65194c9c750360dc6a1cc87f";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./tesseract-binary.patch;
+      drv = tesseract;
+    })
+  ];
+
+  buildInputs = [ tesseract ];
+  propagatedBuildInputs = [ pillow ];
+
+  # the package doesn't have any tests.
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://pypi.org/project/pytesseract/";
+    license = licenses.asl20;
+    description = "A Python wrapper for Google Tesseract";
+    maintainers = with maintainers; [ ma27 ];
+  };
+}
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..27b042bbaa52
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytesseract/tesseract-binary.patch
@@ -0,0 +1,13 @@
+diff --git a/src/pytesseract.py b/src/pytesseract.py
+index 132f59b..f161e5c 100755
+--- a/src/pytesseract.py
++++ b/src/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-aiohttp/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-aiohttp/default.nix
new file mode 100644
index 000000000000..7384eb360704
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-aiohttp/default.nix
@@ -0,0 +1,23 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, pytest, aiohttp }:
+
+buildPythonPackage rec {
+  pname = "pytest-aiohttp";
+  version = "0.3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0kx4mbs9bflycd8x9af0idcjhdgnzri3nw1qb0vpfyb3751qaaf9";
+  };
+
+  propagatedBuildInputs = [ pytest aiohttp ];
+
+  # There are no tests
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/aio-libs/pytest-aiohttp/";
+    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..1a7f77bf9b6e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-annotate/default.nix
@@ -0,0 +1,39 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, pyannotate
+, pytest
+}:
+
+buildPythonPackage rec {
+  version = "1.0.3";
+  pname = "pytest-annotate";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1ef5924aca93a7b47edaf46a38284fb5a173eed5e3b1a93ec00c8e35f0dd76ab";
+  };
+
+  buildInputs = [
+    pytest
+  ];
+
+  propagatedBuildInputs = [
+    pyannotate
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "pytest>=3.2.0,<4.0.0" "pytest"
+  '';
+
+  # no testing in a testing module...
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/kensho-technologies/pytest-annotate";
+    description = "Generate PyAnnotate annotations from your pytest tests";
+    license = licenses.asl20;
+    maintainers = [ 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..309a33e89073
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-ansible/default.nix
@@ -0,0 +1,42 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, ansible
+, pytest
+, mock
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-ansible";
+  version = "2.1.1";
+
+  src = fetchFromGitHub {
+    owner = "ansible";
+    repo = "pytest-ansible";
+    rev = "v${version}";
+    sha256 = "0v97sqk3q2vkmwnjlnncz8ss8086x9jg3cz0g2nzlngs4ql1gdb0";
+  };
+
+  patchPhase = ''
+    sed -i "s/'setuptools-markdown'//g" setup.py
+  '';
+
+  # requires pandoc < 2.0
+  # buildInputs = [ setuptools-markdown ];
+  checkInputs =  [ mock ];
+  propagatedBuildInputs = [ ansible pytest ];
+
+  # 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 ];
+  };
+}
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..8b1de360f494
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-arraydiff/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, numpy
+, six
+, pytest
+, astropy
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-arraydiff";
+  version = "0.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "de2d62f53ecc107ed754d70d562adfa7573677a263216a7f19aa332f20dc6c15";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+    six
+    pytest
+  ];
+
+  # The tests requires astropy, which itself requires
+  # pytest-arraydiff. This causes an infinite recursion if the tests
+  # are enabled.
+  doCheck = false;
+
+  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 = [ 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..4b40280ed700
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-astropy-header/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, pytest
+, pytestcov
+, 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";
+    })
+  ];
+
+
+  propagatedBuildInputs = [
+    pytest
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    pytestcov
+    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..ae3bc04d0b4c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-astropy/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, hypothesis
+, pytest
+, pytest-astropy-header
+, pytest-doctestplus
+, pytest-filter-subpackage
+, pytest-remotedata
+, pytest-openfiles
+, pytest-arraydiff
+, setuptools_scm
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-astropy";
+  version = "0.8.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "619800eb2cbf64548fbea25268efe7c6f6ae206cb4825f34abd36f27bcf946a2";
+  };
+
+  nativeBuildInputs = [
+    setuptools_scm
+  ];
+
+  propagatedBuildInputs = [
+    hypothesis
+    pytest
+    pytest-astropy-header
+    pytest-doctestplus
+    pytest-filter-subpackage
+    pytest-remotedata
+    pytest-openfiles
+    pytest-arraydiff
+  ];
+
+  # pytest-astropy is a meta package and has no tests
+  checkPhase = ":";
+
+  meta = with lib; {
+    description = "Meta-package containing dependencies for testing";
+    homepage = "https://astropy.org";
+    license = licenses.bsd3;
+    maintainers = [ 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..c621d9a47854
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-asyncio/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, pytest, isPy3k, isPy35, async_generator }:
+buildPythonPackage rec {
+  pname = "pytest-asyncio";
+  version = "0.14.0";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "9882c0c6b24429449f5f969a5158b528f39bde47dc32e85b9f0403965017e700";
+  };
+
+  buildInputs = [ pytest ]
+    ++ lib.optionals isPy35 [ async_generator ];
+
+  # No tests in archive
+  doCheck = false;
+
+  # LICENSE file is not distributed. https://github.com/pytest-dev/pytest-asyncio/issues/92
+  postPatch = ''
+    substituteInPlace setup.cfg --replace "license_file = LICENSE" ""
+  '';
+
+  meta = with lib; {
+    description = "library for testing asyncio code with pytest";
+    license = licenses.asl20;
+    homepage = "https://github.com/pytest-dev/pytest-asyncio";
+  };
+}
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..493a2307e7e7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-bdd/default.nix
@@ -0,0 +1,39 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub
+, execnet
+, glob2
+, Mako
+, mock
+, parse
+, parse-type
+, py
+, pytest
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-bdd";
+  version = "4.0.1";
+
+  # tests are not included in pypi tarball
+  src = fetchFromGitHub {
+    owner = "pytest-dev";
+    repo = pname;
+    rev = version;
+    sha256 = "1yqzz44as4pxffmg4hk9lijvnvlc2chg1maq1fbj5i4k4jpagvjz";
+  };
+
+  propagatedBuildInputs = [ glob2 Mako parse parse-type py pytest six ];
+
+  # Tests require extra dependencies
+  checkInputs = [ execnet mock pytest ];
+  checkPhase = ''
+    PATH=$PATH:$out/bin pytest
+  '';
+
+  meta = with lib; {
+    description = "BDD library for the py.test runner";
+    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..eedbbc274f4f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-benchmark/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytest
+, py-cpuinfo
+, pythonOlder
+, pathlib
+, statistics
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-benchmark";
+  version = "3.2.2";
+
+  src = fetchFromGitHub {
+    owner = "ionelmc";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1hslzzinpwc1zqhbpllqh3sllmiyk69pcycl7ahr0rz3micgwczj";
+  };
+
+  propagatedBuildInputs = [ pytest py-cpuinfo ] ++ lib.optionals (pythonOlder "3.4") [ pathlib statistics ];
+
+  meta = {
+    description = "Py.test fixture for benchmarking code";
+    homepage = "https://github.com/ionelmc/pytest-benchmark";
+    license = lib.licenses.bsd2;
+    maintainers = with lib.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..6f23c00baf36
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-black/default.nix
@@ -0,0 +1,31 @@
+{ 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 ];
+
+  propagatedBuildInputs = [ black pytest 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-catchlog/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-catchlog/default.nix
new file mode 100644
index 000000000000..2fb02244d1d7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-catchlog/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, pytest, unzip }:
+
+buildPythonPackage rec {
+  pname = "pytest-catchlog";
+  version = "1.2.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1w7wxh27sbqwm4jgwrjr9c2gy384aca5jzw9c0wzhl0pmk2mvqab";
+    extension = "zip";
+  };
+
+  buildInputs = [ pytest unzip ];
+  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..034c657b5b0f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-celery/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, pytest, setuptools_scm }:
+
+buildPythonPackage rec {
+  pname = "pytest-celery";
+  version = "0.0.0a1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0qifwi7q8dfwbzz2vm5m40lw23qh2fzibngbmw6qgwnkq8bhh3iy";
+  };
+
+  patches = [ ./no-celery.patch ];
+
+  doCheck = false; # This package has nothing to test or import.
+
+  meta = with lib; {
+    description = "pytest plugin for unittest subTest() support and subtests fixture";
+    homepage = "https://github.com/pytest-dev/pytest-subtests";
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-celery/no-celery.patch b/nixpkgs/pkgs/development/python-modules/pytest-celery/no-celery.patch
new file mode 100644
index 000000000000..65337489883c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-celery/no-celery.patch
@@ -0,0 +1,9 @@
+This plugin is needed to test celery itself, so it can't depend on celery.
+
+--- a/setup.py
++++ b/setup.py
+@@ -6,3 +6,3 @@ from distutils.core import setup
+ install_requires = \
+-['celery >= 4.4.0']
++[]
+ 
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..41f316a18a65
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-check/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, pytest
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-check";
+  version = "0.3.9";
+
+  src = fetchPypi {
+    pname = "pytest_check";
+    inherit version;
+    sha256 = "0asrrz0fgk6wqffsz1ffd6z9xyw314fwh5bwjzcq75w8w1g4ass9";
+  };
+
+  propagatedBuildInputs = [ 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-click/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-click/default.nix
new file mode 100644
index 000000000000..e271373b73ef
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-click/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytest
+, click
+, pytestcov
+, isPy27
+, mock
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-click";
+  version = "0.3";
+
+  src = fetchFromGitHub {
+    owner = "Stranger6667";
+    repo = "pytest-click";
+    rev = version;
+    sha256 = "1cd15anw8d4rq6qs03j6ag38199rqw7vp0w0w0fm41mvdzr0lwvz";
+  };
+
+  postConfigure = ''
+    substituteInPlace setup.py \
+      --replace "mock==1.0.1" "mock"
+  '';
+
+  propagatedBuildInputs = [
+    pytest
+    click
+  ];
+
+  checkInputs = [ pytestcov ] ++ lib.optionals isPy27 [ mock ];
+
+  meta = with lib; {
+    description = "pytest plugin for click";
+    homepage = "https://github.com/Stranger6667/pytest-click";
+    license = licenses.mit;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..aa921ddeb3d1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-cov/default.nix
@@ -0,0 +1,30 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi
+, pytest, coverage }:
+
+buildPythonPackage rec {
+  pname = "pytest-cov";
+  version = "2.10.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "47bd0ce14056fdd79f93e1713f88fad7bdcc583dcd7783da86ef2f085a0bb88e";
+  };
+
+  buildInputs = [ pytest ];
+  propagatedBuildInputs = [ coverage ];
+
+  # 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
+  '';
+
+  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..b1cdb1033a64
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-datadir/default.nix
@@ -0,0 +1,32 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub
+, setuptools_scm, pytest, cmake
+}:
+
+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; [ metadark ];
+  };
+}
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..bc6e2441b0f0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-datafiles/default.nix
@@ -0,0 +1,18 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, py, pytest }:
+
+buildPythonPackage rec {
+  pname = "pytest-datafiles";
+  version = "2.0";
+  src = fetchPypi {
+    inherit version pname;
+    sha256 = "1yfvaqbqvjfikz215kwn6qiwwn9girka93zq4jphgfyvn75jjcql";
+  };
+
+  buildInputs = [ py pytest ];
+
+  meta = with lib; {
+    license = licenses.mit;
+    homepage = "https://github.com/omarkohl/pytest-datafiles";
+    description = "py.test plugin to create a 'tmpdir' containing predefined files/directories.";
+  };
+}
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..9a3dbed55b15
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-dependency/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, fetchpatch, pytest }:
+
+buildPythonPackage rec {
+  version = "0.5.1";
+  pname = "pytest-dependency";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "c2a892906192663f85030a6ab91304e508e546cddfe557d692d61ec57a1d946b";
+  };
+
+  propagatedBuildInputs = [ 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-django/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-django/default.nix
new file mode 100644
index 000000000000..069aa2812eb5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-django/default.nix
@@ -0,0 +1,32 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, pytest
+, django
+, setuptools_scm
+, django-configurations
+, pytest_xdist
+, six
+}:
+buildPythonPackage rec {
+  pname = "pytest-django";
+  version = "4.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "26f02c16d36fd4c8672390deebe3413678d89f30720c16efb8b2a6bf63b9041f";
+  };
+
+  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..c9c373a27525
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-doctestplus/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, six
+, pytest
+, numpy
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-doctestplus";
+  version = "0.8.0";
+  disabled = isPy27; # abandoned upstream
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "fb083925a17ce636f33997c275f61123e63372c1db11fefac1e991ed25a4ca37";
+  };
+
+  propagatedBuildInputs = [
+    six
+    numpy
+    pytest
+  ];
+
+  checkInputs = [
+    pytest
+  ];
+
+  # check_distribution incorrectly pulls pytest version
+  checkPhase = ''
+    pytest -k 'not check_distribution'
+  '';
+
+  meta = with lib; {
+    description = "Pytest plugin with advanced doctest features";
+    homepage = "https://astropy.org";
+    license = licenses.bsd3;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..3e2fb0a05dc7
--- /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; [ earvstedt ];
+  };
+}
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..e63b7329c965
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-factoryboy/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, factory_boy
+, fetchFromGitHub
+, inflection
+, mock
+, pytest
+, pytestcache
+, pytestCheckHook
+, pytestcov
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-factoryboy";
+  version = "2.1.0";
+
+  src = fetchFromGitHub {
+    owner = "pytest-dev";
+    repo = "pytest-factoryboy";
+    rev = version;
+    sha256 = "0v6b4ly0p8nknpnp3f4dbslfsifzzjx2vv27rfylx04kzdhg4m9p";
+  };
+
+  propagatedBuildInputs = [
+    factory_boy
+    inflection
+    pytest
+  ];
+
+  checkInputs = [
+    mock
+    pytestCheckHook
+    pytestcache
+    pytestcov
+  ];
+
+  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..6caf4d9c772e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-filter-subpackage/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest
+, pytestcov
+, 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
+  ];
+
+  propagatedBuildInputs = [
+    pytest
+    pytest-doctestplus
+    pytestcov
+    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..061f62bfc17b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-fixture-config/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv, 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..a5ed447aceac
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-flake8/default.nix
@@ -0,0 +1,28 @@
+{lib, buildPythonPackage, fetchPypi, pytest, flake8}:
+
+buildPythonPackage rec {
+  pname = "pytest-flake8";
+  version = "1.0.6";
+
+  # although pytest is a runtime dependency, do not add it as
+  # propagatedBuildInputs in order to allow packages depend on another version
+  # of pytest more easily
+  checkInputs = [ pytest ];
+  propagatedBuildInputs = [ flake8 ];
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1b82bb58c88eb1db40524018d3fcfd0424575029703b4e2d8e3ee873f2b17027";
+  };
+
+  checkPhase = ''
+    pytest .
+  '';
+
+  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;
+  };
+}
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..fd4ed0978060
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-flakes/default.nix
@@ -0,0 +1,34 @@
+{ lib, stdenv, 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.3";
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "bf070c5485dad82d5b5f5d0eb08d269737e378492d9a68f5223b0a90924c7754";
+  };
+
+  checkInputs = [ pytest ];
+  propagatedBuildInputs = [ pytest pyflakes ];
+
+  # 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..74e33a7731b3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-flask/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, pytest, flask, werkzeug, setuptools_scm, isPy27 }:
+
+buildPythonPackage rec {
+  pname = "pytest-flask";
+  version = "1.1.0";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "9c136afd6d0fb045b0b8fd2363421b6670bfebd21d9141f79669d9051c9d2d05";
+  };
+
+  doCheck = false;
+
+  propagatedBuildInputs = [
+    pytest
+    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..89200f519e76
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-forked/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools_scm
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-forked";
+  version = "1.3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "6aa9ac7e00ad1a539c41bec6d21011332de671e938c7637378ec9710204e37ca";
+  };
+
+  buildInputs = [ pytest setuptools_scm ];
+
+  # Do not function
+  doCheck = false;
+
+  checkPhase = ''
+    py.test testing
+  '';
+
+  meta = {
+    description = "Run tests in isolated forked subprocesses";
+    homepage = "https://github.com/pytest-dev/pytest-forked";
+    license = lib.licenses.mit;
+  };
+
+}
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..424d8fde2326
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-freezegun/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, freezegun
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-freezegun";
+  version = "0.4.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "19c82d5633751bf3ec92caa481fb5cffaac1787bd485f0df6436fd6242176949";
+  };
+
+  propagatedBuildInputs = [
+    freezegun
+    pytest
+  ];
+
+  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..41263ce692b3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-helpers-namespace/default.nix
@@ -0,0 +1,35 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, pytest
+, lib, stdenv
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-helpers-namespace";
+  version = "2019.1.8";
+
+  src = fetchFromGitHub {
+    owner = "saltstack";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0z9f25d2wpf3lnqzmmnrlvl5b1f7kqwjjf4nzs9x2bpf91s5zny1";
+  };
+
+  buildInputs = [ pytest ];
+
+  checkInputs = [ pytest ];
+
+  checkPhase = ''
+    pytest
+  '';
+
+  # The tests fail with newest pytest. They passed with pytest_3, which no longer exists
+  doCheck = false;
+
+  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..0b1090f7b81d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-html/default.nix
@@ -0,0 +1,23 @@
+{ lib, stdenv, 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 ];
+  propagatedBuildInputs = [ pytest 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..836da1e157ff
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-httpbin/default.nix
@@ -0,0 +1,35 @@
+{ buildPythonPackage
+, lib
+, fetchPypi
+, pytest
+, httpbin
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-httpbin";
+  version = "1.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0wlvw5qgkax7f0i5ks1562s37h2hdmn5yxnp1rajcc2289zm9knq";
+  };
+
+  checkInputs = [ pytest ];
+
+  propagatedBuildInputs = [ httpbin six ];
+
+  checkPhase = ''
+    py.test
+  '';
+
+  # https://github.com/kevin1024/pytest-httpbin/pull/51
+  doCheck = false;
+
+  meta = {
+    description = "Easily test your HTTP library against a local copy of httpbin.org";
+    homepage = "https://github.com/kevin1024/pytest-httpbin";
+    license = lib.licenses.mit;
+  };
+}
+
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..fb65f8aceadb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-isort/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, fetchPypi, isPy27, mock, pytest, isort }:
+
+buildPythonPackage rec {
+  pname = "pytest-isort";
+  version = "1.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f0fcf9674f3a627b36e07466d335e82b0f7c4f9e0f7ec39f2a1750b0189d5371";
+  };
+
+  propagatedBuildInputs = [ isort ];
+
+  checkInputs = [ pytest ]
+    ++ lib.optionals isPy27 [ mock ];
+
+  checkPhase = ''
+    py.test -vs --cache-clear
+  '';
+
+  meta = with lib; {
+    description = "Pytest plugin to perform isort checks (import ordering)";
+    homepage = "https://github.com/moccu/pytest-isort/";
+    license = licenses.bsd3;
+  };
+}
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..577400b859eb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-localserver/default.nix
@@ -0,0 +1,29 @@
+{ buildPythonPackage
+, lib
+, fetchPypi
+, werkzeug
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-localserver";
+  version = "0.5.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "3a5427909d1dfda10772c1bae4b9803679c0a8f04adb66c338ac607773bfefc2";
+  };
+
+  propagatedBuildInputs = [ 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://pypi.python.org/pypi/pytest-localserver";
+    license = licenses.mit;
+    maintainers = with maintainers; [ siriobalmelli ];
+  };
+}
+
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..e8b224dc1d4d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-metadata/default.nix
@@ -0,0 +1,22 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi
+, pytest, setuptools_scm }:
+
+buildPythonPackage rec {
+  pname = "pytest-metadata";
+  version = "1.11.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "71b506d49d34e539cc3cfdb7ce2c5f072bea5c953320002c95968e0238f8ecf1";
+  };
+
+  nativeBuildInputs = [ setuptools_scm ];
+  propagatedBuildInputs = [ 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/2.nix b/nixpkgs/pkgs/development/python-modules/pytest-mock/2.nix
new file mode 100644
index 000000000000..3764a05af057
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-mock/2.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, isPy3k
+, pytest
+, mock
+, setuptools_scm
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-mock";
+  version = "2.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b35eb281e93aafed138db25c8772b95d3756108b601947f89af503f8c629413f";
+  };
+
+  propagatedBuildInputs = lib.optional (!isPy3k) mock;
+
+  nativeBuildInputs = [
+   setuptools_scm
+  ];
+
+  checkInputs = [
+    pytest
+  ];
+
+  checkPhase = ''
+    pytest
+  '';
+
+  meta = with lib; {
+    description = "Thin-wrapper around the mock package for easier use with py.test.";
+    homepage    = "https://github.com/pytest-dev/pytest-mock";
+    license     = licenses.mit;
+    maintainers = with maintainers; [ nand0p ];
+  };
+}
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..ad82b389bee8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-mock/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, isPy3k
+, pytest
+, mock
+, setuptools_scm
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-mock";
+  version = "3.3.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a4d6d37329e4a893e77d9ffa89e838dd2b45d5dc099984cf03c703ac8411bb82";
+  };
+
+  propagatedBuildInputs = lib.optional (!isPy3k) mock;
+
+  nativeBuildInputs = [
+   setuptools_scm
+  ];
+
+  checkInputs = [
+    pytest
+  ];
+
+  # ignore test which only works with pytest5 output structure
+  checkPhase = ''
+    pytest -k 'not detailed_introspection_async'
+  '';
+
+  meta = with lib; {
+    description = "Thin-wrapper around the mock package for easier use with py.test.";
+    homepage    = "https://github.com/pytest-dev/pytest-mock";
+    license     = licenses.mit;
+    maintainers = with maintainers; [ nand0p ];
+  };
+}
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..0cc3a993c235
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-mpl/default.nix
@@ -0,0 +1,53 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, pytest
+, matplotlib
+, nose
+, pillow
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-mpl";
+  version = "0.12";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "4a223909e5148c99bd18891848c7871457729322c752c9c470bd8dd6bdf9f940";
+  };
+
+  buildInputs = [
+    pytest
+  ];
+
+  propagatedBuildInputs = [
+    matplotlib
+    nose
+    pillow
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  # Broken since b6e98f18950c2b5dbdc725c1181df2ad1be19fee
+  disabledTests = [
+    "test_hash_fails"
+    "test_hash_missing"
+  ];
+
+  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/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-mypy/default.nix
new file mode 100644
index 000000000000..9062284d5dfd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-mypy/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, filelock
+, pytest
+, mypy
+, setuptools_scm
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-mypy";
+  version = "0.8.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "63d418a4fea7d598ac40b659723c00804d16a251d90a5cfbca213eeba5aaf01c";
+  };
+
+  nativeBuildInputs = [ setuptools_scm ];
+
+  propagatedBuildInputs = [ pytest 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..bb7bdf03d00d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-openfiles/default.nix
@@ -0,0 +1,36 @@
+{ 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 ];
+
+  propagatedBuildInputs = [
+    pytest
+    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-ordering/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-ordering/default.nix
new file mode 100644
index 000000000000..6cd1ed227976
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-ordering/default.nix
@@ -0,0 +1,31 @@
+{ 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;
+    maintainers = with maintainers; [ eadwu ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-pep257/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-pep257/default.nix
new file mode 100644
index 000000000000..eb5203c02466
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-pep257/default.nix
@@ -0,0 +1,20 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, pytest, pep257 }:
+
+buildPythonPackage rec {
+  pname = "pytest-pep257";
+  version = "0.0.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "082v3d5k4331x53za51kl8zxsndsw1pcyf1xdfpb2gjdjrhixb8w";
+  };
+
+  buildInputs = [ pytest ];
+  propagatedBuildInputs = [ pep257 ];
+
+  meta = with lib; {
+    homepage = "https://github.com/anderslime/pytest-pep257";
+    description = "py.test plugin for PEP257";
+    license = licenses.mit;
+  };
+}
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..e35d2ebc73e9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-pylint/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, pytest
+, pylint
+, six
+, pytestrunner
+, toml
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-pylint";
+  version = "0.18.0";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "790c7a8019fab08e59bd3812db1657a01995a975af8b1c6ce95b9aa39d61da27";
+  };
+
+  nativeBuildInputs = [ pytestrunner ];
+
+  propagatedBuildInputs = [
+    pytest
+    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-pythonpath/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-pythonpath/default.nix
new file mode 100644
index 000000000000..4194b7bd0e94
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-pythonpath/default.nix
@@ -0,0 +1,26 @@
+{ buildPythonPackage, fetchPypi, lib, pytest }:
+
+buildPythonPackage rec {
+  pname = "pytest-pythonpath";
+  version = "0.7.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0qhxh0z2b3p52v3i0za9mrmjnb1nlvvyi2g23rf88b3xrrm59z33";
+  };
+
+  propagatedBuildInputs = [ pytest ];
+  checkInputs = [ pytest ];
+
+  checkPhase = ''
+    pytest
+  '';
+
+  meta = with lib; {
+    description =
+      "Pytest plugin for adding to the PYTHONPATH from command line or configs";
+    homepage = "https://github.com/bigsassy/pytest-pythonpath";
+    maintainers = with maintainers; [ cript0nauta ];
+    license = licenses.mit;
+  };
+}
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..201da93b0187
--- /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 = "3.3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "714b0bf86c5313413f2d300ac613515db3a1aef595051ab8ba2ffe619dbe8925";
+  };
+
+  nativeBuildInputs = [
+    setuptools_scm
+  ];
+
+  propagatedBuildInputs = [
+    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..5148fa4b7608
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-quickcheck/default.nix
@@ -0,0 +1,20 @@
+{ lib, stdenv, 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";
+    broken = true; # missing pytest-codestyle
+  };
+}
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..0d02a25ec3c7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-raisesregexp/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv, 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-random-order/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-random-order/default.nix
new file mode 100644
index 000000000000..2def886c5cba
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-random-order/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv
+, 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";
+
+  propagatedBuildInputs = [ 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..be8d675fc1ea
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-randomly/default.nix
@@ -0,0 +1,31 @@
+{ lib, buildPythonPackage, fetchPypi, isPy27
+, factory_boy, faker, numpy
+, pytest, pytest_xdist
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-randomly";
+  version = "3.5.0";
+
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "440cec143fd9b0adeb072006c71e0294402a2bc2ccd08079c2341087ba4cf2d1";
+  };
+
+  propagatedBuildInputs = [ numpy factory_boy faker ];
+
+  checkInputs = [ pytest pytest_xdist ];
+
+  # test warnings are fixed on an unreleased version:
+  # https://github.com/pytest-dev/pytest-randomly/pull/281
+  checkPhase = "pytest -p no: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.bsd3;
+    maintainers = [ maintainers.sternenseemann ];
+  };
+}
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..401307039e55
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-relaxed/default.nix
@@ -0,0 +1,40 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, pytest
+, six
+, decorator
+}:
+
+buildPythonPackage rec {
+  version = "1.1.5";
+  pname = "pytest-relaxed";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "e39a7e5b14e14dfff0de0ad720dfffa740c128d599ab14cfac13f4deb34164a6";
+  };
+
+  buildInputs = [ pytest ];
+  checkInputs = [ pytest ];
+
+  propagatedBuildInputs = [ six decorator ];
+
+  patchPhase = ''
+    sed -i "s/pytest>=3,<5/pytest/g" setup.py
+  '';
+
+  # skip tests due to dir requirements
+  doCheck = false;
+
+  checkPhase = ''
+    pytest tests
+  '';
+
+  meta = with lib; {
+    homepage = "https://pytest-relaxed.readthedocs.io/";
+    description = "Relaxed test discovery/organization for pytest";
+    license = licenses.bsd0;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..94bc02159bf4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-remotedata/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, six
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-remotedata";
+  version = "0.3.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "e20c58d4b7c359c4975dc3c3d3d67be0905180d2368be0be3ae09b15a136cfc0";
+  };
+
+  propagatedBuildInputs = [
+    six
+    pytest
+  ];
+
+  checkInputs = [
+    pytest
+  ];
+
+  checkPhase = ''
+    # these tests require a network connection
+    pytest --ignore tests/test_strict_check.py
+  '';
+
+  meta = with lib; {
+    description = "Pytest plugin for controlling remote data access";
+    homepage = "https://astropy.org";
+    license = licenses.bsd3;
+    maintainers = [ 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..b90e8ebef385
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-repeat/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools_scm
+, pytest
+, fetchpatch
+}:
+
+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..537f32316a31
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-rerunfailures/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv, buildPythonPackage, pythonOlder, fetchPypi, pytest, mock }:
+
+buildPythonPackage rec {
+  pname = "pytest-rerunfailures";
+  version = "9.1.1";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1cb11a17fc121b3918414eb5eaf314ee325f2e693ac7cb3f6abf7560790827f2";
+  };
+
+  checkInputs = [ mock pytest ];
+
+  propagatedBuildInputs = [ 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-sanic/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-sanic/default.nix
new file mode 100644
index 000000000000..0044a13d2c9a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-sanic/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest
+, aiohttp
+, async_generator
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-sanic";
+  version = "1.6.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "6428ed8cc2e6cfa05b92689a8589149aacdc1f0640fcf9673211aa733e6a5209";
+  };
+
+  propagatedBuildInputs = [
+    pytest
+    aiohttp
+    async_generator
+  ];
+
+  # circular dependency on sanic
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A pytest plugin for Sanic";
+    homepage = "https://github.com/yunstanford/pytest-sanic/";
+    license = licenses.asl20;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..41fcfc7b1597
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-server-fixtures/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv, 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; [ nand0p ];
+  };
+}
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..761fe1d5d54e
--- /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
+, subprocess32
+, toml
+, zc_lockfile
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-services";
+  version = "2.2.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "2da740487d08ea63dfdf718f5d4ba11e590c99ddf5481549edebf7a3a42ca536";
+  };
+
+  nativeBuildInputs = [
+    setuptools_scm
+    toml
+  ];
+
+  propagatedBuildInputs = [
+    requests
+    psutil
+    pytest
+    zc_lockfile
+  ] ++ lib.optional (!isPy3k) subprocess32;
+
+  # 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..3edafdfb4734
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-shutil/default.nix
@@ -0,0 +1,28 @@
+{ stdenv, lib, isPyPy, buildPythonPackage, fetchPypi
+, pytest, cmdline, pytestcov, coverage, setuptools-git, mock, pathpy, execnet
+, contextlib2, termcolor }:
+
+buildPythonPackage rec {
+  pname = "pytest-shutil";
+  version = "1.7.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0q8j0ayzmnvlraml6i977ybdq4xi096djhf30n2m1rvnvrhm45nq";
+  };
+
+  checkInputs = [ cmdline pytest ];
+  propagatedBuildInputs = [ pytestcov coverage setuptools-git mock pathpy execnet contextlib2 termcolor ];
+  nativeBuildInputs = [ pytest ];
+
+  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..42f399bb67f9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-snapshot/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, fetchPypi, packaging, pytest, setuptools-scm }:
+
+buildPythonPackage rec {
+  pname = "pytest-snapshot";
+  version = "0.4.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1p33fcplfykwf5mdwg25n8hjgzxpx8w1iprjnfzibpxclfrxmy5i";
+  };
+
+  nativeBuildInputs = [ setuptools-scm ];
+
+  propagatedBuildInputs = [ packaging pytest ];
+
+  # pypi does not contain tests and GitHub archive is not supported because setuptools-scm can't detect the version
+  doCheck = false;
+  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..dcfa20360146
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-socket/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-socket";
+  version = "0.3.3";
+
+  src = fetchFromGitHub {
+    owner = "miketheman";
+    repo = pname;
+    rev = version;
+    sha256 = "1jbzkyp4xki81h01yl4vg3nrg9b6shsk1ryrmkaslffyhrqnj8zh";
+  };
+
+  propagatedBuildInputs = [
+    pytest
+  ];
+
+  checkInputs = [
+    pytest
+  ];
+
+  checkPhase = ''
+    pytest
+  '';
+
+  # unsurprisingly pytest-socket require network for majority of tests
+  # to pass...
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Pytest Plugin to disable socket calls during tests";
+    homepage = "https://github.com/miketheman/pytest-socket";
+    license = licenses.mit;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..f7454ee644ca
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-subtesthack/default.nix
@@ -0,0 +1,22 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, pytest }:
+
+buildPythonPackage rec {
+  pname = "pytest-subtesthack";
+  version = "0.1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "15kzcr5pchf3id4ikdvlv752rc0j4d912n589l4rifp8qsj19l1x";
+  };
+
+  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..3be2adc11a42
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-subtests/default.nix
@@ -0,0 +1,22 @@
+{ lib, buildPythonPackage, isPy27, fetchPypi, setuptools_scm, pytestCheckHook }:
+
+buildPythonPackage rec {
+  pname = "pytest-subtests";
+  version = "0.3.2";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1mxg91mrn8672f8hwg0f31xkyarnq7q0hr4fvb9hcb09jshq2wk7";
+  };
+
+  nativeBuildInputs = [ setuptools_scm ];
+
+  checkInputs = [ pytestCheckHook ];
+
+  meta = with lib; {
+    description = "pytest plugin for unittest subTest() support and subtests fixture";
+    homepage = "https://github.com/pytest-dev/pytest-subtests";
+    license = licenses.mit;
+  };
+}
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..d1f271ea2bcb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-sugar/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, termcolor
+, pytest
+, packaging
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-sugar";
+  version = "0.9.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b1b2186b0a72aada6859bea2a5764145e3aaa2c1cfbb23c3a19b5f7b697563d3";
+  };
+
+  propagatedBuildInputs = [
+    termcolor
+    pytest
+    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-testmon/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-testmon/default.nix
new file mode 100644
index 000000000000..b86947f5f758
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-testmon/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, coverage
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-testmon";
+  version = "1.0.3";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "927a73dd510b90a2e4a48ea4d37e82c4490b56caa745663262024ea0cd278169";
+  };
+
+  propagatedBuildInputs = [ coverage ];
+
+  checkInputs = [ pytest ];
+
+  # avoid tests which try to import unittest_mixins
+  # unittest_mixins doesn't seem to be very active
+  checkPhase = ''
+    cd test
+    pytest test_{core,process_code,pytest_assumptions}.py
+  '';
+
+  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..6bf3483d40f9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-timeout/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest
+, pytestCheckHook
+, pexpect
+, pytestcov
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-timeout";
+  version = "1.4.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0xnsigs0kmpq1za0d4i522sp3f71x5bgpdh3ski0rs74yqy13cr0";
+  };
+
+  propagatedBuildInputs = [ pytest ];
+
+  checkInputs = [ pytestCheckHook pexpect pytestcov ];
+
+  disabledTests = [
+    "test_suppresses_timeout_when_pdb_is_entered"
+  ];
+  pytestFlagsArray = [
+    "-ra"
+  ];
+
+  meta = with lib; {
+    description = "py.test 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..658ca7122f4b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-tornado/default.nix
@@ -0,0 +1,28 @@
+{ 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;
+
+  propagatedBuildInputs = [ pytest 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..be1e76d21e4f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-tornasync/default.nix
@@ -0,0 +1,38 @@
+{ 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";
+  };
+
+  propagatedBuildInputs = [
+    pytest
+    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..7bf05013f214
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-trio/default.nix
@@ -0,0 +1,43 @@
+{ lib, buildPythonPackage, fetchFromGitHub, pythonOlder
+, trio, python, 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";
+  };
+
+  propagatedBuildInputs = [
+    trio
+    async_generator
+    outcome
+    pytest
+  ];
+
+  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..19e1091c8c76
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-twisted/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, greenlet
+, pytest
+, decorator
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-twisted";
+  version = "1.13.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "cee2320becc5625050ab221b8f38533e636651a24644612f4726891fdf1f1847";
+  };
+
+  propagatedBuildInputs = [ greenlet pytest 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-vcr/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-vcr/default.nix
new file mode 100644
index 000000000000..9373c597b367
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-vcr/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pytest
+, vcrpy
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-vcr";
+  version = "1.0.2";
+
+  src = fetchFromGitHub {
+    owner = "ktosiek";
+    repo = pname;
+    rev = version;
+    sha256 = "1i6fin91mklvbi8jzfiswvwf1m91f43smpj36a17xrzk4gisfs6i";
+  };
+
+  propagatedBuildInputs = [
+    pytest
+    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..a910bf3245f4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-virtualenv/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi
+, pytest, pytestcov, 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 pytestcov 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..600ffbfdc7fc
--- /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";
+  };
+
+  propagatedBuildInputs = [ 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..12b06c2e1b63
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-watch/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, docopt
+, colorama
+, pytest
+, watchdog
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-watch";
+  version = "4.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "06136f03d5b361718b8d0d234042f7b2f203910d8568f63df2f866b547b3d4b9";
+  };
+
+  # No Tests
+  doCheck = false;
+
+  propagatedBuildInputs = [ pytest colorama docopt watchdog ];
+
+  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/1.nix b/nixpkgs/pkgs/development/python-modules/pytest-xdist/1.nix
new file mode 100644
index 000000000000..0c5ae06e8611
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-xdist/1.nix
@@ -0,0 +1,36 @@
+{ lib, stdenv, fetchPypi, buildPythonPackage, execnet, pytest
+, setuptools_scm, pytest-forked, filelock, psutil, six, isPy3k }:
+
+buildPythonPackage rec {
+  pname = "pytest-xdist";
+  version = "1.34.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1vh4ps32lp5ignch5adbl3pgchvigdfmrl6qpmhxih54wa1qw3il";
+  };
+
+  nativeBuildInputs = [ setuptools_scm pytest ];
+  checkInputs = [ pytest filelock ];
+  propagatedBuildInputs = [ execnet pytest-forked psutil six ];
+
+  # Encountered a memory leak
+  # https://github.com/pytest-dev/pytest-xdist/issues/462
+  doCheck = !isPy3k;
+
+  checkPhase = ''
+    # Excluded tests access file system
+    py.test testing -k "not test_distribution_rsyncdirs_example \
+                    and not test_rsync_popen_with_path \
+                    and not test_popen_rsync_subdir \
+                    and not test_init_rsync_roots \
+                    and not test_rsyncignore"
+  '';
+
+  meta = with lib; {
+    description = "py.test 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/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-xdist/default.nix
new file mode 100644
index 000000000000..e5019f842fee
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-xdist/default.nix
@@ -0,0 +1,33 @@
+{ lib, stdenv, fetchPypi, buildPythonPackage, execnet, pytest_6
+, setuptools_scm, pytest-forked, filelock, psutil, six, isPy3k }:
+
+buildPythonPackage rec {
+  pname = "pytest-xdist";
+  version = "2.1.0";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0wh6pn66nncfs6ay0n863bgyriwsgppn8flx5l7551j1lbqkinc2";
+  };
+
+  nativeBuildInputs = [ setuptools_scm pytest_6 ];
+  checkInputs = [ pytest_6 filelock ];
+  propagatedBuildInputs = [ execnet pytest-forked psutil six ];
+
+  # pytest6 doesn't allow for new lines
+  # capture_deprecated not compatible with latest pytest6
+  checkPhase = ''
+    # Excluded tests access file system
+    export HOME=$TMPDIR
+    pytest -n $NIX_BUILD_CORES \
+      -k "not (distribution_rsyncdirs_example or rsync or warning_captured_deprecated_in_pytest_6)"
+  '';
+
+  meta = with lib; {
+    description = "py.test 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-xprocess/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-xprocess/default.nix
new file mode 100644
index 000000000000..124adb8b2a53
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-xprocess/default.nix
@@ -0,0 +1,34 @@
+{ lib, buildPythonPackage, fetchPypi
+, psutil
+, pytest
+, setuptools_scm
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-xprocess";
+  version = "0.17.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "2506d637c4f54c65dd195c1d094abdeedacc9bf0689131d847a324ad0fc951c0";
+  };
+
+  nativeBuildInputs = [ setuptools_scm ];
+  propagatedBuildInputs = [ psutil pytest ];
+
+  # 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..64078d68a8b8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-xvfb/default.nix
@@ -0,0 +1,30 @@
+{ 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";
+  };
+
+  propagatedBuildInputs = [
+    pytest
+    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/4.nix b/nixpkgs/pkgs/development/python-modules/pytest/4.nix
new file mode 100644
index 000000000000..63e57a7f769b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest/4.nix
@@ -0,0 +1,50 @@
+{ lib, stdenv, buildPythonPackage, pythonOlder, fetchPypi, attrs, hypothesis, py
+, setuptools_scm, setuptools, six, pluggy, funcsigs, isPy3k, more-itertools
+, atomicwrites, mock, writeText, pathlib2, wcwidth, packaging, isPyPy
+}:
+buildPythonPackage rec {
+  version = "4.6.11";
+  pname = "pytest";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "50fa82392f2120cc3ec2ca0a75ee615be4c479e66669789771f1758332be4353";
+  };
+
+  checkInputs = [ hypothesis mock ];
+  buildInputs = [ setuptools_scm ];
+  propagatedBuildInputs = [ attrs py setuptools six pluggy more-itertools atomicwrites wcwidth packaging ]
+    ++ lib.optionals (!isPy3k) [ funcsigs ]
+    ++ lib.optionals (pythonOlder "3.6") [ pathlib2 ];
+
+  doCheck = !isPyPy; # https://github.com/pytest-dev/pytest/issues/3460
+  checkPhase = ''
+    runHook preCheck
+
+    # don't test bash builtins
+    rm testing/test_argcomplete.py
+
+    # determinism - this test writes non deterministic bytecode
+    rm -rf testing/test_assertrewrite.py
+
+    PYTHONDONTWRITEBYTECODE=1 $out/bin/py.test -x testing/ -k "not test_collect_pyargs_with_testpaths"
+    runHook postCheck
+  '';
+
+  # 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"
+  '';
+
+  meta = with lib; {
+    homepage = "https://docs.pytest.org";
+    description = "Framework for writing tests";
+    maintainers = with maintainers; [ domenkozar lovek323 madjar lsix ];
+    license = licenses.mit;
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest/5.nix b/nixpkgs/pkgs/development/python-modules/pytest/5.nix
new file mode 100644
index 000000000000..1293cc94b0f1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest/5.nix
@@ -0,0 +1,80 @@
+{ lib, stdenv, buildPythonPackage, pythonOlder, fetchPypi, isPy3k, isPyPy
+, atomicwrites
+, attrs
+, funcsigs
+, hypothesis
+, mock
+, more-itertools
+, packaging
+, pathlib2
+, pluggy
+, py
+, pygments
+, python
+, setuptools
+, setuptools_scm
+, six
+, toml
+, wcwidth
+, writeText
+}:
+
+buildPythonPackage rec {
+  version = "5.4.3";
+  pname = "pytest";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1n67lk8iwlsmfdm8663k8l7isllg1xd3n9p1yla7885szhdk6ybr";
+  };
+
+  checkInputs = [ hypothesis pygments ];
+  nativeBuildInputs = [ setuptools_scm ];
+  propagatedBuildInputs = [
+    atomicwrites
+    attrs
+    more-itertools
+    packaging
+    pluggy
+    py
+    setuptools
+    six
+    toml
+    wcwidth
+  ] ++ lib.optionals (pythonOlder "3.6") [ pathlib2 ];
+
+  doCheck = !isPyPy; # https://github.com/pytest-dev/pytest/issues/3460
+
+  preCheck = ''
+    # don't test bash builtins
+    rm testing/test_argcomplete.py
+  '';
+
+  # Ignored file https://github.com/pytest-dev/pytest/pull/5605#issuecomment-522243929
+  checkPhase = ''
+    runHook preCheck
+    $out/bin/py.test -x testing/ -k "not test_collect_pyargs_with_testpaths" --ignore=testing/test_junitxml.py
+    runHook postCheck
+  '';
+
+  # 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"
+  '';
+
+  pythonImportsCheck = [
+    "pytest"
+  ];
+
+  meta = with lib; {
+    homepage = "https://docs.pytest.org";
+    description = "Framework for writing tests";
+    maintainers = with maintainers; [ domenkozar lovek323 madjar lsix ];
+    license = licenses.mit;
+  };
+}
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..6f5c99a99b19
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest/default.nix
@@ -0,0 +1,88 @@
+{ lib, stdenv, buildPythonPackage, pythonOlder, fetchPypi, isPy3k, isPyPy
+, atomicwrites
+, attrs
+, funcsigs
+, hypothesis
+, iniconfig
+, mock
+, more-itertools
+, packaging
+, pathlib2
+, pluggy
+, py
+, pygments
+, python
+, setuptools
+, setuptools_scm
+, six
+, toml
+, wcwidth
+, writeText
+}:
+
+buildPythonPackage rec {
+  version = "6.1.2";
+  pname = "pytest";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "c0a7e94a8cdbc5422a51ccdad8e6f1024795939cc89159a0ae7f0b316ad3823e";
+  };
+
+  checkInputs = [ hypothesis pygments ];
+  nativeBuildInputs = [ setuptools_scm ];
+  propagatedBuildInputs = [
+    atomicwrites
+    attrs
+    iniconfig
+    more-itertools
+    packaging
+    pluggy
+    py
+    setuptools
+    six
+    toml
+    wcwidth
+  ] ++ lib.optionals (pythonOlder "3.6") [ pathlib2 ];
+
+  doCheck = !isPyPy; # https://github.com/pytest-dev/pytest/issues/3460
+
+  preCheck = ''
+    # don't test bash builtins
+    rm testing/test_argcomplete.py
+  '';
+
+  # Ignored file https://github.com/pytest-dev/pytest/pull/5605#issuecomment-522243929
+  checkPhase = ''
+    runHook preCheck
+    $out/bin/py.test -x testing/ -k "not test_collect_pyargs_with_testpaths" --ignore=testing/test_junitxml.py
+
+    # 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
+  '';
+
+  # 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"
+  '';
+
+  pythonImportsCheck = [
+    "pytest"
+  ];
+
+  meta = with lib; {
+    homepage = "https://docs.pytest.org";
+    description = "Framework for writing tests";
+    maintainers = with maintainers; [ domenkozar lovek323 madjar lsix ];
+    license = licenses.mit;
+  };
+}
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..877e357d9469
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytestcache/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv, 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/pytestrunner/default.nix b/nixpkgs/pkgs/development/python-modules/pytestrunner/default.nix
new file mode 100644
index 000000000000..7fd901babd0b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytestrunner/default.nix
@@ -0,0 +1,30 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, setuptools_scm, pytest }:
+
+buildPythonPackage rec {
+  pname = "pytest-runner";
+  version = "5.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "96c7e73ead7b93e388c5d614770d2bae6526efd997757d3543fe17b557a0942b";
+  };
+
+  nativeBuildInputs = [ setuptools_scm pytest ];
+
+  postPatch = ''
+    rm pytest.ini
+  '';
+
+  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/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-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-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..1ad3a5128be6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-binance/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, fetchPypi
+, pytest, requests-mock, tox
+, autobahn, certifi, chardet, cryptography, dateparser, pyopenssl, requests, service-identity, twisted }:
+
+buildPythonPackage rec {
+  version = "0.7.5";
+  pname = "python-binance";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d6a96c0e55fc78d45279944515d385b3971300f35c2380ddb82689d676712053";
+  };
+
+  doCheck = false;  # Tries to test multiple interpreters with tox
+  checkInputs = [ pytest requests-mock tox ];
+
+  propagatedBuildInputs = [ autobahn certifi chardet cryptography dateparser pyopenssl requests service-identity twisted ];
+
+  meta = {
+    description = "Binance Exchange API python implementation for automated trading";
+    homepage = "https://github.com/sammchardy/python-binance";
+    license = lib.licenses.mit;
+    maintainers = [ lib.maintainers.bhipple ];
+  };
+}
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..4c1ec6a3a20e
--- /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.10";
+
+  src = fetchPypi {
+    pname = "python_codon_tables";
+    inherit version;
+    sha256 = "265beac928cbb77c6745bc728471adc7ffef933b794be303d272ecb9ad37d3d4";
+  };
+
+  # 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-crontab/default.nix b/nixpkgs/pkgs/development/python-modules/python-crontab/default.nix
new file mode 100644
index 000000000000..f5e368de0372
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-crontab/default.nix
@@ -0,0 +1,27 @@
+{ lib, buildPythonPackage, fetchPypi, python-dateutil, pytestCheckHook }:
+
+buildPythonPackage rec {
+  pname = "python-crontab";
+  version = "2.5.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "4bbe7e720753a132ca4ca9d4094915f40e9d9dc8a807a4564007651018ce8c31";
+  };
+
+  checkInputs = [ pytestCheckHook ];
+  disabledTests = [ "test_07_non_posix_shell"];
+
+  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..885208e0e61c
--- /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..d8b501d62e5a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-daemon/default.nix
@@ -0,0 +1,40 @@
+{ lib, buildPythonPackage, fetchPypi
+, docutils
+, lockfile
+, mock
+, pytest_4
+, testscenarios
+, twine
+}:
+
+buildPythonPackage rec {
+  pname = "python-daemon";
+  version = "2.2.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "57c84f50a04d7825515e4dbf3a31c70cc44414394a71608dee6cfde469e81766";
+  };
+
+  nativeBuildInputs = [ twine ];
+  propagatedBuildInputs = [ docutils lockfile ];
+
+  checkInputs = [ pytest_4 mock testscenarios ];
+  checkPhase = ''
+    pytest -k 'not detaches_process_context \
+                and not standard_stream_file_descriptors'
+  '';
+
+  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/";
+    license = [ licenses.gpl3Plus licenses.asl20 ];
+  };
+}
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..d643603a0679
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-dbusmock/default.nix
@@ -0,0 +1,64 @@
+{ lib, buildPythonPackage, fetchFromGitHub, runtimeShell,
+  nose, dbus, dbus-python, pygobject3,
+  which, pyflakes, pycodestyle, bluez, networkmanager
+}:
+
+buildPythonPackage rec {
+  pname = "python-dbusmock";
+  version = "0.19";
+
+  src = fetchFromGitHub {
+    owner = "martinpitt";
+    repo = pname;
+    rev = version;
+    sha256 = "09j338lmrjabbd3fpajr4piz4r20sl33030szfsqfzlwrrmvkyi0";
+  };
+
+  prePatch = ''
+    substituteInPlace tests/test_code.py \
+      --replace "pyflakes3" "pyflakes" \
+      --replace "/bin/bash" "${runtimeShell}" \
+      --replace "--ignore=E124,E402,E731,W504" "--ignore=E124,E402,E731,W504,E501" # ignore long lines too
+  '';
+
+  # TODO: Get the rest of these tests running?
+  # This is a mocking library used as a check dependency for a single derivation.
+  # That derivation's tests pass. Maybe not worth the effort to fix these...
+  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"
+    # Very slow, consider disabling?
+    # "test_networkmanager"
+  ];
+
+  checkInputs = [
+    nose dbus dbus-python which pycodestyle pyflakes
+    pygobject3 bluez (lib.getOutput "test" bluez) networkmanager
+  ];
+
+  checkPhase = ''
+    runHook preCheck
+    export PATH="$PATH:${lib.getOutput "test" bluez}/test";
+    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..edde064a3335
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-didl-lite/default.nix
@@ -0,0 +1,35 @@
+{ lib, buildPythonPackage, fetchFromGitHub, pythonOlder
+, defusedxml
+, pytest }:
+
+buildPythonPackage rec {
+  pname = "python-didl-lite";
+  version = "1.2.5";
+  disabled = pythonOlder "3.5.3";
+
+  src = fetchFromGitHub {
+    owner = "StevenLooman";
+    repo = pname;
+    rev = version;
+    sha256 = "0wm831g8k9xahw20y0461cvy6lp45sxppicxah1rg9isdc3vy3nh";
+  };
+
+  propagatedBuildInputs = [
+    defusedxml
+  ];
+
+  checkInputs = [
+    pytest
+  ];
+
+  checkPhase = ''
+    py.test
+  '';
+
+  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..025a13958cd0
--- /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.10";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "bc76ecac6b2d00ce6442a69d03a6f35c71cd72293cd8405a7472dfe317920024";
+  };
+
+  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..7e94f743da46
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-doi/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv, 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..e654826e0bc2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-dotenv/default.nix
@@ -0,0 +1,34 @@
+{ lib, buildPythonPackage, fetchPypi, isPy27
+, click
+, ipython
+, pytest
+, sh
+, typing
+, mock
+}:
+
+buildPythonPackage rec {
+  pname = "python-dotenv";
+  version = "0.15.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "587825ed60b1711daea4832cf37524dfd404325b7db5e25ebe88c495c9f807a0";
+  };
+
+  propagatedBuildInputs = [ click ] ++ lib.optionals isPy27 [ typing ];
+
+  checkInputs = [ ipython mock pytest sh ];
+
+  # cli tests are impure
+  checkPhase = ''
+    pytest tests/ -k 'not cli'
+  '';
+
+  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; [ earvstedt ];
+  };
+}
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..19efcb89d3d3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-editor/default.nix
@@ -0,0 +1,20 @@
+{ lib, stdenv, 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..44e35a186e21
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-efl/default.nix
@@ -0,0 +1,48 @@
+{ lib, stdenv
+, fetchurl
+, buildPythonPackage
+, pkg-config
+, python
+, dbus-python
+, enlightenment
+}:
+
+# Should be bumped along with EFL!
+
+buildPythonPackage rec {
+  pname = "python-efl";
+  version = "1.25.0";
+
+  src = fetchurl {
+    url = "http://download.enlightenment.org/rel/bindings/python/${pname}-${version}.tar.xz";
+    sha256 = "0bk161xwlz4dlv56r68xwkm8snzfifaxd1j7w2wcyyk4fgvnvq4r";
+  };
+
+  nativeBuildInputs = [ pkg-config ];
+
+  buildInputs = [ enlightenment.efl ];
+
+  propagatedBuildInputs = [ dbus-python ];
+
+  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
+  '';
+
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Python bindings for EFL and Elementary";
+    homepage = "https://phab.enlightenment.org/w/projects/python_bindings_for_efl/";
+    platforms = platforms.linux;
+    license = with licenses; [ gpl3 lgpl3 ];
+    maintainers = with maintainers; [ matejc tstrobel ftrvxmtrx romildo ];
+  };
+}
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..ed03d9663076
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-engineio/default.nix
@@ -0,0 +1,62 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, aiohttp
+, eventlet
+, iana-etc
+, libredirect
+, mock
+, requests
+, six
+, tornado
+, websocket_client
+, websockets
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "python-engineio";
+  version = "4.0.0";
+
+  src = fetchFromGitHub {
+    owner = "miguelgrinberg";
+    repo = "python-engineio";
+    rev = "v${version}";
+    sha256 = "00x9pmmnl1yd59wd96ivkiqh4n5nphl8cwk43hf4nqr0icgsyhar";
+  };
+
+  checkInputs = [
+    aiohttp
+    eventlet
+    mock
+    requests
+    tornado
+    websocket_client
+    websockets
+    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..f4305473797c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-etcd/default.nix
@@ -0,0 +1,37 @@
+{ lib, stdenv
+, 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-fontconfig/default.nix b/nixpkgs/pkgs/development/python-modules/python-fontconfig/default.nix
new file mode 100644
index 000000000000..88778ff794ea
--- /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; [ gnidorah ];
+  };
+}
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..392c5c2126d3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-forecastio/default.nix
@@ -0,0 +1,31 @@
+{ buildPythonPackage, lib, stdenv, 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..661ea4ba2493
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-frontmatter/default.nix
@@ -0,0 +1,30 @@
+{ stdenv, lib, fetchFromGitHub, python3Packages }:
+
+python3Packages.buildPythonPackage rec {
+  pname = "python-frontmatter";
+  version = "0.5.0";
+
+  src = fetchFromGitHub {
+    owner = "eyeseast";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1iki3rcbg7zs93m3mgqzncybqgdcch25qpwy84iz96qq8pipfs6g";
+  };
+
+  propagatedBuildInputs = with python3Packages; [
+    pyyaml
+    six
+  ];
+
+  checkInputs = with python3Packages; [
+    pytest
+  ];
+
+  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 = lib.platforms.unix;
+  };
+}
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..c706ff7903c3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-gitlab/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, requests, mock, httmock, pythonOlder, pytest, responses }:
+
+buildPythonPackage rec {
+  pname = "python-gitlab";
+  version = "2.5.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "68b42aafd4b620ab2534ff78a52584c7f799e4e55d5ac297eab4263066e6f74b";
+  };
+
+  propagatedBuildInputs = [ requests ];
+
+  checkInputs = [ mock httmock pytest responses ];
+
+  disabled = pythonOlder "3.6";
+
+  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-gnupg/default.nix b/nixpkgs/pkgs/development/python-modules/python-gnupg/default.nix
new file mode 100644
index 000000000000..36ca3a719061
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-gnupg/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, gnupg }:
+
+buildPythonPackage rec {
+  pname   = "python-gnupg";
+  version = "0.4.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "3aa0884b3bd414652c2385b9df39e7b87272c2eca1b8fcc3089bc9e58652019a";
+  };
+
+  # Let's make the library default to our gpg binary
+  patchPhase = ''
+    substituteInPlace gnupg.py \
+    --replace "gpgbinary='gpg'" "gpgbinary='${gnupg}/bin/gpg'"
+    substituteInPlace test_gnupg.py \
+    --replace "gpgbinary=GPGBINARY" "gpgbinary='${gnupg}/bin/gpg'" \
+    --replace "test_search_keys" "disabled__test_search_keys"
+  '';
+
+  meta = with lib; {
+    description = "A wrapper for the Gnu Privacy Guard";
+    homepage    = "https://pypi.python.org/pypi/python-gnupg";
+    license     = licenses.bsd3;
+    maintainers = with maintainers; [ copumpkin ];
+    platforms   = platforms.unix;
+  };
+}
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..238b9b9e4afa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-hosts/default.nix
@@ -0,0 +1,33 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, pyyaml, pytest, pytestcov }:
+
+buildPythonPackage rec {
+  pname = "python-hosts";
+  version = "1.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "5b9749ce807170fb340d044d3f971e1da4dac0ae6af8ce8db00b6758a920a2bc";
+  };
+
+  # 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 pytestcov ];
+
+  # 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..f151e3ffb4cd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-hpilo/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, utils
+}:
+
+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..f4b19ba379e4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-http-client/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, mock
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "python_http_client";
+  version = "3.3.1";
+
+  src = fetchFromGitHub {
+    owner = "sendgrid";
+    repo = "python-http-client";
+    rev = version;
+    sha256 = "0mbcg0vb9v41v7hbvycrxx5wyrf3ysvfgxkix8hn8c4x5l2lmidc";
+  };
+
+  checkInputs = [
+    mock
+    pytestCheckHook
+  ];
+
+  # Failure was fixed by https://github.com/sendgrid/python-http-client/commit/6d62911ab0d0645b499e14bb17c302b48f3c10e4
+  disabledTests = [ "test__daterange" ];
+  pythonImportsCheck = [ "python_http_client" ];
+
+  meta = with lib; {
+    description = "Python HTTP library to call APIs";
+    homepage = "https://github.com/sendgrid/python-http-client";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-igraph/default.nix b/nixpkgs/pkgs/development/python-modules/python-igraph/default.nix
new file mode 100644
index 000000000000..728d47b1f967
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-igraph/default.nix
@@ -0,0 +1,32 @@
+{ buildPythonPackage, fetchPypi, lib, isPy3k
+, pkg-config, igraph
+, texttable }:
+
+buildPythonPackage rec {
+  pname = "python-igraph";
+  version = "0.8.3";
+  disabled = !isPy3k; # fails to build
+
+  nativeBuildInputs = [ pkg-config ];
+  buildInputs = [ igraph ];
+  propagatedBuildInputs = [ texttable ];
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "e1f27622eddeb2bd5fdcbadb41ef048e884790bb050f9627c086dc609d0f1236";
+  };
+
+  # 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" ];
+
+  doCheck = !isPy3k;
+
+  meta = {
+    description = "High performance graph data structures and algorithms";
+    homepage = "https://igraph.org/python/";
+    license = lib.licenses.gpl2;
+    maintainers = [ lib.maintainers.MostAwesomeDude ];
+  };
+}
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..06a5d234ecf6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-jenkins/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, mock
+, pbr
+, pyyaml
+, setuptools
+, six
+, multi_key_dict
+, testscenarios
+, requests
+, unittest2
+, requests-mock
+}:
+
+buildPythonPackage rec {
+  pname = "python-jenkins";
+  version = "1.7.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "01jid5s09lr3kayr2h1z9n8h9nhyw3jxv9c4b5hrlxijknkqzvfy";
+  };
+
+  buildInputs = [ mock ];
+  propagatedBuildInputs = [ pbr pyyaml setuptools six multi_key_dict requests ];
+
+  checkInputs = [ unittest2 testscenarios requests-mock ];
+  checkPhase = ''
+    unit2
+  '';
+
+  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; [ ];
+  };
+
+}
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..0de220094c06
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-jose/default.nix
@@ -0,0 +1,46 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub
+, future, six, ecdsa, rsa
+, pycrypto, pytestcov, pytestrunner, cryptography
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "python-jose";
+  version = "3.2.0";
+
+  src = fetchFromGitHub {
+    owner = "mpdavis";
+    repo = "python-jose";
+    rev = version;
+    sha256 = "cSPIZrps0xFd4pPcQ4w/jFWOk2XYgd3mtE/sDzlytvY=";
+  };
+
+  checkInputs = [
+    pycrypto
+    pytestCheckHook
+    pytestcov
+    pytestrunner
+    cryptography # optional dependency, but needed in tests
+  ];
+
+  # relax ecdsa deps
+  patchPhase = ''
+    substituteInPlace setup.py \
+      --replace 'ecdsa<0.15' 'ecdsa' \
+      --replace 'ecdsa <0.15' 'ecdsa'
+  '';
+
+  disabledTests = [
+    # https://github.com/mpdavis/python-jose/issues/176
+    "test_key_too_short"
+  ];
+
+  propagatedBuildInputs = [ future six ecdsa rsa ];
+
+  meta = with lib; {
+    homepage = "https://github.com/mpdavis/python-jose";
+    description = "A JOSE implementation in Python";
+    license = licenses.mit;
+    maintainers = [ 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..96ce13ab265b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-json-logger/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, nose
+}:
+
+buildPythonPackage rec {
+  version = "2.0.1";
+  pname = "python-json-logger";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f26eea7898db40609563bed0a7ca11af12e2a79858632706d835a0f961b7d398";
+  };
+
+  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..3a0ab33363ec
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-jsonrpc-server/default.nix
@@ -0,0 +1,34 @@
+{ stdenv, lib, buildPythonPackage, fetchFromGitHub, pythonOlder
+, pytestCheckHook, mock, pytestcov, coverage
+, future, futures, ujson, isPy38
+}:
+
+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 pytestcov 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-language-server/default.nix b/nixpkgs/pkgs/development/python-modules/python-language-server/default.nix
new file mode 100644
index 000000000000..f22652d0f73c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-language-server/default.nix
@@ -0,0 +1,79 @@
+{ stdenv, lib, buildPythonPackage, fetchFromGitHub, pythonOlder, isPy27
+, backports_functools_lru_cache, configparser, futures, future, jedi, pluggy, python-jsonrpc-server, flake8
+, pytestCheckHook, mock, pytestcov, coverage, setuptools, ujson, flaky
+, # Allow building a limited set of providers, e.g. ["pycodestyle"].
+  providers ? ["*"]
+  # The following packages are optional and
+  # can be overwritten with null as your liking.
+, autopep8 ? null
+, mccabe ? null
+, pycodestyle ? null
+, pydocstyle ? null
+, pyflakes ? null
+, pylint ? null
+, rope ? null
+, yapf ? null
+}:
+
+let
+  withProvider = p: builtins.elem "*" providers || builtins.elem p providers;
+in
+
+buildPythonPackage rec {
+  pname = "python-language-server";
+  version = "0.36.2";
+
+  src = fetchFromGitHub {
+    owner = "palantir";
+    repo = "python-language-server";
+    rev = version;
+    sha256 = "07x6jr4z20jxn03bxblwc8vk0ywha492cgwfhj7q97nb5cm7kx0q";
+  };
+
+  propagatedBuildInputs = [ setuptools jedi pluggy future python-jsonrpc-server flake8 ujson ]
+    ++ lib.optional (withProvider "autopep8") autopep8
+    ++ lib.optional (withProvider "mccabe") mccabe
+    ++ lib.optional (withProvider "pycodestyle") pycodestyle
+    ++ lib.optional (withProvider "pydocstyle") pydocstyle
+    ++ lib.optional (withProvider "pyflakes") pyflakes
+    ++ lib.optional (withProvider "pylint") pylint
+    ++ lib.optional (withProvider "rope") rope
+    ++ lib.optional (withProvider "yapf") yapf
+    ++ lib.optional isPy27 configparser
+    ++ lib.optionals (pythonOlder "3.2") [ backports_functools_lru_cache futures ];
+
+
+  # The tests require all the providers, disable otherwise.
+  doCheck = providers == ["*"];
+
+  checkInputs = [
+    pytestCheckHook mock pytestcov coverage flaky
+    # rope is technically a dependency, but we don't add it by default since we
+    # already have jedi, which is the preferred option
+    rope
+  ];
+
+  dontUseSetuptoolsCheck = true;
+
+  preCheck = ''
+    export HOME=$TEMPDIR
+  '';
+
+  # Tests failed since update to 0.31.8
+  disabledTests = [
+    "test_pyqt_completion"
+    "test_numpy_completions"
+    "test_pandas_completions"
+    "test_matplotlib_completions"
+    "test_snippet_parsing"
+    "test_numpy_hover"
+    "test_symbols"
+  ] ++ lib.optional isPy27 "test_flake8_lint";
+
+  meta = with lib; {
+    homepage = "https://github.com/palantir/python-language-server";
+    description = "An implementation of the Language Server Protocol for Python";
+    license = licenses.mit;
+    maintainers = [ maintainers.mic92 ];
+  };
+}
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..94d8abd1fabd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-ldap-test/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv, 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";
+    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..60767e77e761
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-levenshtein/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "python-Levenshtein";
+  version = "0.12.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1c9ybqcja31nghfcc8xxbbz9h60s9qi12b9hr4jyl69xbvg12fh3";
+  };
+
+  # No tests included in archive
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Functions for fast computation of Levenshtein distance and string similarity";
+    homepage    = "https://github.com/ztane/python-Levenshtein";
+    license     = licenses.gpl2;
+    maintainers = with maintainers; [ aske ];
+  };
+
+}
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..55d3c60cd448
--- /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.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "13763yx0k655y0c8gxv7jj6cqp45zypx2fmnc56jnn9zz1fkx50h";
+  };
+
+  # 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-ly/default.nix b/nixpkgs/pkgs/development/python-modules/python-ly/default.nix
new file mode 100644
index 000000000000..6f83a7f61c75
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-ly/default.nix
@@ -0,0 +1,21 @@
+{ buildPythonPackage, fetchPypi, lib, stdenv }:
+
+buildPythonPackage rec {
+  pname = "python-ly";
+  version = "0.9.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0s5hvsf17f4w1xszrf4pg29wfv9znkj195klq1v2qhlpxfp6772d";
+  };
+
+  # 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-lz4/default.nix b/nixpkgs/pkgs/development/python-modules/python-lz4/default.nix
new file mode 100644
index 000000000000..e9317d3f7c67
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-lz4/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, future
+, isPy3k
+, pkgconfig
+, psutil
+, pytest
+, pytestcov
+, pytestrunner
+, setuptools_scm
+}:
+
+buildPythonPackage rec {
+  pname = "python-lz4";
+  version = "2.1.10";
+
+  # get full repository inorder to run tests
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "02cadqfdmw4vc94px18dh4hcybpsa2lr6jz6j5phwc0jjaavh3wr";
+  };
+
+  nativeBuildInputs = [ setuptools_scm pkgconfig pytestrunner ];
+  checkInputs = [ pytest pytestcov psutil ];
+  propagatedBuildInputs = lib.optionals (!isPy3k) [ future ];
+
+  # give a hint to setuptools_scm on package version
+  preBuild = ''
+    export SETUPTOOLS_SCM_PRETEND_VERSION="v${version}"
+  '';
+
+  meta = {
+     description = "LZ4 Bindings for Python";
+     homepage = "https://github.com/python-lz4/python-lz4";
+     license = lib.licenses.bsd3;
+     maintainers = with lib.maintainers; [ costrouc ];
+  };
+}
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..a1fd01134235
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-lzf/default.nix
@@ -0,0 +1,18 @@
+{ lib, stdenv, 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..5025b86361a3
--- /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.12";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0iakqgd51n1cd7r3lpdylm2rgbmd16y74cra9kcapwg84mlf9a4p";
+  };
+
+  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..61a7dd315dfc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-magic/default.nix
@@ -0,0 +1,28 @@
+{ buildPythonPackage, lib, fetchPypi, file, stdenv }:
+
+buildPythonPackage rec {
+  pname = "python-magic";
+  version = "0.4.18";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b757db2a5289ea3f1ced9e60f072965243ea43a2221430048fd8cacab17be0ce";
+  };
+
+  postPatch = ''
+    substituteInPlace magic.py --replace "ctypes.util.find_library('magic')" "'${file}/lib/libmagic${stdenv.hostPlatform.extensions.sharedLibrary}'"
+  '';
+
+  doCheck = false;
+
+  # TODO: tests are failing
+  #checkPhase = ''
+  #  ${python}/bin/${python.executable} ./test.py
+  #'';
+
+  meta = {
+    description = "A python interface to the libmagic file type identification library";
+    homepage = "https://github.com/ahupp/python-magic";
+    license = lib.licenses.mit;
+  };
+}
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..fe68ed60e372
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-mapnik/default.nix
@@ -0,0 +1,66 @@
+{ lib, stdenv
+, buildPythonPackage
+, isPyPy
+, python
+, pkgs
+, pillow
+, pycairo
+}:
+
+let
+  boost = pkgs.boost.override {
+    enablePython = true;
+    inherit python;
+  };
+  mapnik = pkgs.mapnik.override {
+    inherit python boost;
+  };
+
+in buildPythonPackage rec {
+  pname = "python-mapnik";
+  version = "unstable-2020-02-24";
+
+  src = pkgs.fetchFromGitHub {
+    owner = "mapnik";
+    repo = "python-mapnik";
+    rev = "7da019cf9eb12af8f8aa88b7d75789dfcd1e901b";
+    sha256 = "0snn7q7w1ab90311q8wgd1z64kw1svm5w831q0xd6glqhah86qc8";
+  };
+
+  disabled = isPyPy;
+  doCheck = false; # doesn't find needed test data files
+  preBuild = let
+    pythonVersion = with lib.versions; "${major python.version}${minor python.version}";
+  in ''
+    export BOOST_PYTHON_LIB="boost_python${pythonVersion}"
+    export BOOST_THREAD_LIB="boost_thread"
+    export BOOST_SYSTEM_LIB="boost_system"
+  '';
+
+  nativeBuildInputs = [
+    mapnik # for mapnik_config
+  ];
+
+  buildInputs = [
+    mapnik
+    boost
+  ] ++ (with pkgs; [
+    cairo
+    harfbuzz
+    icu
+    libjpeg
+    libpng
+    libtiff
+    libwebp
+    proj
+    zlib
+  ]);
+  propagatedBuildInputs = [ pillow pycairo ];
+
+  meta = with lib; {
+    description = "Python bindings for Mapnik";
+    homepage = "https://mapnik.org";
+    license  = licenses.lgpl21;
+  };
+
+}
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-miio/default.nix b/nixpkgs/pkgs/development/python-modules/python-miio/default.nix
new file mode 100644
index 000000000000..8321795c2fba
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-miio/default.nix
@@ -0,0 +1,52 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, appdirs
+, click
+, construct
+, croniter
+, cryptography
+, importlib-metadata
+, pytest
+, pytest-mock
+, zeroconf
+, attrs
+, pytz
+, tqdm
+, netifaces
+}:
+
+
+buildPythonPackage rec {
+  pname = "python-miio";
+  version = "0.5.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "5a6fd3bb2cc2f75cdfe5673f36a5a418144d08add6e53b384cb146e99f27bd39";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace  "zeroconf>=0.25.1,<0.26.0" "zeroconf"
+    substituteInPlace setup.py \
+      --replace  "pytz>=2019.3,<2020.0" "pytz"
+    substituteInPlace setup.py \
+      --replace  "cryptography>=2.9,<3.0" "cryptography"
+    '';
+
+  checkInputs = [ pytest pytest-mock];
+  propagatedBuildInputs = [ appdirs click construct croniter cryptography importlib-metadata zeroconf attrs pytz tqdm netifaces ];
+
+  checkPhase = ''
+    pytest
+  '';
+
+  meta = with lib; {
+    description = "Python library for interfacing with Xiaomi smart appliances";
+    homepage = "https://github.com/rytilahti/python-miio";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ flyfloh ];
+  };
+}
+
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..a24f2a383a31
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-mnist/default.nix
@@ -0,0 +1,18 @@
+{ lib, stdenv, 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..82ee7e209241
--- /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..c27923424872
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-multipart/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest
+, pytestcov
+, mock
+, pyyaml
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "python-multipart";
+  version = "0.0.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f7bb5f611fc600d15fa47b3974c8aa16e93724513b49b5f95c81e6624c83fa43";
+  };
+
+  checkInputs = [
+    pytest
+    pytestcov
+    mock
+    pyyaml
+  ];
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  checkPhase = ''
+    pytest
+  '';
+
+  meta = with lib; {
+    description = "A streaming multipart parser for Python";
+    homepage = "https://github.com/andrew-d/python-multipart";
+    license = licenses.asl20;
+    maintainers = [ 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..c894654e41e6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-nest/default.nix
@@ -0,0 +1,25 @@
+{ buildPythonPackage, fetchPypi, lib, python, python-dateutil, requests
+, six, sseclient-py }:
+
+buildPythonPackage rec {
+  pname = "python-nest";
+  version = "4.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "12iyypbl92ybh8w1bf4z0c2g0sb9id2c07c89vzvnlxgjylw3wbi";
+  };
+
+  propagatedBuildInputs = [ python-dateutil requests six sseclient-py ];
+  # 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-nomad/default.nix b/nixpkgs/pkgs/development/python-modules/python-nomad/default.nix
new file mode 100644
index 000000000000..ba3ecd3883a4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-nomad/default.nix
@@ -0,0 +1,23 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, requests }:
+
+buildPythonPackage rec {
+  pname = "python-nomad";
+  version = "1.2.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0ivkfdrmb4wpyawvwrgm3jvx6hn49vqjpwbkmkmamigghqqwacx3";
+  };
+
+  propagatedBuildInputs = [ requests ];
+
+  # Tests require nomad agent
+  doCheck = false;
+
+  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-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..b1e01f7f4abf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-olm/default.nix
@@ -0,0 +1,28 @@
+{ lib, buildPythonPackage, olm,
+  cffi, future, isPy3k, typing }:
+
+buildPythonPackage {
+  pname = "python-olm";
+  inherit (olm) src version;
+
+  sourceRoot = "${olm.name}/python";
+  buildInputs = [ olm ];
+
+  preBuild = ''
+    make include/olm/olm.h
+  '';
+
+  propagatedBuildInputs = [
+    cffi
+    future
+  ] ++ lib.optionals (!isPy3k) [ typing ];
+
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Python bindings for Olm";
+    homepage = "https://gitlab.matrix.org/matrix-org/olm/tree/master/python";
+    license = olm.meta.license;
+    maintainers = [ maintainers.tilpner ];
+  };
+}
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..634ccea371e0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-opendata-transport/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, aiohttp
+, async-timeout
+, urllib3
+}:
+
+buildPythonPackage rec {
+  pname = "python-opendata-transport";
+  version = "0.2.1";
+
+  src = fetchPypi {
+    pname = "python_opendata_transport";
+    inherit version;
+    sha256 = "0pxs9zqk00vn1s74cx1416mqmixrr74wb0jb0j6b1c3xpvzlfbks";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    async-timeout
+    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-otr/default.nix b/nixpkgs/pkgs/development/python-modules/python-otr/default.nix
new file mode 100644
index 000000000000..7a40998eebdc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-otr/default.nix
@@ -0,0 +1,36 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, isPy3k
+, zope_interface
+, cryptography
+, application
+, gmpy2
+}:
+
+buildPythonPackage rec {
+  pname = "python-otr";
+  version = "1.2.0";
+  disabled = isPy3k;
+
+  src = fetchFromGitHub {
+    owner = "AGProjects";
+    repo = pname;
+    rev = "release-${version}";
+    sha256 = "0p3b1n8jlxwd65gbk2k5007fkhdyjwcvr4982s42hncivxvabzzy";
+  };
+
+  propagatedBuildInputs = [ zope_interface cryptography application gmpy2 ];
+
+  meta = with lib; {
+    description = "A pure python implementation of OTR";
+    homepage = "https://github.com/AGProjects/python-otr";
+    license = licenses.lgpl21Plus;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ edwtjo ];
+    # The package itself does not support python3, and its transitive
+    # dependencies rely on namespace package support that does not work in
+    # Nix's python2 infra. See #74619 for details.
+    broken = true;
+  };
+}
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..ba02ec84635f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-packer/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv, 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-pam/default.nix b/nixpkgs/pkgs/development/python-modules/python-pam/default.nix
new file mode 100644
index 000000000000..f152c1f264eb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-pam/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pam
+}:
+
+buildPythonPackage rec {
+  pname = "python-pam";
+  version = "1.8.4";
+
+  src = fetchFromGitHub {
+    owner = "FirefighterBlu3";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0gp7vzd332j7jwndcnz7kc9j283d6lyv32bndd1nqv9ghzv69sxp";
+  };
+
+  buildInputs = [
+    pam
+  ];
+
+  postPatch = ''
+    sed "s|find_library(\"pam\")|\"${pam}/lib/libpam.so\"|g" -i pam.py
+  '';
+
+  meta = with lib; {
+    description = "Python pam module supporting py3 (and py2)";
+    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..e0461dd1efe6
--- /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.1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ed07adc27c8b4df9cd40b2d935f86400a7b495b311df5bfaf9ecaeafc5413fd5";
+  };
+
+  # 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-pipedrive/default.nix b/nixpkgs/pkgs/development/python-modules/python-pipedrive/default.nix
new file mode 100644
index 000000000000..6e0c0ef5788e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-pipedrive/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, python
+, 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-prctl/default.nix b/nixpkgs/pkgs/development/python-modules/python-prctl/default.nix
new file mode 100644
index 000000000000..2fd88858de75
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-prctl/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, libcap
+}:
+
+buildPythonPackage rec {
+  pname = "python-prctl";
+  version = "1.8.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b4ca9a25a7d4f1ace4fffd1f3a2e64ef5208fe05f929f3edd5e27081ca7e67ce";
+  };
+
+  patches = [ ./skip_bad_tests.patch ];
+  buildInputs = [ libcap ];
+
+  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-prctl/skip_bad_tests.patch b/nixpkgs/pkgs/development/python-modules/python-prctl/skip_bad_tests.patch
new file mode 100644
index 000000000000..19d70f234a99
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-prctl/skip_bad_tests.patch
@@ -0,0 +1,34 @@
+--- ./test_prctl.py	2018-01-26 16:02:52.000000000 -0500
++++ ./test_prctl.py	2018-06-21 18:26:43.370065009 -0400
+@@ -154,6 +154,7 @@
+         prctl.set_keepcaps(False)
+         self.assertEqual(prctl.get_keepcaps(), False)
+ 
++    @unittest.skip("No access to /proc in the Nix build sandbox")
+     @require('set_mce_kill')
+     def test_mce_kill(self):
+         """Test the MCE_KILL setting"""
+@@ -173,6 +174,7 @@
+         prctl.set_name(name)
+         self.assertEqual(prctl.get_name(), name[:15])
+ 
++    @unittest.skip("The Nix build sandbox has no_new_privs already enabled")
+     @require('get_no_new_privs')
+     def test_no_new_privs(self):
+         """Test the no_new_privs function"""
+@@ -189,6 +191,7 @@
+                 self.assertNotEqual(sp.returncode, 0)
+             os._exit(0)
+ 
++    @unittest.skip("No access to /proc in the Nix build sandbox")
+     def test_proctitle(self):
+         """Test setting the process title, including too long titles"""
+         title = "This is a test!"
+@@ -225,6 +228,7 @@
+             os._exit(0)
+         self.assertRaises(OSError, prctl.set_ptracer, new_pid)
+ 
++    @unittest.skip("The Nix build sandbox has seccomp already enabled")
+     @require('get_seccomp')
+     def test_seccomp(self):
+         """Test manipulation of the seccomp setting"""
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..2d81581c0cc1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-ptrace/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "python-ptrace";
+  version = "0.9.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b998e3436cec975b6907552af6e7f3ff8779097e32d2b905696e5a9feb09e070";
+  };
+
+  # 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-rapidjson/default.nix b/nixpkgs/pkgs/development/python-modules/python-rapidjson/default.nix
new file mode 100644
index 000000000000..c4cf0dc74255
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-rapidjson/default.nix
@@ -0,0 +1,37 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, pytest
+, pytz
+, glibcLocales
+}:
+
+buildPythonPackage rec {
+  version = "0.9.4";
+  pname = "python-rapidjson";
+  disabled = pythonOlder "3.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d79a412d7df30f01d3cb12e0e8863a48cfecd2fd7612719e16bc76eb1b65b332";
+  };
+
+  LC_ALL="en_US.utf-8";
+  buildInputs = [ glibcLocales ];
+
+  # buildInputs = [ ];
+  checkInputs = [ pytest pytz ];
+  # propagatedBuildInputs = [ ];
+
+  checkPhase = ''
+    pytest tests
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/python-rapidjson/python-rapidjson";
+    description = "Python wrapper around rapidjson ";
+    license = licenses.mit;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..235d085fffdb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-redis-lock/default.nix
@@ -0,0 +1,36 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, redis
+, pytest
+, process-tests
+, pkgs
+, withDjango ? false, django_redis
+}:
+
+buildPythonPackage rec {
+  pname = "python-redis-lock";
+  version = "3.7.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "4265a476e39d476a8acf5c2766485c44c75f3a1bd6cf73bb195f3079153b8374";
+  };
+
+  checkInputs = [ pytest process-tests pkgs.redis ];
+
+  checkPhase = ''
+    pytest tests/
+  '';
+
+  propagatedBuildInputs = [ redis ]
+  ++ lib.optional withDjango django_redis;
+
+
+  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-rtmidi/default.nix b/nixpkgs/pkgs/development/python-modules/python-rtmidi/default.nix
new file mode 100644
index 000000000000..2b65a658f982
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-rtmidi/default.nix
@@ -0,0 +1,29 @@
+{ lib, buildPythonPackage, fetchPypi, isPy27
+, pkg-config, alsaLib, libjack2, tox, flake8, alabaster
+}:
+
+buildPythonPackage rec {
+  pname = "python-rtmidi";
+  version = "1.4.6";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1aqhsl9w3h0rwf3mhr8parjbxm2sb6sn5mac6725cvm535pqqyhz";
+  };
+
+  nativeBuildInputs = [ pkg-config ];
+  buildInputs = [ alsaLib libjack2 ];
+  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..ea3d1bfb444a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-sat/default.nix
@@ -0,0 +1,24 @@
+{ buildPythonPackage, fetchFromGitHub, lib, six, pypblib, pytestCheckHook }:
+
+buildPythonPackage rec {
+  pname = "python-sat";
+  version = "0.1.6.dev6";
+
+  src = fetchFromGitHub {
+    owner = "pysathq";
+    repo = "pysat";
+    rev = version;
+    sha256 = "1gckxhqkvzyw7pmwg8xzxq146jysqy0s23l5mjc3awm6swdij66y";
+  };
+
+  propagatedBuildInputs = [ six pypblib ];
+
+  checkInputs = [ pytestCheckHook ];
+
+  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..8ec7f6887ad4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-simple-hipchat/default.nix
@@ -0,0 +1,20 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi
+, unzip }:
+
+buildPythonPackage rec {
+  pname = "python-simple-hipchat";
+  version = "0.4.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0zy6prrj85jjc4xmxgfg8h94j81k6zhfxfffcbvq9b10jis1rgav";
+  };
+
+  buildInputs = [ unzip ];
+
+  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..1860ff6d24d5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-slugify/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv, fetchPypi, buildPythonPackage, python, text-unidecode }:
+
+buildPythonPackage rec {
+    pname = "python-slugify";
+    version = "4.0.1";
+
+    src = fetchPypi {
+      inherit pname version;
+      sha256 = "69a517766e00c1268e5bbfc0d010a0a8508de0b18d30ad5a1ff357f8ae724270";
+    };
+
+    propagatedBuildInputs = [ text-unidecode ];
+
+    checkPhase = ''
+      ${python.interpreter} test.py
+    '';
+
+    meta = with lib; {
+      homepage = "https://github.com/un33k/python-slugify";
+      description = "A Python Slugify application that handles Unicode";
+      license = licenses.mit;
+      platforms = platforms.all;
+      maintainers = with maintainers; [ vrthra ];
+    };
+}
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..06e1185e3430
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-snap7/default.nix
@@ -0,0 +1,37 @@
+{ lib, buildPythonPackage, snap7, fetchFromGitHub, six, setuptools }:
+
+buildPythonPackage rec {
+  pname = "python-snap7";
+  version = "0.11";
+
+  src = fetchFromGitHub {
+    owner = "gijzelaerr";
+    repo = "python-snap7";
+    rev = "899a94c6eeca76fb9b18afd5056e5003646d7f94";
+    sha256 = "169zd1nxq86nmi6132vxl1f6wxm9w3waihq2wn14kkmld1vkmvfd";
+  };
+
+  propagatedBuildInputs = [ setuptools six ];
+
+  prePatch = ''
+    substituteInPlace snap7/common.py \
+      --replace "lib_location = None" "lib_location = '${snap7}/lib/libsnap7.so'"
+  '';
+
+  # Tests require root privileges to open privilaged ports
+  # We cannot run them
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "snap7"
+    "snap7.six"
+    "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..084c66e172ad
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-snappy/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPyPy
+, snappy
+, cffi
+, nose
+}:
+
+buildPythonPackage rec {
+  pname = "python-snappy";
+  version = "0.5.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d9c26532cfa510f45e8d135cde140e8a5603d3fb254cfec273ebc0ecf9f668e2";
+  };
+
+  buildInputs = [ snappy ];
+
+  propagatedBuildInputs = lib.optional isPyPy cffi;
+
+  checkInputs = [ nose ];
+
+  checkPhase = ''
+    rm -r snappy # prevent local snappy from being picked up
+    nosetests test_snappy.py
+  '' + lib.optionalString isPyPy ''
+    nosetests test_snappy_cffi.py
+  '';
+
+  meta = with lib; {
+    description = "Python library for the snappy compression library from Google";
+    homepage = "https://github.com/andrix/python-snappy";
+    license = licenses.bsd3;
+    maintainers = [ 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..ee9a60301444
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-socketio/default.nix
@@ -0,0 +1,43 @@
+{ lib, stdenv
+, bidict
+, buildPythonPackage
+, fetchFromGitHub
+, mock
+, pytestCheckHook
+, python-engineio
+}:
+
+buildPythonPackage rec {
+  pname = "python-socketio";
+  version = "5.0.4";
+
+  src = fetchFromGitHub {
+    owner = "miguelgrinberg";
+    repo = "python-socketio";
+    rev = "v${version}";
+    sha256 = "0mpqr53mrdzk9ki24y1inpsfvjlvm7pvxf8q4d52m80i5pcd5v5q";
+  };
+
+  propagatedBuildInputs = [
+    bidict
+    python-engineio
+  ];
+
+  checkInputs = [
+    mock
+    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-engineio/";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ mic92 ];
+  };
+}
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..90dc5835e458
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-sql/default.nix
@@ -0,0 +1,18 @@
+{ lib, fetchPypi, buildPythonPackage }:
+
+buildPythonPackage rec {
+  pname = "python-sql";
+  version = "1.2.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "306999bd311fbf50804d76f346655af0a6ff18881ce46c1329256fee40f492c0";
+  };
+
+  meta = {
+    homepage = "https://python-sql.tryton.org/";
+    description = "A library to write SQL queries in a pythonic way";
+    maintainers = with lib.maintainers; [ johbo ];
+    license = lib.licenses.bsd3;
+  };
+}
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..eb912b2bc593
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-stdnum/default.nix
@@ -0,0 +1,23 @@
+{ lib, fetchPypi, buildPythonPackage, nose }:
+
+buildPythonPackage rec {
+  version = "1.14";
+  pname = "python-stdnum";
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "fd3a92b8ec82a159c41dbaa3c5397934d090090c92b04e346412e0fd7e6a1b1c";
+  };
+
+  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-tado/default.nix b/nixpkgs/pkgs/development/python-modules/python-tado/default.nix
new file mode 100644
index 000000000000..98c03b893093
--- /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.9.0";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "wmalgadey";
+    repo = "PyTado";
+    rev = version;
+    sha256 = "0cr5sxdvjgdrrlhl32rs8pwyay8liyi6prm37y66dn00b41cb5l3";
+  };
+
+  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..52dea24c45fe
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-telegram-bot/default.nix
@@ -0,0 +1,42 @@
+{ lib, stdenv
+, fetchPypi
+, buildPythonPackage
+, certifi
+, decorator
+, future
+, urllib3
+, tornado
+, pytest
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "python-telegram-bot";
+  version = "13.0";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ca78a41626d728a8f51affa792270e210fa503ed298d395bed2bd1281842dca3";
+  };
+
+  checkInputs = [ pytest ];
+  propagatedBuildInputs = [ certifi future urllib3 tornado decorator ];
+
+  # --with-upstream-urllib3 is not working properly
+  postPatch = ''
+    rm -rf telegram/vendor
+  '';
+  setupPyGlobalFlags = "--with-upstream-urllib3";
+
+  # tests not included with release
+  doCheck = false;
+  pythonImportsCheck = [ "telegram" ];
+
+  meta = with lib; {
+    description = "This library provides a pure Python interface for the Telegram Bot API.";
+    homepage = "https://python-telegram-bot.org";
+    license = licenses.lgpl3;
+    maintainers = with maintainers; [ veprbl pingiun ];
+  };
+}
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..bdf09fdf2c79
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-toolbox/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, docutils
+, fetchFromGitHub
+, isPy27
+, nose
+, pytest
+}:
+
+buildPythonPackage rec {
+  version = "1.0.10";
+  pname = "python_toolbox";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "cool-RR";
+    repo = pname;
+    rev = version;
+    sha256 = "1hpls1hwisdjx1g15cq052bdn9fvh43r120llws8bvgvj9ivnaha";
+  };
+
+  checkInputs = [
+    docutils
+    pytest
+  ];
+
+  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-twitter/default.nix b/nixpkgs/pkgs/development/python-modules/python-twitter/default.nix
new file mode 100644
index 000000000000..4b1e7e2c1eba
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-twitter/default.nix
@@ -0,0 +1,44 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, pytestrunner
+, future
+, requests
+, responses
+, requests_oauthlib
+, pytest
+, hypothesis
+}:
+
+buildPythonPackage rec {
+  pname = "python-twitter";
+  version = "3.5";
+
+  # No tests in PyPi Tarball
+  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";
+    })
+  ];
+
+  nativeBuildInputs = [ pytestrunner ];
+  propagatedBuildInputs = [ future requests requests_oauthlib ];
+  checkInputs = [ pytest responses hypothesis ];
+
+  meta = with lib; {
+    description = "A 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..7f6f14c9888c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-u2flib-host/default.nix
@@ -0,0 +1,23 @@
+{ lib, stdenv, 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..69f741e74379
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-uinput/default.nix
@@ -0,0 +1,23 @@
+{ lib, stdenv, 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 = "http://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..fa82027777f6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-unshare/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv
+, 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..60160d270b75
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-utils/default.nix
@@ -0,0 +1,27 @@
+{ lib, buildPythonPackage, fetchPypi, pytestCheckHook, pytestrunner, pytestcov, pytest-flakes, sphinx, six }:
+
+buildPythonPackage rec {
+  pname = "python-utils";
+  version = "2.4.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "12c0glzkm81ljgf6pwh0d4rmdm1r7vvgg3ifzp8yp9cfyngw07zj";
+  };
+
+  postPatch = ''
+    rm -r tests/__pycache__
+    rm tests/*.pyc
+    substituteInPlace pytest.ini --replace "--pep8" ""
+  '';
+
+  checkInputs = [ pytestCheckHook pytestrunner pytestcov pytest-flakes sphinx ];
+
+  propagatedBuildInputs = [ six ];
+
+  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..92ba757667da
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-vagrant/default.nix
@@ -0,0 +1,21 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  version = "0.5.15";
+  pname = "python-vagrant";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1ikrh6canhcxg5y7pzmkcnnydikppv7s6sm9prfx90nk0ac8m6mg";
+  };
+
+  # The tests try to connect to qemu
+  doCheck = false;
+
+  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-vipaccess/default.nix b/nixpkgs/pkgs/development/python-modules/python-vipaccess/default.nix
new file mode 100644
index 000000000000..f96086393f2e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-vipaccess/default.nix
@@ -0,0 +1,40 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, oath
+, pycryptodome
+, requests
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "python-vipaccess";
+  version = "0.13";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f148d4534e3a4dda9050a6a038868594c1216ea2413f2144ca6697e0e20c9cad";
+  };
+
+  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..6f83f587f588
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-vlc/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools
+, libvlc
+, substituteAll
+}:
+
+buildPythonPackage rec {
+  pname = "python-vlc";
+  version = "3.0.11115";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a4d3bdddfce84a8fb1b2d5447193a0239c55c16ca246e5194d48efd59c4e236b";
+  };
+
+  propagatedBuildInputs = [
+    setuptools
+  ];
+
+  patches = [
+    (substituteAll {
+      src = ./vlc-paths.patch;
+      libvlcPath="${libvlc}/lib/libvlc.so.5";
+    })
+  ];
+
+  doCheck = false; # no tests
+
+  meta = with lib; {
+    homepage = "https://wiki.videolan.org/PythonBinding";
+    maintainers = with maintainers; [ tbenst ];
+    description = "Python bindings for VLC, the cross-platform multimedia player and framework";
+    license = licenses.lgpl21Plus;
+  };
+}
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..c4d163100ca9
--- /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.7.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "05jaxbnlw5wck0hl124py364jqrx7a4mmv0hy3d2jzvmp0012sk5";
+  };
+
+  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..503fbe101b92
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-wifi/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv
+, 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; {
+    inherit version;
+    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..3e6d72845687
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-xmp-toolkit/default.nix
@@ -0,0 +1,44 @@
+{ 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}'"
+  '';
+
+  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/python2-pythondialog/default.nix b/nixpkgs/pkgs/development/python-modules/python2-pythondialog/default.nix
new file mode 100644
index 000000000000..b9d9b110f60c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python2-pythondialog/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "python2-pythondialog";
+  version = "3.5.1";
+  disabled = isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ad159c7b455d9cb2a5173590656d19a26e9cc208264cfab755f5827070d18613";
+  };
+
+  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 (Python 2 backport)";
+    homepage = "http://pythondialog.sourceforge.net/";
+    license = licenses.lgpl3;
+  };
+
+}
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..ad8ea88d1d0d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python3-openid/default.nix
@@ -0,0 +1,23 @@
+{ lib, stdenv, 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/python_fedora/default.nix b/nixpkgs/pkgs/development/python-modules/python_fedora/default.nix
new file mode 100644
index 000000000000..df12d7aeaff6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python_fedora/default.nix
@@ -0,0 +1,22 @@
+{ lib, stdenv, 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..5fff75ada911
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python_keyczar/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv
+, 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_mimeparse/default.nix b/nixpkgs/pkgs/development/python-modules/python_mimeparse/default.nix
new file mode 100644
index 000000000000..c3f85affe81b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python_mimeparse/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "python-mimeparse";
+  version = "1.6.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "76e4b03d700a641fd7761d3cd4fdbbdcd787eade1ebfac43f877016328334f78";
+  };
+
+  # error: invalid command 'test'
+  doCheck = false;
+
+  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;
+  };
+
+}
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..2c5357297ea7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python_openzwave/default.nix
@@ -0,0 +1,42 @@
+{ lib, stdenv, 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; [ etu ];
+    inherit (openzwave.meta) platforms;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python_statsd/default.nix b/nixpkgs/pkgs/development/python-modules/python_statsd/default.nix
new file mode 100644
index 000000000000..ae293c44c0f7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python_statsd/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+, mock
+, nose
+, coverage
+}:
+
+buildPythonPackage rec {
+  pname = "python-statsd";
+  version = "2.1.0";
+  disabled = isPy3k;  # next release will be py3k compatible
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d2c573d325d0f015b4d79f0d0f8c88dd8413d7b9ef890c09076a9b6089ab301c";
+  };
+
+  buildInputs = [ mock nose coverage ];
+
+  meta = with lib; {
+    description = "A client for Etsy's node-js statsd server";
+    homepage = "https://github.com/WoLpH/python-statsd";
+    license = licenses.bsd3;
+  };
+
+}
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..c385f11b2f01
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pythondialog/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "pythondialog";
+  version = "3.5.1";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "34a0687290571f37d7d297514cc36bd4cd044a3a4355271549f91490d3e7ece8";
+  };
+
+  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/pythonirclib/default.nix b/nixpkgs/pkgs/development/python-modules/pythonirclib/default.nix
new file mode 100644
index 000000000000..178e1855a061
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pythonirclib/default.nix
@@ -0,0 +1,34 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchurl
+, paver
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "irclib";
+  version = "0.4.8";
+  disabled = isPy3k;
+
+  src = fetchurl {
+    url = "mirror://sourceforge/python-irclib/python-irclib-${version}.tar.gz";
+    sha256 = "1x5456y4rbxmnw4yblhb4as5791glcw394bm36px3x6l05j3mvl1";
+  };
+
+  patches = [(fetchurl {
+    url = "http://trac.uwc.ac.za/trac/python_tools/browser/xmpp/resources/irc-transport/irclib.py.diff?rev=387&format=raw";
+    name = "irclib.py.diff";
+    sha256 = "5fb8d95d6c95c93eaa400b38447c63e7a176b9502bc49b2f9b788c9905f4ec5e";
+  })];
+
+  patchFlags = [ "irclib.py" ];
+
+  propagatedBuildInputs = [ paver ];
+
+  meta = with lib; {
+    description = "Python IRC library";
+    homepage = "https://github.com/jaraco/irc";
+    license = with licenses; [ lgpl21 ];
+  };
+
+}
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..80535b28bf23
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pythonix/default.nix
@@ -0,0 +1,36 @@
+{ lib, stdenv, 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 = [ maintainers.mic92 ];
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pythonmagick/default.nix b/nixpkgs/pkgs/development/python-modules/pythonmagick/default.nix
new file mode 100644
index 000000000000..a647fa1005bc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pythonmagick/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchurl
+, python
+, pkg-config
+, imagemagick
+, autoreconfHook
+, boost
+, isPy3k
+, pythonImportsCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pythonmagick";
+  version = "0.9.16";
+  format = "other";
+
+  src = fetchurl {
+    url = "mirror://imagemagick/python/releases/PythonMagick-${version}.tar.xz";
+    sha256 = "137278mfb5079lns2mmw73x8dhpzgwha53dyl00mmhj2z25varpn";
+  };
+
+  postPatch = ''
+    rm configure
+  '';
+
+  configureFlags = [ "--with-boost=${boost}" ];
+
+  nativeBuildInputs = [ pkg-config autoreconfHook pythonImportsCheckHook ];
+  buildInputs = [ python boost imagemagick ];
+
+  pythonImportsCheck = [
+    "PythonMagick"
+  ];
+
+  disabled = isPy3k;
+
+  meta = with lib; {
+    homepage = "http://www.imagemagick.org/script/api.php";
+    license = licenses.imagemagick;
+    description = "PythonMagick provides object oriented bindings for the ImageMagick Library.";
+  };
+}
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..d0054f7076a1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pythonnet/default.nix
@@ -0,0 +1,94 @@
+{ lib
+, fetchPypi
+, fetchNuGet
+, buildPythonPackage
+, python
+, pytest
+, pycparser
+, psutil
+, pkg-config
+, dotnetbuildhelpers
+, clang
+, glib
+, mono
+}:
+
+let
+
+  UnmanagedExports127 = fetchNuGet {
+    baseName = "UnmanagedExports";
+    version = "1.2.7";
+    sha256 = "0bfrhpmq556p0swd9ssapw4f2aafmgp930jgf00sy89hzg2bfijf";
+    outputFiles = [ "*" ];
+  };
+
+  NUnit371 = fetchNuGet {
+    baseName = "NUnit";
+    version = "3.7.1";
+    sha256 = "1yc6dwaam4w2ss1193v735nnl79id78yswmpvmjr1w4bgcbdza4l";
+    outputFiles = [ "*" ];
+  };
+
+in
+
+buildPythonPackage rec {
+  pname = "pythonnet";
+  version = "2.4.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1ach9jic7a9rd3vmc4bphkr9fq01a0qk81f8a7gr9npwzmkqx8x3";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py --replace 'self._install_packages()' '#self._install_packages()'
+  '';
+
+  preConfigure = ''
+    [ -z "''${dontPlacateNuget-}" ] && placate-nuget.sh
+    [ -z "''${dontPlacatePaket-}" ] && placate-paket.sh
+  '';
+
+  nativeBuildInputs = [
+    pytest
+    pycparser
+
+    pkg-config
+    dotnetbuildhelpers
+    clang
+
+    mono
+
+    NUnit371
+    UnmanagedExports127
+  ];
+
+  buildInputs = [
+    glib
+    mono
+    psutil # needed for memory leak tests
+  ];
+
+  preBuild = ''
+    rm -rf packages
+    mkdir packages
+
+    ln -s ${NUnit371}/lib/dotnet/NUnit/ packages/NUnit.3.7.1
+    ln -s ${UnmanagedExports127}/lib/dotnet/NUnit/ packages/UnmanagedExports.1.2.7
+
+    # Setting TERM=xterm fixes an issue with terminfo in mono: System.Exception: Magic number is wrong: 542
+    export TERM=xterm
+  '';
+
+  checkPhase = ''
+    ${python.interpreter} -m pytest
+  '';
+
+  meta = with lib; {
+    description = ".Net and Mono integration for Python";
+    homepage = "https://pythonnet.github.io";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jraygauthier ];
+    broken = true;
+  };
+}
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..d1d06d22c641
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pythonocc-core/default.nix
@@ -0,0 +1,44 @@
+{ lib, stdenv, python, fetchFromGitHub, cmake, swig, ninja
+, opencascade, smesh, freetype, libGL, libGLU, libX11
+, Cocoa }:
+
+stdenv.mkDerivation rec {
+  pname = "pythonocc-core";
+  version = "0.18.1";
+
+  src = fetchFromGitHub {
+    owner = "tpaviot";
+    repo = "pythonocc-core";
+    rev = version;
+    sha256 = "1jk4y7f75z9lyawffpfkr50qw5452xzi1imcdlw9pdvf4i0y86k3";
+  };
+
+  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 smesh
+    freetype libGL libGLU libX11
+  ] ++ 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/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..771ae4d13281
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytile/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, aiohttp
+, async-timeout
+, aresponses
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pylint
+, pytest-aiohttp
+, pytest-asyncio
+, pytestCheckHook
+, pythonAtLeast
+}:
+
+buildPythonPackage rec {
+  pname = "pytile";
+  version = "5.1.1";
+  disabled = pythonAtLeast "3.9";
+
+  src = fetchFromGitHub {
+    owner = "bachya";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-bVoFTaK/Alemtc5I+Z/M9y/FWczvJ+P86R0DMD89/BM=";
+  };
+
+  format = "pyproject";
+
+  nativeBuildInputs = [ poetry-core ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    pylint
+  ];
+
+  checkInputs = [
+    aresponses
+    pytest-aiohttp
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  # Ignore the examples as they are prefixed with test_
+  pytestFlagsArray = [ "--ignore 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..1ced64375301
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytimeparse/default.nix
@@ -0,0 +1,20 @@
+{ lib, stdenv, 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/pytmx/default.nix b/nixpkgs/pkgs/development/python-modules/pytmx/default.nix
new file mode 100644
index 000000000000..17c18a96c736
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytmx/default.nix
@@ -0,0 +1,34 @@
+{ lib, fetchFromGitHub
+, python, buildPythonPackage, isPy27
+, pygame, pyglet, pysdl2, six
+}:
+
+buildPythonPackage rec {
+  pname = "pytmx";
+  version = "3.24.0";
+
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    # The release was not git tagged.
+    owner = "bitcraft";
+    repo = "PyTMX";
+    rev = "eb96efea30d57b731654b2a167d86b8b553b147d";
+    sha256 = "1g1j4w75zw76p5f8m5v0hdigdlva2flf0ngyk8nvqcwzcl5vq5wc";
+  };
+
+  propagatedBuildInputs = [ pygame pyglet pysdl2 six ];
+
+  checkPhase = ''
+    # Change into the test directory due to a relative resource path.
+    cd tests/pytmx
+    ${python.interpreter} -m unittest test_pytmx
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/bitcraft/PyTMX";
+    description = "Python library to read Tiled Map Editor's TMX maps";
+    license = licenses.lgpl3;
+    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..64e6ed4c669a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytoml/default.nix
@@ -0,0 +1,34 @@
+{ lib, stdenv
+, 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/pytools/default.nix b/nixpkgs/pkgs/development/python-modules/pytools/default.nix
new file mode 100644
index 000000000000..4add5ac5e857
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytools/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, decorator
+, appdirs
+, six
+, numpy
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "pytools";
+  version = "2020.4.3";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "21aa1fd942bc3bc54c8ae3b5e60c1f771e6db0817b7402fd802aa5964f20e629";
+  };
+
+  checkInputs = [ pytest ];
+
+  propagatedBuildInputs = [
+    decorator
+    appdirs
+    six
+    numpy
+  ];
+
+  checkPhase = ''
+    py.test -k 'not test_persistent_dict'
+  '';
+
+  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..63991752a8ac
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytorch-lightning/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, isPy27
+, future
+, pytestCheckHook
+, pytorch
+, pyyaml
+, tensorflow-tensorboard
+, tqdm }:
+
+buildPythonPackage rec {
+  pname = "pytorch-lightning";
+  version = "0.8.5";
+
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "PyTorchLightning";
+    repo = pname;
+    rev = version;
+    sha256 = "12zhq4pnfcwbgcx7cs99c751gp3w0ysaf5ykv2lv8f4i360w3r5a";
+  };
+
+  propagatedBuildInputs = [
+    future
+    pytorch
+    pyyaml
+    tensorflow-tensorboard
+    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..0430ab37a682
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytorch-metric-learning/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, isPy27
+, numpy
+, scikitlearn
+, pytestCheckHook
+, pytorch
+, torchvision
+, tqdm
+}:
+
+buildPythonPackage rec {
+  pname   = "pytorch-metric-learning";
+  version = "0.9.95";
+
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "KevinMusgrave";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1msvs1j3n47762ahm21bnkk2qqabxw8diiyi7s420x4zg24mr23g";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+    pytorch
+    scikitlearn
+    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 = [ pytestCheckHook ];
+  disabledTests = [
+    # requires FAISS (not in Nixpkgs)
+    "test_accuracy_calculator_and_faiss"
+    # require network access:
+    "test_get_nearest_neighbors"
+    "test_tuplestoweights_sampler"
+    "test_untrained_indexer"
+  ];
+
+  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/bin.nix b/nixpkgs/pkgs/development/python-modules/pytorch/bin.nix
new file mode 100644
index 000000000000..1ffda5c86b0e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytorch/bin.nix
@@ -0,0 +1,73 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchurl
+, isPy37
+, isPy38
+, isPy39
+, python
+, nvidia_x11
+, addOpenGLRunpath
+, future
+, numpy
+, patchelf
+, pyyaml
+, requests
+, typing-extensions
+}:
+
+let
+  pyVerNoDot = builtins.replaceStrings [ "." ] [ "" ] python.pythonVersion;
+  platform = if stdenv.isDarwin then "darwin" else "linux";
+  srcs = import ./binary-hashes.nix version;
+  unsupported = throw "Unsupported system";
+  version = "1.7.1";
+in buildPythonPackage {
+  inherit version;
+
+  pname = "pytorch";
+  # Don't forget to update pytorch to the same version.
+
+  format = "wheel";
+
+  disabled = !(isPy37 || isPy38 || isPy39);
+
+  src = fetchurl srcs."${stdenv.system}-${pyVerNoDot}" or unsupported;
+
+  nativeBuildInputs = [
+    addOpenGLRunpath
+    patchelf
+  ];
+
+  propagatedBuildInputs = [
+    future
+    numpy
+    pyyaml
+    requests
+    typing-extensions
+  ];
+
+  postInstall = ''
+    # ONNX conversion
+    rm -rf $out/bin
+  '';
+
+  postFixup = let
+    rpath = lib.makeLibraryPath [ stdenv.cc.cc.lib nvidia_x11 ];
+  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
+  '';
+
+  pythonImportsCheck = [ "torch" ];
+
+  meta = with lib; {
+    description = "Open source, prototype-to-production deep learning platform";
+    homepage = "https://pytorch.org/";
+    license = licenses.unfree; # Includes CUDA and Intel MKL.
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ danieldk ];
+  };
+}
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..a542233e15e8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytorch/binary-hashes.nix
@@ -0,0 +1,14 @@
+version: {
+  x86_64-linux-37 = {
+    url = "https://download.pytorch.org/whl/cu102/torch-${version}-cp37-cp37m-linux_x86_64.whl";
+    hash = "sha256-XXbCVaQUhMHUGp/1cLnJ82y4XflCiqFaWK4WrHz8LqY=";
+  };
+  x86_64-linux-38 = {
+    url = "https://download.pytorch.org/whl/cu102/torch-${version}-cp38-cp38-linux_x86_64.whl";
+    hash = "sha256-3S/GiAyV6DaWDYbvu8f2PTKH8uGJPFHTH5bb/gLw1z4=";
+  };
+  x86_64-linux-39 = {
+    url = "https://download.pytorch.org/whl/cu102/torch-${version}-cp39-cp39-linux_x86_64.whl";
+    hash = "sha256-o3k9zOsSseIoEpDMoSd8XOht39W/BE9lQoWk1pBXrqc=";
+  };
+}
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..db1914f4ee7b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytorch/default.nix
@@ -0,0 +1,300 @@
+{ stdenv, lib, fetchFromGitHub, fetchpatch, buildPythonPackage, python,
+  cudaSupport ? false, cudatoolkit ? null, cudnn ? null, nccl ? null, magma ? null,
+  mklDnnSupport ? true, useSystemNccl ? true,
+  MPISupport ? false, mpi,
+  buildDocs ? false,
+  cudaArchList ? null,
+
+  # Native build inputs
+  cmake, util-linux, linkFarm, symlinkJoin, which,
+
+  # Build inputs
+  numactl,
+
+  # Propagated build inputs
+  dataclasses, 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, tensorflow-tensorboard, protobuf,
+
+  isPy3k, pythonOlder }:
+
+# assert that everything needed for cuda is present and that the correct cuda versions are used
+assert !cudaSupport || cudatoolkit != null;
+assert cudnn == null || cudatoolkit != null;
+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
+  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.
+  cuda9ArchList = [
+    "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.
+  ];
+  cuda10ArchList = cuda9ArchList ++ [
+    "7.5"
+    "7.5+PTX"  # < most recent architecture as of cudatoolkit_10_0 and pytorch-1.2.0
+  ];
+  final_cudaArchList =
+    if !cudaSupport || cudaArchList != null
+    then cudaArchList
+    else
+      if lib.versions.major cudatoolkit.version == "9"
+      then cuda9ArchList
+      else cuda10ArchList; # the assert above removes any ambiguity here.
+
+  # 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.7.1";
+
+  disabled = !isPy3k;
+
+  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-udpbSL8xnzf20A1pYYNlYjdp8ME8AVaAkMMiw53K6CU=";
+  };
+
+  patches = lib.optionals stdenv.isDarwin [
+    # 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
+  ];
+
+  # The dataclasses module is included with Python >= 3.7. This should
+  # be fixed with the next PyTorch release.
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "'dataclasses'" "'dataclasses; python_version < \"3.7\"'"
+  '';
+
+  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 = true;
+  BUILD_DOCS = buildDocs;
+
+  USE_MKL = blas.implementation == "mkl";
+
+  # 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 = mklDnnSupport;
+  USE_MKLDNN_CBLAS = mklDnnSupport;
+
+  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=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.2.0/setup.py#L17
+  NIX_CFLAGS_COMPILE = lib.optionals (blas.implementation == "mkl") [ "-Wno-error=array-bounds" ];
+
+  nativeBuildInputs = [
+    cmake
+    util-linux
+    which
+    ninja
+  ] ++ lib.optionals cudaSupport [ cudatoolkit_joined ];
+
+  buildInputs = [ blas blas.provider ]
+    ++ lib.optionals cudaSupport [ cudnn magma nccl ]
+    ++ lib.optionals stdenv.isLinux [ numactl ];
+
+  propagatedBuildInputs = [
+    cffi
+    click
+    numpy
+    pyyaml
+    typing-extensions
+    # the following are required for tensorboard support
+    pillow six future tensorflow-tensorboard protobuf
+  ] ++ lib.optionals MPISupport [ mpi ]
+    ++ lib.optionals (pythonOlder "3.7") [ dataclasses ];
+
+  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 = ''
+    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
+    cp -r $out/${python.sitePackages}/torch/lib     $lib/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/libcaffe2_observers.dylib
+    install_name_tool -change @rpath/libc10.dylib $lib/lib/libc10.dylib $lib/lib/libcaffe2_observers.dylib
+
+    install_name_tool -change @rpath/libtorch.dylib $lib/lib/libtorch.dylib $lib/lib/libcaffe2_module_test_dynamic.dylib
+    install_name_tool -change @rpath/libc10.dylib $lib/lib/libc10.dylib $lib/lib/libcaffe2_module_test_dynamic.dylib
+
+    install_name_tool -change @rpath/libtorch.dylib $lib/lib/libtorch.dylib $lib/lib/libcaffe2_detectron_ops.dylib
+    install_name_tool -change @rpath/libc10.dylib $lib/lib/libc10.dylib $lib/lib/libcaffe2_detectron_ops.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
+  '';
+
+
+  meta = {
+    description = "Open source, prototype-to-production deep learning platform";
+    homepage    = "https://pytorch.org/";
+    license     = lib.licenses.bsd3;
+    platforms   = with lib.platforms; linux ++ lib.optionals (!cudaSupport) darwin;
+    maintainers = with lib.maintainers; [ danieldk teh thoughtpolice tscholak ]; # tscholak esp. for darwin-related builds
+  };
+}
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/pytrends/default.nix b/nixpkgs/pkgs/development/python-modules/pytrends/default.nix
new file mode 100644
index 000000000000..83980c3d00b9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytrends/default.nix
@@ -0,0 +1,31 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, requests
+, lxml
+, pandas
+}:
+
+buildPythonPackage rec {
+  pname = "pytrends";
+  version = "4.7.3";
+  disabled = isPy27; # python2 pandas is too old
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "8ccb06c57c31fa157b978a0d810de7718ee46583d28cf818250d45f36abd2faa";
+  };
+
+  doCheck = false;
+
+  propagatedBuildInputs = [ requests lxml pandas ];
+
+  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..8e168bf8181a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytricia/default.nix
@@ -0,0 +1,23 @@
+{ lib, stdenv
+, 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/pytun/default.nix b/nixpkgs/pkgs/development/python-modules/pytun/default.nix
new file mode 100644
index 000000000000..2b49b169c6d1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytun/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv
+, 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/pytz/default.nix b/nixpkgs/pkgs/development/python-modules/pytz/default.nix
new file mode 100644
index 000000000000..0351840b3e0b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytz/default.nix
@@ -0,0 +1,22 @@
+{ lib, buildPythonPackage, fetchPypi, python }:
+
+buildPythonPackage rec {
+  pname = "pytz";
+  version = "2020.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "3e6b7dd2d1e0a59084bcee14a17af60c5c562cdc16d828e8eba2e683d3a7e268";
+  };
+
+  checkPhase = ''
+    ${python.interpreter} -m unittest discover -s pytz/tests
+  '';
+
+  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..739325d33337
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytzdata/default.nix
@@ -0,0 +1,20 @@
+{ lib, stdenv, 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..c703a8fe30c4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyu2f/default.nix
@@ -0,0 +1,35 @@
+{ stdenv, lib, fetchFromGitHub, buildPythonPackage,
+  six, mock, pyfakefs, unittest2, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "pyu2f";
+  version = "0.1.4";
+
+  src = fetchFromGitHub {
+    owner = "google";
+    repo = pname;
+    rev = version;
+    sha256 = "0waxdydvxn05a8ab9j235mz72x7p4pwa59pnxyk1zzbwxnpxb3p9";
+  };
+
+  # Platform detection for linux fails
+  postPatch = lib.optionalString stdenv.isLinux ''
+    rm pyu2f/tests/hid/macos_test.py
+  '';
+
+  propagatedBuildInputs = [ six ];
+
+  checkInputs = [ pytest six mock pyfakefs unittest2 ];
+
+  checkPhase = ''
+    pytest pyu2f/tests
+  '';
+
+  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..ff01ea90e227
--- /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..aabf9cd5de52
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyudev/default.nix
@@ -0,0 +1,35 @@
+{ lib, fetchPypi, buildPythonPackage
+, six, systemd, pytest, mock, hypothesis, docutils
+}:
+
+buildPythonPackage rec {
+  pname = "pyudev";
+  version = "0.22.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0xmj6l08iih2js9skjqpv4w7y0dhxyg91zmrs6v5aa65gbmipfv9";
+  };
+
+  postPatch = ''
+    substituteInPlace src/pyudev/_ctypeslib/utils.py \
+      --replace "find_library(name)" "'${lib.getLib systemd}/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..1eec6f3ea84d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyunifi/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi
+, requests }:
+
+buildPythonPackage rec {
+  pname = "pyunifi";
+  version = "2.20.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b52d1b0d87365fcfed8572b5dbd8d675bffece4ab3484bf083863f278c727d3d";
+  };
+
+  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/pyupdate/default.nix b/nixpkgs/pkgs/development/python-modules/pyupdate/default.nix
new file mode 100644
index 000000000000..f33aba8d6256
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyupdate/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv, 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/pyusb/default.nix b/nixpkgs/pkgs/development/python-modules/pyusb/default.nix
new file mode 100644
index 000000000000..41207984e0ca
--- /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.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d69ed64bff0e2102da11b3f49567256867853b861178689671a163d30865c298";
+  };
+
+  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/pyutil/default.nix b/nixpkgs/pkgs/development/python-modules/pyutil/default.nix
new file mode 100644
index 000000000000..f1c0d3be8ccf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyutil/default.nix
@@ -0,0 +1,48 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, setuptoolsDarcs
+, setuptoolsTrial
+, simplejson
+, twisted
+, isPyPy
+}:
+
+buildPythonPackage rec {
+  pname = "pyutil";
+  version = "3.3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "8c4d4bf668c559186389bb9bce99e4b1b871c09ba252a756ccaacd2b8f401848";
+  };
+
+  buildInputs = [ setuptoolsDarcs setuptoolsTrial ] ++ (if doCheck then [ simplejson ] else []);
+  propagatedBuildInputs = [ twisted ];
+
+  # Tests fail because they try to write new code into the twisted
+  # package, apparently some kind of plugin.
+  doCheck = false;
+
+  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 = "http://allmydata.org/trac/pyutil";
+    license = licenses.gpl2Plus;
+  };
+
+}
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..3877db3254b7
--- /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 = "5.7.2";
+
+  src = fetchPypi {
+    pname = "PyUtilib";
+    inherit version;
+    sha256 = "0bdb5hlj6kyb9m3xnpxzasfv5psnxfj21qx6md8ym8zkcqyq1qs5";
+  };
+
+  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..95477196d8b9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyuv/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv
+, buildPythonPackage
+, isPyPy
+, pkgs
+}:
+
+buildPythonPackage rec {
+  pname = "pyuv";
+  version = "1.2.0";
+  disabled = isPyPy;  # see https://github.com/saghul/pyuv/issues/49
+
+  src = pkgs.fetchurl {
+    url = "https://github.com/saghul/pyuv/archive/${pname}-${version}.tar.gz";
+    sha256 = "19yl1l5l6dq1xr8xcv6dhx1avm350nr4v2358iggcx4ma631rycx";
+  };
+
+  patches = [ ./pyuv-external-libuv.patch ];
+
+  buildInputs = [ pkgs.libuv ];
+
+  meta = with lib; {
+    description = "Python interface for libuv";
+    homepage = "https://github.com/saghul/pyuv";
+    repositories.git = "git://github.com/saghul/pyuv.git";
+    license = licenses.mit;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyuv/pyuv-external-libuv.patch b/nixpkgs/pkgs/development/python-modules/pyuv/pyuv-external-libuv.patch
new file mode 100644
index 000000000000..41e169acd5f5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyuv/pyuv-external-libuv.patch
@@ -0,0 +1,25 @@
+diff --git a/setup.py b/setup.py
+index 5071c3b..4b4a176 100644
+--- a/setup.py
++++ b/setup.py
+@@ -7,7 +7,6 @@ try:
+     from setuptools import setup, Extension
+ except ImportError:
+     from distutils.core import setup, Extension
+-from setup_libuv import libuv_build_ext, libuv_sdist
+
+
+ def get_version():
+@@ -35,11 +34,10 @@ setup(name             = "pyuv",
+           "Programming Language :: Python :: 3.3",
+           "Programming Language :: Python :: 3.4"
+       ],
+-      cmdclass     = {'build_ext': libuv_build_ext,
+-                      'sdist'    : libuv_sdist},
+       packages     = ['pyuv'],
+       ext_modules  = [Extension('pyuv._cpyuv',
+                                 sources = ['src/pyuv.c'],
++                                libraries = ['uv']
+                      )]
+      )
+
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..3684fee0d22e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyvcd/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, setuptools_scm
+, six
+, pytest
+}:
+
+buildPythonPackage rec {
+  version = "0.2.4";
+  pname = "pyvcd";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "071e51a8362908ad5a2a12f078185639b98b20b653a56f01679de169d0fa425d";
+  };
+
+  buildInputs = [ setuptools_scm ];
+  propagatedBuildInputs = [ six ];
+
+  checkPhase = ''
+    py.test
+  '';
+
+  checkInputs = [ pytest ];
+
+  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 = [ maintainers.sb0 maintainers.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..7c513617754f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyvcf/default.nix
@@ -0,0 +1,32 @@
+{ 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
+    '';
+  };
+}
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..4415ca7c376d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyvera/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, poetry-core
+, pytest-cov
+, pytest-asyncio
+, pytest-timeout
+, responses
+, pytestCheckHook
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "pyvera";
+  version = "0.3.11";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "pavoni";
+    repo = pname;
+    rev = version;
+    sha256 = "0yi2cjd3jag95xa0k24f7d7agi26ywb3219a0j0k8l2nsx2sdi87";
+  };
+
+  patches = [
+    (fetchpatch {
+      # build-system section is missing https://github.com/pavoni/pyvera/pull/142
+      url = "https://github.com/pavoni/pyvera/pull/142/commits/e90995a8d55107118d324e8cf189ddf1d9e3aa6c.patch";
+      sha256 = "1psq3fiwg20kcwyybzh5g17dzn5fh29lhm238npyg846innbzgs7";
+    })
+  ];
+
+  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/pyvips/default.nix b/nixpkgs/pkgs/development/python-modules/pyvips/default.nix
new file mode 100644
index 000000000000..1a01eda244b0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyvips/default.nix
@@ -0,0 +1,31 @@
+{ buildPythonPackage, fetchPypi, pytestrunner, pytestCheckHook, glib, vips, cffi
+, pkg-config, pkgconfig, lib }:
+
+buildPythonPackage rec {
+  pname = "pyvips";
+  version = "2.1.14";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "244e79c625be65237677c79424d4476de6c406805910015d4adbd0186c64a6a2";
+  };
+
+  nativeBuildInputs = [ pytestrunner pkgconfig pkg-config ];
+
+  buildInputs = [ glib vips ];
+
+  propagatedBuildInputs = [ cffi ];
+
+  # tests are not included in pypi tarball
+  doCheck = false;
+  checkInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "pyvips" ];
+
+  meta = with lib; {
+    description = "A python wrapper for libvips";
+    homepage = "https://github.com/libvips/pyvips";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ccellado ];
+  };
+}
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..260311a51ad6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyviz-comms/default.nix
@@ -0,0 +1,27 @@
+{ buildPythonPackage
+, fetchPypi
+, lib
+, param
+}:
+
+buildPythonPackage rec {
+  pname = "pyviz_comms";
+  version = "0.7.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "cd9649a9ea9dfcb9b34d78f9a64e1870aa8b6b94de546e2c99c6bb53d64ab5d1";
+  };
+
+  propagatedBuildInputs = [ param ];
+
+  # there are not tests with the package
+  doCheck = false;
+
+  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/pyvlx/default.nix b/nixpkgs/pkgs/development/python-modules/pyvlx/default.nix
new file mode 100644
index 000000000000..1a78aefa6daf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyvlx/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pyyaml
+}:
+
+buildPythonPackage rec {
+  pname = "pyvlx";
+  version = "0.2.19";
+
+  src = fetchFromGitHub {
+    owner = "Julius2342";
+    repo = pname;
+    rev = version;
+    sha256 = "031gp3sjagvmgdhfpdqlawva425ja1n3bmxk6jyn4zx54szj9zwf";
+  };
+
+  propagatedBuildInputs = [ pyyaml ];
+
+  checkInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "pyvlx" ];
+
+  meta = with lib; {
+    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..8f8ca6f1d7ac
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyvmomi/default.nix
@@ -0,0 +1,24 @@
+{ lib, buildPythonPackage, fetchFromGitHub, requests }:
+
+buildPythonPackage rec {
+  pname = "pyvmomi";
+  version = "7.0.1";
+
+  src = fetchFromGitHub {
+    owner = "vmware";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1i7zni4ygdikc22wfrbnzwqh6qy402s3di6sdlfcvky2y7fzx52x";
+  };
+
+  # requires old version of vcrpy
+  doCheck = false;
+
+  propagatedBuildInputs = [ requests ];
+
+  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/pyvoro/default.nix b/nixpkgs/pkgs/development/python-modules/pyvoro/default.nix
new file mode 100644
index 000000000000..7013cc7809dd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyvoro/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv
+, 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..ccc862f8aa47
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pywal/default.nix
@@ -0,0 +1,36 @@
+{ lib, buildPythonPackage, fetchPypi, imagemagick, feh, isPy3k }:
+
+buildPythonPackage rec {
+  pname = "pywal";
+  version = "3.3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1drha9kshidw908k7h3gd9ws2bl64ms7bjcsa83pwb3hqa9bkspg";
+  };
+
+  preCheck = ''
+    mkdir tmp
+    HOME=$PWD/tmp
+  '';
+
+  patches = [
+    ./convert.patch
+    ./feh.patch
+  ];
+
+  # Invalid syntax
+  disabled = !isPy3k;
+
+  postPatch = ''
+    substituteInPlace pywal/backends/wal.py --subst-var-by convert "${imagemagick}/bin/convert"
+    substituteInPlace pywal/wallpaper.py --subst-var-by feh "${feh}/bin/feh"
+  '';
+
+  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..5e3c4d6cc5a0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pywatchman/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv, 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..66c996a487ba
--- /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.1.1";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1a64b40f6acb4ffbaccce0545d7fc641744f95351f62e4c6aaa40549326008c9";
+  };
+
+  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/pywbem/default.nix b/nixpkgs/pkgs/development/python-modules/pywbem/default.nix
new file mode 100644
index 000000000000..698e4ef94ca3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pywbem/default.nix
@@ -0,0 +1,48 @@
+{ lib, buildPythonPackage, fetchPypi, libxml2
+, m2crypto, ply, pyyaml, six, pbr, pythonOlder, isPy37
+, nocasedict, nocaselist, yamlloader, requests-mock
+, httpretty, lxml, mock, pytest, requests, decorator, unittest2
+, FormEncode, testfixtures, pytz
+}:
+
+buildPythonPackage rec {
+  pname = "pywbem";
+  version = "1.1.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "9GpxbgNsXZJj2M5MvosNnEe+9pY+Qz64RD/7ZIDqmII=";
+  };
+
+  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/pywebdav/default.nix b/nixpkgs/pkgs/development/python-modules/pywebdav/default.nix
new file mode 100644
index 000000000000..5ed3e28b5b1b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pywebdav/default.nix
@@ -0,0 +1,17 @@
+{ lib, stdenv, fetchPypi, buildPythonPackage, isPy3k }:
+
+buildPythonPackage rec {
+  pname = "PyWebDAV";
+  version = "0.9.8";
+  disabled = isPy3k;
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1v10vg79h85milnq8w7yd75qq5z6297ywkn9b2kxajldzwqxn3ji";
+  };
+  meta = with lib; {
+    homepage = "http://code.google.com/p/pywebdav/";
+    description = "WebDAV library including a standalone server for python";
+    maintainers = with maintainers; [ johbo ];
+    license = licenses.gpl2Plus;
+  };
+}
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..5bb8989506f2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pywebpush/default.nix
@@ -0,0 +1,28 @@
+{ lib, fetchPypi, buildPythonPackage
+, coverage, flake8, mock, nose
+, http-ece, py-vapid, requests }:
+
+buildPythonPackage rec {
+  pname = "pywebpush";
+  version = "1.11.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "596c74020f9cbabc99f7964127ab0bb6cc045fcfe781b7c73cffb3ea45947820";
+  };
+
+  propagatedBuildInputs = [
+    http-ece py-vapid requests
+  ];
+
+  checkInputs = [
+    coverage flake8 mock nose
+  ];
+
+  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..545fb2367322
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pywebview/default.nix
@@ -0,0 +1,33 @@
+{ lib, buildPythonPackage, fetchFromGitHub, pythonOlder
+, importlib-resources, pytest, xvfb_run }:
+
+buildPythonPackage rec {
+  pname = "pywebview";
+  version = "3.3.1";
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "r0x0r";
+    repo = "pywebview";
+    rev = version;
+    sha256 = "015z7n0hdgkzn0p7aw1xsv6lwc260p8q67jx0zyd1zghnwyj8k79";
+  };
+
+  propagatedBuildInputs = lib.optionals (pythonOlder "3.7") [ importlib-resources ];
+
+  checkInputs = [ pytest xvfb_run ];
+
+  checkPhase = ''
+    pushd tests
+    patchShebangs run.sh
+    xvfb-run -s '-screen 0 800x600x24' ./run.sh
+    popd
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/r0x0r/pywebview";
+    description = "Lightweight cross-platform wrapper around a webview";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ jojosch ];
+  };
+}
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..c675686ef833
--- /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.5.6";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "achaiah";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1gmlifnv9kji0d1jwg1pa8d96zg48w17qg0sgxwy1y1jf3hn37bm";
+  };
+
+  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..66bdcca4793d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pywilight/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, ifaddr
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "pywilight";
+  version = "0.0.65";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1bldhg81lal9mbf55ky3gj2ndlplr0vfjp1bamd0mz5d9icas8nf";
+  };
+
+  propagatedBuildInputs = [
+    ifaddr
+    requests
+  ];
+
+  # no tests are present
+  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..798364afd0d2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pywinrm/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy38
+, kerberos
+, mock
+, pytest
+, requests
+, requests_ntlm
+, six
+, xmltodict
+}:
+
+buildPythonPackage rec {
+  pname = "pywinrm";
+  version = "0.4.1";
+  disabled = isPy38;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "4ede5c6c85b53780ad0dbf9abef2fa2ea58f44c82256a84a63eae5f1205cea81";
+  };
+
+  checkInputs = [ mock pytest ];
+  propagatedBuildInputs = [ requests requests_ntlm six kerberos xmltodict ];
+
+  meta = with lib; {
+    description = "Python library for Windows Remote Management";
+    homepage = "https://github.com/diyan/pywinrm";
+    license = licenses.mit;
+    maintainers = with maintainers; [
+      elasticdog
+      kamadorueda
+    ];
+    platforms = platforms.all;
+  };
+}
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..32baa25e52e7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pywizlight/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, asyncio-dgram
+, click
+}:
+
+buildPythonPackage rec {
+  pname = "pywizlight";
+  version = "0.4.1";
+
+  src = fetchFromGitHub {
+    owner = "sbidy";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0kyhyda28zbni9sjv6kvky6wlhqldl47niddgpbjsv5dlb9xvxns";
+  };
+
+  propagatedBuildInputs = [
+    asyncio-dgram
+    click
+  ];
+
+  # no tests are present
+  doCheck = false;
+  pythonImportsCheck = [ "pywizlight" ];
+
+  meta = with lib; {
+    description = "Python connector for WiZ light bulbs";
+    homepage = "https://github.com/sbidy/pywizlight";
+    license = with 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..b19e5f97e141
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyx/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv
+, 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..cba29c5cc9ed
--- /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.1";
+
+    src = fetchPypi {
+      inherit pname version;
+      sha256 = "965388dd629334e850aa989a67d2360ec8257cfe8f67d07c29f980d3152f2882";
+    };
+
+    # 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/pyxdg/default.nix b/nixpkgs/pkgs/development/python-modules/pyxdg/default.nix
new file mode 100644
index 000000000000..c0e8b8063ba0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyxdg/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitLab
+, nose
+}:
+
+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..9b8b6eeac8ff
--- /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.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0c9q6xdh2ciisv0crlz069haz01gfkhd5kasyr14jng4vjpzinc7";
+  };
+
+  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/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/pyxml/default.nix b/nixpkgs/pkgs/development/python-modules/pyxml/default.nix
new file mode 100644
index 000000000000..a528de8e0ca2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyxml/default.nix
@@ -0,0 +1,30 @@
+{fetchurl, python, buildPythonPackage, makeWrapper}:
+
+buildPythonPackage rec {
+  pname = "PyXML";
+  version = "0.8.4";
+
+  format = "other";
+  src = fetchurl {
+    url = "mirror://sourceforge/pyxml/${pname}-${pname}.tar.gz";
+    sha256 = "04wc8i7cdkibhrldy6j65qp5l75zjxf5lx6qxdxfdf2gb3wndawz";
+  };
+
+  buildInputs = [ makeWrapper ];
+  buildPhase = "${python.interpreter} ./setup.py build";
+  installPhase = ''
+    ${python.interpreter} ./setup.py install --prefix="$out" || exit 1
+
+    for i in "$out/bin/"*
+    do
+      wrapProgram "$i" --prefix PYTHONPATH :  \
+       "$out/${python.sitePackages}" ||  \
+        exit 2
+    done
+  '';
+
+  meta = {
+    description = "A collection of libraries to process XML with Python";
+    homepage = "http://pyxml.sourceforge.net/";
+  };
+}
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..700188f15dd1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyxnat/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, nose
+, lxml
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "pyxnat";
+  version = "1.4";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "22524120d744b50d25ef6bfc7052637e4ead9e2afac92563231ec89848f5adf5";
+  };
+
+  propagatedBuildInputs = [ lxml requests ];
+
+  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/default.nix b/nixpkgs/pkgs/development/python-modules/pyyaml/default.nix
new file mode 100644
index 000000000000..95ceeab3a04b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyyaml/default.nix
@@ -0,0 +1,27 @@
+{ lib, buildPythonPackage, fetchPypi, cython, libyaml, buildPackages }:
+
+buildPythonPackage rec {
+  pname = "PyYAML";
+  version = "5.3.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0pb4zvkfxfijkpgd1b86xjsqql97ssf1knbd1v53wkg1qm9cgsmq";
+  };
+
+  # force regeneration using Cython
+  postPatch = ''
+    rm ext/_yaml.c
+  '';
+
+  nativeBuildInputs = [ cython buildPackages.stdenv.cc ];
+
+  buildInputs = [ libyaml ];
+
+  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/pyzmq/default.nix b/nixpkgs/pkgs/development/python-modules/pyzmq/default.nix
new file mode 100644
index 000000000000..c80dfe93aee0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyzmq/default.nix
@@ -0,0 +1,46 @@
+{ buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, tornado
+, zeromq
+, py
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "pyzmq";
+  version = "20.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "824ad5888331aadeac772bce27e1c2fbcab82fade92edbd234542c4e12f0dca9";
+  };
+
+  checkInputs = [
+    pytestCheckHook
+    tornado
+  ];
+  buildInputs = [ zeromq ];
+  propagatedBuildInputs = [ py ];
+
+  # failing tests
+  disabledTests = [
+    "test_socket" # hangs
+    "test_current"
+    "test_instance"
+    "test_callable_check"
+    "test_on_recv_basic"
+    "test_on_recv_wake"
+    "test_monitor" # https://github.com/zeromq/pyzmq/issues/1272
+    "test_cython"
+    "test_asyncio" # hangs
+    "test_mockable" # fails
+  ];
+
+  pytestFlagsArray = [
+    "$out/${python.sitePackages}/zmq/tests/" # Folder with tests
+  ];
+
+  # Some of the tests use localhost networking.
+  __darwinAllowLocalNetworking = true;
+}
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..03fce00629d8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyzufall/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv, 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/qdarkstyle/default.nix b/nixpkgs/pkgs/development/python-modules/qdarkstyle/default.nix
new file mode 100644
index 000000000000..6b9b94b603f4
--- /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 = "2.8.1";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "QDarkStyle";
+    sha256 = "0883vzg35fzpyl1aiijzpfcdfvpq5vi325w0m7xkx7nxplh02fym";
+  };
+
+  # 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..d8e043d546da
--- /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.post0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "c392c7427651d8b226423c7aba4a0f2338a1f38a4bbdabac6bc4afd8bc934f06";
+  };
+
+  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..56b3f36c367c
--- /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.15.2";
+
+  # pypi does not contain tests, using github sources instead
+  src = fetchFromGitHub {
+    owner = "qubole";
+    repo = "qds-sdk-py";
+    rev = "V${version}";
+    sha256 = "0xxg9s0y6fz7vb1kab4q93q7ryi71z8x6q9qspm6s506yr3mc67l";
+  };
+
+  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/qimage2ndarray/default.nix b/nixpkgs/pkgs/development/python-modules/qimage2ndarray/default.nix
new file mode 100644
index 000000000000..a7c0fa3ff4a4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/qimage2ndarray/default.nix
@@ -0,0 +1,32 @@
+{ lib, pkgs, buildPythonPackage, fetchPypi, isPy3k
+, numpy
+, pyqt5
+, nose
+}:
+
+buildPythonPackage rec {
+  pname = "qimage2ndarray";
+  version = "1.8.3";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b02bd2dc7de774f954544312ec1020cf2d7e03fdd23ec9eb79901da55ccb3365";
+  };
+
+  checkInputs = [
+    nose
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    pyqt5
+  ];
+
+  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/qiskit-aer/default.nix b/nixpkgs/pkgs/development/python-modules/qiskit-aer/default.nix
new file mode 100644
index 000000000000..e5eb877b6b2b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/qiskit-aer/default.nix
@@ -0,0 +1,114 @@
+{ 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
+}:
+
+buildPythonPackage rec {
+  pname = "qiskit-aer";
+  version = "0.7.1";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "Qiskit";
+    repo = "qiskit-aer";
+    rev = version;
+    sha256 = "07l0wavdknx0y4vy0hwgw24365sg4nb6ygl3lpa098np85qgyn4y";
+  };
+
+  nativeBuildInputs = [
+    cmake
+    ninja
+    scikit-build
+  ];
+
+  buildInputs = [
+    blas
+    catch2
+    fmt
+    muparserx
+    nlohmann_json
+    spdlog
+  ];
+
+  propagatedBuildInputs = [
+    cvxpy
+    cython  # generates some cython files at runtime that need to be cython-ized
+    numpy
+    pybind11
+  ];
+
+  patches = [
+    # TODO: remove in favor of qiskit-aer PR #877 patch once accepted/stable
+    ./remove-conan-install.patch
+  ];
+
+  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
+  ];
+  # Slow tests
+  disabledTests = [
+    "test_paulis_1_and_2_qubits"
+    "test_3d_oscillator"
+  ];
+  checkInputs = [
+    pytestCheckHook
+    ddt
+    fixtures
+    pytest-timeout
+    qiskit-terra
+  ];
+  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; {
+    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-aer/remove-conan-install.patch b/nixpkgs/pkgs/development/python-modules/qiskit-aer/remove-conan-install.patch
new file mode 100644
index 000000000000..1c5ae87b082f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/qiskit-aer/remove-conan-install.patch
@@ -0,0 +1,63 @@
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index efeacfc..77bd6bd 100755
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -121,7 +121,11 @@ endif()
+ # Looking for external libraries
+ #
+ 
+-setup_conan()
++find_package(muparserx REQUIRED)
++find_package(nlohmann_json REQUIRED)
++find_package(spdlog REQUIRED)
++# for tests only
++find_package(catch2)
+ 
+ # If we do not set them with a space CMake fails afterwards if nothing is set for this vars!
+ set(AER_LINKER_FLAGS " ")
+@@ -269,16 +273,16 @@ endif()
+ set(AER_LIBRARIES
+ 	${AER_LIBRARIES}
+ 	${BLAS_LIBRARIES}
+-	CONAN_PKG::nlohmann_json
++	nlohmann_json
+ 	Threads::Threads
+-	CONAN_PKG::spdlog
++	spdlog
+ 	${DL_LIB}
+ 	${THRUST_DEPENDANT_LIBS})
+ 
+ set(AER_COMPILER_DEFINITIONS ${AER_COMPILER_DEFINITIONS} ${CONAN_DEFINES})
+ # Cython build is only enabled if building through scikit-build.
+ if(SKBUILD) # Terra Addon build
+-	set(AER_LIBRARIES ${AER_LIBRARIES} CONAN_PKG::muparserx)
++	set(AER_LIBRARIES ${AER_LIBRARIES} muparserx)
+ 	add_subdirectory(qiskit/providers/aer/pulse/qutip_extra_lite/cy)
+ 	add_subdirectory(qiskit/providers/aer/backends/wrappers)
+ 	add_subdirectory(src/open_pulse)
+diff --git a/setup.py b/setup.py
+index fd71e9f..1561cc4 100644
+--- a/setup.py
++++ b/setup.py
+@@ -11,12 +11,6 @@ import inspect
+ 
+ PACKAGE_NAME = os.getenv('QISKIT_AER_PACKAGE_NAME', 'qiskit-aer')
+ 
+-try:
+-    from conans import client
+-except ImportError:
+-    subprocess.call([sys.executable, '-m', 'pip', 'install', 'conan'])
+-    from conans import client
+-
+ try:
+     from skbuild import setup
+ except ImportError:
+@@ -46,8 +40,6 @@ common_requirements = [
+ 
+ setup_requirements = common_requirements + [
+     'scikit-build',
+-    'cmake!=3.17,!=3.17.0',
+-    'conan>=1.22.2'
+ ]
+ 
+ requirements = common_requirements + ['qiskit-terra>=0.12.0']
diff --git a/nixpkgs/pkgs/development/python-modules/qiskit-aqua/default.nix b/nixpkgs/pkgs/development/python-modules/qiskit-aqua/default.nix
new file mode 100644
index 000000000000..11274c525f09
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/qiskit-aqua/default.nix
@@ -0,0 +1,174 @@
+{ lib
+, pythonOlder
+, buildPythonPackage
+, fetchFromGitHub
+, cvxpy
+, dlx
+, docplex
+, fastdtw
+, h5py
+, networkx
+, numpy
+, psutil
+, python
+, qiskit-ignis
+, qiskit-terra
+, quandl
+, scikitlearn
+, yfinance
+  # Optional inputs
+, withTorch ? false
+, pytorch
+, withPyscf ? false
+, pyscf ? null
+, withScikitQuant ? false
+, scikit-quant ? null
+, withCplex ? false
+, cplex ? null
+  # Check Inputs
+, ddt
+, pytestCheckHook
+, pytest-timeout
+, qiskit-aer
+}:
+
+buildPythonPackage rec {
+  pname = "qiskit-aqua";
+  version = "0.8.1";
+
+  disabled = pythonOlder "3.6";
+
+  # Pypi's tarball doesn't contain tests
+  src = fetchFromGitHub {
+    owner = "Qiskit";
+    repo = "qiskit-aqua";
+    rev = version;
+    sha256 = "11qyya3vyq50wpzrzzl8v46yx5p72rhpqhybwn47qgazxgg82r1b";
+  };
+
+  # Optional packages: pyscf (see below NOTE) & pytorch. Can install via pip/nix if needed.
+  propagatedBuildInputs = [
+    cvxpy
+    docplex
+    dlx # Python Dancing Links package
+    fastdtw
+    h5py
+    networkx
+    numpy
+    psutil
+    qiskit-terra
+    qiskit-ignis
+    quandl
+    scikitlearn
+    yfinance
+  ] ++ lib.optionals (withTorch) [ pytorch ]
+  ++ lib.optionals (withPyscf) [ pyscf ]
+  ++ lib.optionals (withScikitQuant) [ scikit-quant ]
+  ++ lib.optionals (withCplex) [ cplex ];
+
+  # *** NOTE ***
+  # We make pyscf optional in this package, due to difficulties packaging it in Nix (test failures, complicated flags, etc).
+  # See nixpkgs#78772, nixpkgs#83447. You are welcome to try to package it yourself,
+  # or use the Nix User Repository version (https://github.com/drewrisinger/nur-packages).
+  # It can also be installed at runtime from the pip wheel.
+  # We disable appropriate tests below to allow building without pyscf installed
+
+  # NOTE: we remove cplex b/c we can't build pythonPackages.cplex.
+  # cplex is only distributed in manylinux1 wheel (no source), and Nix python is not manylinux1 compatible
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "pyscf; sys_platform != 'win32'" "" \
+      --replace "cplex; python_version >= '3.6' and python_version < '3.8'" ""
+
+    # Add ImportWarning when running qiskit.chemistry (pyscf is a chemistry package) that pyscf is not included
+    echo -e "\nimport warnings\ntry: import pyscf;\nexcept ImportError:\n    " \
+      "warnings.warn('pyscf is not supported on Nixpkgs so some qiskit features will fail." \
+        "You must install it yourself via pip or add it to your environment from the Nix User Repository." \
+        "See https://github.com/NixOS/nixpkgs/pull/83447 for details', ImportWarning)\n" \
+      >> qiskit/chemistry/__init__.py
+
+    # Add ImportWarning when running qiskit.optimization that cplex (optimization package) is not included
+    echo -e "\nimport warnings\ntry: import cplex;\nexcept ImportError:\n    " \
+      "warnings.warn('cplex is not supported on Nixpkgs so some qiskit features will fail." \
+        "You must install it yourself via pip or add it to your environment from the Nix User Repository." \
+        "', ImportWarning)\n" \
+      >> qiskit/optimization/__init__.py
+  '';
+
+  postInstall = "rm -rf $out/${python.sitePackages}/docs";  # Remove docs dir b/c it can cause conflicts.
+
+  checkInputs = [
+    pytestCheckHook
+    ddt
+    pytest-timeout
+    qiskit-aer
+  ];
+  pythonImportsCheck = [
+    "qiskit.aqua"
+    "qiskit.aqua.algorithms"
+    "qiskit.chemistry"
+    "qiskit.finance"
+    "qiskit.ml"
+    "qiskit.optimization"
+  ];
+  pytestFlagsArray = [
+    "--timeout=30"
+    "--durations=10"
+  ] ++ lib.optionals (!withPyscf) [
+    "--ignore=test/chemistry/test_qeom_ee.py"
+    "--ignore=test/chemistry/test_qeom_vqe.py"
+    "--ignore=test/chemistry/test_vqe_uccsd_adapt.py"
+    "--ignore=test/chemistry/test_bopes_sampler.py"
+  ];
+  disabledTests = [
+    # Disabled due to missing pyscf
+    "test_validate" # test/chemistry/test_inputparser.py
+
+    # Online tests
+    "test_exchangedata"
+    "test_yahoo"
+
+    # Disabling slow tests > 10 seconds
+    "TestVQE"
+    "TestOOVQE"
+    "TestVQC"
+    "TestQSVM"
+    "TestOptimizerAQGD"
+    "test_graph_partition_vqe"
+    "TestLookupRotation"
+    "_vqe"
+    "TestHHL"
+    "TestQGAN"
+    "test_evaluate_qasm_mode"
+    "test_measurement_error_mitigation_auto_refresh"
+    "test_wikipedia"
+    "test_shor_factoring_1__15___qasm_simulator____3__5__"
+    "test_readme_sample"
+    "test_ecev"
+    "test_expected_value"
+    "test_qubo_gas_int_paper_example"
+    "test_shor_no_factors_1_5"
+    "test_shor_no_factors_2_7"
+    "test_evolve_2___suzuki___1__3_"
+    "test_delta"
+    "test_swaprz"
+    "test_deprecated_algo_result"
+    "test_unsorted_grouping"
+    "test_ad_hoc_data"
+    "test_nft"
+    "test_oh"
+    "test_confidence_intervals_00001"
+    "test_eoh"
+    "test_qasm_5"
+    "test_uccsd_hf"
+  ];
+
+  meta = with lib; {
+    description = "An extensible library of quantum computing algorithms";
+    homepage = "https://github.com/QISKit/qiskit-aqua";
+    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..7374d7ce017d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/qiskit-ibmq-provider/default.nix
@@ -0,0 +1,93 @@
+{ lib
+, pythonOlder
+, buildPythonPackage
+, fetchFromGitHub
+, arrow
+, nest-asyncio
+, qiskit-terra
+, requests
+, requests_ntlm
+, websockets
+  # Visualization inputs
+, withVisualization ? false
+, ipython
+, ipyvuetify
+, ipywidgets
+, matplotlib
+, plotly
+, pyperclip
+, seaborn
+  # check inputs
+, pytestCheckHook
+, nbconvert
+, nbformat
+, pproxy
+, vcrpy
+}:
+
+let
+  visualizationPackages = [
+    ipython
+    ipyvuetify
+    ipywidgets
+    matplotlib
+    plotly
+    pyperclip
+    seaborn
+  ];
+in
+buildPythonPackage rec {
+  pname = "qiskit-ibmq-provider";
+  version = "0.11.1";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "Qiskit";
+    repo = pname;
+    rev = version;
+    sha256 = "0b5mnq8f5844idnsmp84lpkvlpszfwwi998yvggcgaayw1dbk53h";
+  };
+
+  propagatedBuildInputs = [
+    arrow
+    nest-asyncio
+    qiskit-terra
+    requests
+    requests_ntlm
+    websockets
+  ] ++ lib.optionals withVisualization visualizationPackages;
+
+  # Most tests require credentials to run on IBMQ
+  checkInputs = [
+    pytestCheckHook
+    nbconvert
+    nbformat
+    pproxy
+    vcrpy
+  ] ++ lib.optionals (!withVisualization) visualizationPackages;
+
+  pythonImportsCheck = [ "qiskit.providers.ibmq" ];
+  # These disabled tests require internet connection, aren't skipped elsewhere
+  disabledTests = [
+    "test_old_api_url"
+    "test_non_auth_url"
+    "test_non_auth_url_with_hub"
+
+    # 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
+  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..b5295dbd0411
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/qiskit-ignis/default.nix
@@ -0,0 +1,78 @@
+{ lib
+, pythonOlder
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, python
+, numpy
+, qiskit-terra
+, scikitlearn
+, 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.5.1";
+
+  disabled = pythonOlder "3.6";
+
+  # Pypi's tarball doesn't contain tests
+  src = fetchFromGitHub {
+    owner = "Qiskit";
+    repo = "qiskit-ignis";
+    rev = version;
+    sha256 = "17kplmi17axcbbgw35dzfr3d5bzfymxfni9sf6v14223c5674p4y";
+  };
+
+  # hacky, fix https://github.com/Qiskit/qiskit-ignis/issues/532.
+  # TODO: remove on qiskit-ignis v0.5.1
+  postPatch = ''
+    substituteInPlace qiskit/ignis/mitigation/expval/base_meas_mitigator.py --replace "plt.axes" "'plt.axes'"
+  '';
+
+  propagatedBuildInputs = [
+    numpy
+    qiskit-terra
+    scikitlearn
+    scipy
+  ] ++ lib.optionals (withCvx) [ cvxpy ]
+  ++ lib.optionals (withVisualization) [ matplotlib ]
+  ++ lib.optionals (withJit) [ numba ];
+  postInstall = "rm -rf $out/${python.sitePackages}/docs"; # this dir can create conflicts
+
+  # 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
+    "test_qv_fitter" # execution hangs, ran for several minutes
+  ];
+
+  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-terra/default.nix b/nixpkgs/pkgs/development/python-modules/qiskit-terra/default.nix
new file mode 100644
index 000000000000..89d39b718cdf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/qiskit-terra/default.nix
@@ -0,0 +1,165 @@
+{ lib
+, pythonOlder
+, buildPythonPackage
+, fetchFromGitHub
+  # Python requirements
+, cython
+, dill
+, fastjsonschema
+, jsonschema
+, numpy
+, networkx
+, ply
+, psutil
+, python-constraint
+, python-dateutil
+, retworkx
+, scipy
+, sympy
+, withVisualization ? false
+  # Python visualization requirements, optional
+, ipywidgets
+, matplotlib
+, pillow
+, pydot
+, pygments
+, pylatexenc
+, seaborn
+  # Crosstalk-adaptive layout pass
+, withCrosstalkPass ? false
+, z3
+  # Classical function -> Quantum Circuit compiler
+, withClassicalFunctionCompiler ? false
+, tweedledum ? null
+  # test requirements
+, ddt
+, hypothesis
+, nbformat
+, nbconvert
+, pytestCheckHook
+, python
+}:
+
+let
+  visualizationPackages = [
+    ipywidgets
+    matplotlib
+    pillow
+    pydot
+    pygments
+    pylatexenc
+    seaborn
+  ];
+  crosstalkPackages = [ z3 ];
+  classicalCompilerPackages = [ tweedledum ];
+in
+
+buildPythonPackage rec {
+  pname = "qiskit-terra";
+  version = "0.16.1";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "Qiskit";
+    repo = pname;
+    rev = version;
+    sha256 = "0007glsbrvq9swamvz8r76z9nzh46b388y0ds1dypczxpwlp9xcq";
+  };
+
+  nativeBuildInputs = [ cython ];
+
+  propagatedBuildInputs = [
+    dill
+    fastjsonschema
+    jsonschema
+    numpy
+    networkx
+    ply
+    psutil
+    python-constraint
+    python-dateutil
+    retworkx
+    scipy
+    sympy
+  ] ++ lib.optionals withVisualization visualizationPackages
+  ++ lib.optionals withCrosstalkPass crosstalkPackages
+  ++ lib.optionals withClassicalFunctionCompiler classicalCompilerPackages;
+
+  # *** Tests ***
+  checkInputs = [
+    pytestCheckHook
+    ddt
+    hypothesis
+    nbformat
+    nbconvert
+  ] ++ lib.optionals (!withVisualization) visualizationPackages;
+
+  pythonImportsCheck = [
+    "qiskit"
+    "qiskit.transpiler.passes.routing.cython.stochastic_swap.swap_trial"
+  ];
+
+  pytestFlagsArray = [
+    "--ignore=test/randomized/test_transpiler_equivalence.py" # collection requires qiskit-aer, which would cause circular dependency
+  ] ++ lib.optionals (!withClassicalFunctionCompiler ) [
+    "--ignore=test/python/classical_function_compiler/"
+  ];
+  disabledTests = [
+    # Flaky tests
+    "test_cx_equivalence"
+    "test_pulse_limits"
+  ]
+  # 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"
+  ];
+
+  # 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
+    cp -r $TMP/$sourceRoot/qiskit/schemas/examples $PACKAGEDIR/qiskit/schemas/
+
+    # run pytest from Nix's $out path
+    pushd $PACKAGEDIR
+  '';
+  postCheck = ''
+    rm -rf test
+    rm -rf examples
+    popd
+  '';
+
+
+  meta = with lib; {
+    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..7c79d517ce5d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/qiskit/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, pythonOlder
+, buildPythonPackage
+, fetchFromGitHub
+  # Python Inputs
+, qiskit-aer
+, qiskit-aqua
+, qiskit-ibmq-provider
+, qiskit-ignis
+, qiskit-terra
+  # Check Inputs
+, pytestCheckHook
+}:
+
+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.23.1";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "qiskit";
+    repo = "qiskit";
+    rev = version;
+    sha256 = "0x4cqx1wqqj7h5g3vdag694qjzsmvhpw25yrlcs70mh5ywdp28x1";
+  };
+
+  propagatedBuildInputs = [
+    qiskit-aer
+    qiskit-aqua
+    qiskit-ibmq-provider
+    qiskit-ignis
+    qiskit-terra
+  ];
+
+  checkInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [
+    "qiskit"
+    "qiskit.aqua"
+    "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/qpid-python/default.nix b/nixpkgs/pkgs/development/python-modules/qpid-python/default.nix
new file mode 100644
index 000000000000..ef540538792d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/qpid-python/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchurl
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "qpid-python";
+  version = "0.32";
+  disabled = isPy3k;
+
+  src = fetchurl {
+    url = "http://www.us.apache.org/dist/qpid/${version}/${pname}-${version}.tar.gz";
+    sha256 = "09hdfjgk8z4s3dr8ym2r6xn97j1f9mkb2743pr6zd0bnj01vhsv4";
+  };
+
+  # needs a broker running and then ./qpid-python-test
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "http://qpid.apache.org/";
+    description = "Python client implementation and AMQP conformance tests for Apache Qpid";
+    license = licenses.asl20;
+  };
+
+}
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..113d53ff29b8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/qrcode/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, six
+, pillow
+, pymaging_png
+, mock
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "qrcode";
+  version = "6.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "505253854f607f2abf4d16092c61d4e9d511a3b4392e60bff957a68592b04369";
+  };
+
+  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-qt5/default.nix b/nixpkgs/pkgs/development/python-modules/qscintilla-qt5/default.nix
new file mode 100644
index 000000000000..2ee9c82f08db
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/qscintilla-qt5/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, pythonPackages
+, qscintilla
+, qtbase
+}:
+with pythonPackages;
+buildPythonPackage {
+  pname = "qscintilla";
+  version = qscintilla.version;
+  src = qscintilla.src;
+  format = "other";
+
+  nativeBuildInputs = [ sip qtbase ];
+  buildInputs = [ qscintilla ];
+  propagatedBuildInputs = [ pyqt5 ];
+
+  postPatch = ''
+    substituteInPlace Python/configure.py \
+      --replace \
+      "target_config.py_module_dir" \
+      "'$out/${python.sitePackages}'"
+  '';
+
+  preConfigure = ''
+    # configure.py will look for this folder
+    mkdir -p $out/share/sip/PyQt5
+
+    cd Python
+    substituteInPlace configure.py \
+      --replace "qmake = {'CONFIG': 'qscintilla2'}" "qmake = {'CONFIG': 'qscintilla2', 'QT': 'widgets printsupport'}"
+    ${python.executable} ./configure.py \
+      --pyqt=PyQt5 \
+      --destdir=$out/${python.sitePackages}/PyQt5 \
+      --stubsdir=$out/${python.sitePackages}/PyQt5 \
+      --apidir=$out/api/${python.libPrefix} \
+      --qsci-incdir=${qscintilla}/include \
+      --qsci-featuresdir=${qscintilla}/mkspecs/features \
+      --qsci-libdir=${qscintilla}/lib \
+      --pyqt-sipdir=${pyqt5}/share/sip/PyQt5 \
+      --qsci-sipdir=$out/share/sip/PyQt5 \
+      --sip-incdir=${sip}/include
+  '';
+
+  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/qscintilla/default.nix b/nixpkgs/pkgs/development/python-modules/qscintilla/default.nix
new file mode 100644
index 000000000000..82c3773f3032
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/qscintilla/default.nix
@@ -0,0 +1,43 @@
+{ lib, stdenv
+, buildPythonPackage
+, disabledIf
+, isPy3k
+, isPyPy
+, pkgs
+, python
+, pyqt4
+}:
+
+disabledIf (isPy3k || isPyPy)
+  (buildPythonPackage {
+    # TODO: Qt5 support
+    pname = "qscintilla";
+    version = pkgs.qscintilla.version;
+    format = "other";
+
+    src = pkgs.qscintilla.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}/include \
+          -o ${pkgs.qscintilla}/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.unix;
+    };
+  })
diff --git a/nixpkgs/pkgs/development/python-modules/qserve/default.nix b/nixpkgs/pkgs/development/python-modules/qserve/default.nix
new file mode 100644
index 000000000000..ff606d132363
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/qserve/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "qserve";
+  version = "0.2.8";
+  disabled = isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "0b04b2d4d11b464ff1efd42a9ea9f8136187d59f4076f57c9ba95361d41cd7ed";
+  };
+
+  meta = with lib; {
+    description = "Job queue server";
+    homepage = "https://github.com/pediapress/qserve";
+    license = licenses.bsd3;
+  };
+
+}
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..11b4885e4c8a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/qtawesome/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, qtpy, six, pyqt5, pytest }:
+
+buildPythonPackage rec {
+  pname = "QtAwesome";
+  version = "1.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d612a313e531966d17f5a8fb7604faba961cf7ce3c77a9168c6f60e60140b767";
+  };
+
+  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..f29d33d25ae3
--- /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.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "4d7dd4eae8a90d0b2b19b31794b30f137238463998989734a3acb8a53b506bab";
+  };
+
+  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..76db7090a045
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/qtpy/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, pyside, pytest }:
+
+buildPythonPackage rec {
+  pname = "QtPy";
+  version = "1.9.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "13cw8l7zrhbdi03k1wl1pg9xdl4ahdfa7yz8gd0f23sxnm22rdrd";
+  };
+
+  # no concrete propagatedBuildInputs as multiple backends are supposed
+  checkInputs = [ pyside pytest ];
+
+  doCheck = false; # require X
+  checkPhase = ''
+    py.test qtpy/tests
+  '';
+
+  meta = with lib; {
+    description = "Abstraction layer for PyQt5/PyQt4/PySide2/PySide";
+    homepage = "https://github.com/spyder-ide/qtpy";
+    license = licenses.mit;
+  };
+}
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..ed52c191c227
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/quamash/default.nix
@@ -0,0 +1,30 @@
+{ lib, buildPythonPackage, fetchFromGitHub, pytest, isPy3k, pyqt5, pyqt ? pyqt5 }:
+
+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";
+  };
+
+  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..56b80a4676b8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/quandl/default.nix
@@ -0,0 +1,55 @@
+{ lib, fetchPypi, buildPythonPackage, isPy3k, pythonOlder
+# runtime dependencies
+, pandas, numpy, requests, inflection, python-dateutil, six, more-itertools, importlib-metadata
+# test suite dependencies
+, nose, unittest2, flake8, httpretty, mock, jsondate, parameterized, faker, factory_boy
+# additional runtime dependencies are required on Python 2.x
+, pyopenssl, ndg-httpsclient, pyasn1
+}:
+
+buildPythonPackage rec {
+  pname = "quandl";
+  version = "3.5.0";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit version;
+    pname = "Quandl";
+    sha256 = "0zpw0nwqr4g56l9z4my0fahfgpcmfx74acbmv6nfx1dmq5ggraf3";
+  };
+
+  checkInputs = [
+    nose
+    unittest2
+    flake8
+    httpretty
+    mock
+    jsondate
+    parameterized
+    faker
+    factory_boy
+  ];
+
+  propagatedBuildInputs = [
+    pandas
+    numpy
+    requests
+    inflection
+    python-dateutil
+    six
+    more-itertools
+  ] ++ lib.optionals (!isPy3k) [
+    pyopenssl
+    ndg-httpsclient
+    pyasn1
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  meta = with lib; {
+    description = "Quandl Python client library";
+    homepage = "https://github.com/quandl/quandl-python";
+    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..ca6d8f0cfdb3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/quantities/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, numpy
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "quantities";
+  version = "0.12.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "12qx6cgib3wxmm2cvann4zw4jnhhn24ms61ifq9f3jbh31nn6gd3";
+  };
+
+  propagatedBuildInputs = [ numpy ];
+
+  checkPhase = ''
+    ${python.interpreter} setup.py test -V 1
+  '';
+
+  meta = {
+    description = "Quantities is designed to handle arithmetic and";
+    homepage = "https://python-quantities.readthedocs.io/";
+    license = lib.licenses.bsd2;
+  };
+}
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..25b3c113cec6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/querystring-parser/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv, 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/queuelib/default.nix b/nixpkgs/pkgs/development/python-modules/queuelib/default.nix
new file mode 100644
index 000000000000..7471ea180655
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/queuelib/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "queuelib";
+  version = "1.5.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "42b413295551bdc24ed9376c1a2cd7d0b1b0fa4746b77b27ca2b797a276a1a17";
+  };
+
+  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; [ drewkett ];
+  };
+
+}
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..3fbb0fb4042c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/r2pipe/default.nix
@@ -0,0 +1,51 @@
+{ stdenv
+, lib
+, python
+, buildPythonPackage
+, fetchPypi
+, radare2
+, coreutils
+}:
+
+buildPythonPackage rec {
+  pname = "r2pipe";
+  version = "1.5.3";
+
+  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 = "8f3708195c8a6e91c5753940fd348cd821df1389d23b889b01b3e88acf407485";
+  };
+
+  # 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')
+    r2.quit()
+    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..79975ada5015
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rabbitpy/default.nix
@@ -0,0 +1,43 @@
+{ lib, stdenv
+, 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;
+  };
+
+}
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..5c561b6e6541
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/radicale_infcloud/default.nix
@@ -0,0 +1,23 @@
+{ lib, stdenv, 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..8ed5c720ef31
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/radio_beam/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, astropy
+, pytest
+, pytest-astropy
+, astropy-helpers
+, scipy
+}:
+
+buildPythonPackage rec {
+  pname = "radio_beam";
+  version = "0.3.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0g1nqiikv023ab60gfqrvc13kfjv8m70bpfk264vlliaq6mvxdf2";
+  };
+
+  propagatedBuildInputs = [ astropy ];
+
+  nativeBuildInputs = [ astropy-helpers ];
+
+  # Disable automatic update of the astropy-helper module
+  postPatch = ''
+    substituteInPlace setup.cfg --replace "auto_use = True" "auto_use = False"
+  '';
+
+  checkInputs = [ pytest pytest-astropy scipy ];
+
+  # Tests must be run in the build directory
+  checkPhase = ''
+    cd build/lib
+    pytest
+  '';
+
+  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/radish-bdd/default.nix b/nixpkgs/pkgs/development/python-modules/radish-bdd/default.nix
new file mode 100644
index 000000000000..b2d22346dd74
--- /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-parser
+, parse-type
+, pysingleton
+, pytestCheckHook
+, pyyaml
+, tag-expressions
+, lxml
+, pytest-mock
+}:
+
+buildPythonPackage rec {
+  pname = "radish-bdd";
+  version = "0.13.2";
+
+  # Pypi package does not have necessary test fixtures.
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = "radish";
+    rev = "v${version}";
+    sha256 = "1k7l0j8w221pa6k990x4rfm7km4asx5zy4zpzvh029lb9nw2pp8b";
+  };
+
+  propagatedBuildInputs = [
+    lark-parser
+    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/rainbowstream/default.nix b/nixpkgs/pkgs/development/python-modules/rainbowstream/default.nix
new file mode 100644
index 000000000000..c5ec1d3ab4ef
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rainbowstream/default.nix
@@ -0,0 +1,54 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, python
+, pkgs
+, pillow
+, twitter
+, pyfiglet
+, requests
+, arrow
+, dateutil
+, pysocks
+, pocket
+}:
+
+buildPythonPackage rec {
+  pname = "rainbowstream";
+  version = "1.5.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "527d39778c55d88300fe2017913341bfa1b1f0ffdc1fe5eab57a82bf4cd2edb3";
+  };
+
+  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
+  '';
+
+  buildInputs =  [ pkgs.libjpeg pkgs.freetype pkgs.zlib pkgs.glibcLocales pillow twitter pyfiglet requests arrow dateutil pysocks pocket ];
+
+  meta = with lib; {
+    description = "Streaming command-line twitter client";
+    homepage    = "http://www.rainbowstream.org/";
+    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/ramlfications/default.nix b/nixpkgs/pkgs/development/python-modules/ramlfications/default.nix
new file mode 100644
index 000000000000..2d3e2bdc0e03
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ramlfications/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv, 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; [ nand0p ];
+    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..9ed7701a3f45
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/random2/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPyPy
+}:
+
+buildPythonPackage rec {
+  pname = "random2";
+  version = "1.0.1";
+  doCheck = !isPyPy;
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "34ad30aac341039872401595df9ab2c9dc36d0b7c077db1cea9ade430ed1c007";
+  };
+
+  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/rarfile/default.nix b/nixpkgs/pkgs/development/python-modules/rarfile/default.nix
new file mode 100644
index 000000000000..22c34b82a5fa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rarfile/default.nix
@@ -0,0 +1,42 @@
+{ lib, stdenv, 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..236970a5d343
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rasterio/default.nix
@@ -0,0 +1,29 @@
+{ buildPythonPackage, lib, fetchFromGitHub, isPy3k
+, cython, setuptools
+, numpy, affine, attrs, cligj, click-plugins, snuggs, gdal
+, pytest, pytestcov, packaging, hypothesis, boto3, mock
+}:
+
+buildPythonPackage rec {
+  pname = "rasterio";
+  version = "1.1.5";
+
+  # Pypi doesn't ship the tests, so we fetch directly from GitHub
+  src = fetchFromGitHub {
+    owner = "mapbox";
+    repo = "rasterio";
+    rev = version;
+    sha256 = "168b6hmx026jsvhnq6s5k0qfhzda02mmx1alax6wqk16mk63mqcz";
+  };
+
+  checkInputs = [ boto3 pytest pytestcov packaging hypothesis ] ++ lib.optional (!isPy3k) mock;
+  nativeBuildInputs = [ cython gdal ];
+  propagatedBuildInputs = [ gdal numpy attrs affine cligj click-plugins snuggs setuptools ];
+
+  meta = with lib; {
+    description = "Python package to read and write geospatial raster data";
+    license = licenses.bsd3;
+    homepage = "https://rasterio.readthedocs.io/en/latest/";
+    maintainers = with maintainers; [ mredaelli ];
+  };
+}
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..4d3ff6d486b4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ratelimiter/default.nix
@@ -0,0 +1,35 @@
+{
+  lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, pytest
+, glibcLocales
+}:
+
+buildPythonPackage rec {
+  pname = "ratelimiter";
+  version = "1.2.0.post0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "5c395dcabdbbde2e5178ef3f89b568a3066454a6ddc223b76473dac22f89b4f7";
+  };
+
+  LC_ALL = "en_US.utf-8";
+
+  nativeBuildInputs = [ glibcLocales ];
+
+  checkInputs = [ pytest ];
+
+  checkPhase = ''
+    py.test tests
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/RazerM/ratelimiter";
+    license = licenses.asl20;
+    description = "Simple python rate limiting object";
+    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..45a408640b52
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/raven/default.nix
@@ -0,0 +1,28 @@
+{ lib, buildPythonPackage, fetchFromGitHub, isPy3k
+, contextlib2, blinker
+}:
+
+buildPythonPackage rec {
+  pname = "raven";
+  version = "6.10.0";
+
+  src = fetchFromGitHub {
+    owner = "getsentry";
+    repo = "raven-python";
+    rev = version;
+    sha256 = "16x9ldl8cy7flw5kh7qmgbmflqyf210j3q6ac2lw61sgwajsnvw8";
+  };
+
+  # way too many dependencies to run tests
+  # see https://github.com/getsentry/raven-python/blob/master/setup.py
+  doCheck = false;
+
+  propagatedBuildInputs = [ blinker ] ++ lib.optionals (!isPy3k) [ contextlib2 ];
+
+  meta = {
+    description = "A Python client for Sentry (getsentry.com)";
+    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..974f7ac4d1c6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rawkit/default.nix
@@ -0,0 +1,36 @@
+{ lib, stdenv, 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..507102222fe0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rcssmin/default.nix
@@ -0,0 +1,20 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi }:
+buildPythonPackage rec {
+  pname = "rcssmin";
+  version = "1.0.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0w42l4dhxghcz7pj3q7hkxp015mvb8z2cq9sfxbl31npsfavd1ya";
+  };
+
+  # 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-jsonld/default.nix b/nixpkgs/pkgs/development/python-modules/rdflib-jsonld/default.nix
new file mode 100644
index 000000000000..6e038dd33433
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rdflib-jsonld/default.nix
@@ -0,0 +1,21 @@
+{ buildPythonPackage, fetchPypi, lib, rdflib, nose }:
+
+buildPythonPackage rec {
+  pname = "rdflib-jsonld";
+  version = "0.5.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "4f7d55326405071c7bce9acf5484643bcb984eadb84a6503053367da207105ed";
+  };
+
+  nativeBuildInputs = [ nose ];
+  propagatedBuildInputs = [ rdflib ];
+
+  meta = with lib; {
+    homepage = "https://github.com/RDFLib/rdflib-jsonld";
+    license = licenses.bsdOriginal;
+    description = "rdflib extension adding JSON-LD parser and serializer";
+    maintainers = [ maintainers.koslambrou ];
+  };
+}
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..261ba794e70a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rdflib/default.nix
@@ -0,0 +1,36 @@
+{ buildPythonPackage
+, fetchPypi
+, isodate
+, html5lib
+, SPARQLWrapper
+, networkx
+, nose
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "rdflib";
+  version = "5.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0mdi7xh4zcr3ngqwlgqdqf0i5bxghwfddyxdng1zwpiqkpa9s53q";
+  };
+
+  propagatedBuildInputs = [isodate html5lib SPARQLWrapper ];
+
+  checkInputs = [ networkx nose ];
+
+  # Python 2 syntax
+  # Failing doctest
+  doCheck = false;
+
+  checkPhase = ''
+    ${python.interpreter} run_tests.py
+  '';
+
+  meta = {
+    description = "A Python library for working with RDF, a simple yet powerful language for representing information";
+    homepage = "http://www.rdflib.net/";
+  };
+}
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/readchar/default.nix b/nixpkgs/pkgs/development/python-modules/readchar/default.nix
new file mode 100644
index 000000000000..211f5d63a7dd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/readchar/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub, flake8, pytest, pytestcov, pexpect }:
+
+buildPythonPackage rec {
+  pname = "readchar";
+  version = "2.0.0";
+
+  # Don't use wheels on PyPI
+  src = fetchFromGitHub {
+    owner = "magmax";
+    repo = "python-${pname}";
+    rev = version;
+    sha256 = "0j1vj4f2j8x5f40rs6h8qplklcxcdbvkkvjpkpmr1xagw05i12bm";
+  };
+
+  nativeBuildInputs = [ flake8 ];
+  checkInputs = [ pytest pytestcov 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/readme/default.nix b/nixpkgs/pkgs/development/python-modules/readme/default.nix
new file mode 100644
index 000000000000..044c487eb037
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/readme/default.nix
@@ -0,0 +1,40 @@
+{ lib, stdenv
+, 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..57a84e69d205
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/readme_renderer/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest
+, mock
+, cmarkgfm
+, bleach
+, docutils
+, future
+, pygments
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "readme_renderer";
+  version = "28.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "6b7e5aa59210a40de72eb79931491eaf46fefca2952b9181268bd7c7c65c260a";
+  };
+
+  checkInputs = [ pytest mock ];
+
+  propagatedBuildInputs = [
+    bleach cmarkgfm docutils future pygments six
+  ];
+
+  checkPhase = ''
+    # disable one failing test case
+    # fixtures test is failing for incorrect class name
+    py.test -k "not test_invalid_link and not fixtures"
+  '';
+
+  meta = {
+    description = "readme_renderer is a library for rendering readme descriptions for Warehouse";
+    homepage = "https://github.com/pypa/readme_renderer";
+    license = lib.licenses.asl20;
+  };
+}
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..1a97320dc36a
--- /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.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1d8343982cae238da82c809dcbd82d53f9560b50e17b1dd727123f576385139d";
+  };
+
+  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..750efe357c22
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rebulk/default.nix
@@ -0,0 +1,22 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, pytest, pytestrunner, six, regex}:
+
+buildPythonPackage rec {
+  pname = "rebulk";
+  version = "2.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "320ded3cc456347d828f95e9aa5f8bab77ac01943cad024c06012069fe19690a";
+  };
+
+  # Some kind of trickery with imports that doesn't work.
+  doCheck = false;
+  buildInputs = [ pytest pytestrunner ];
+  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..08e7ff47aa1c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/recaptcha_client/default.nix
@@ -0,0 +1,23 @@
+{ lib, stdenv
+, 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..8ad1e6f7dfa8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/recommonmark/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, CommonMark
+, docutils
+, sphinx
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "recommonmark";
+  version = "0.6.0";
+
+  # PyPI tarball is missing some test files: https://github.com/rtfd/recommonmark/pull/128
+  src = fetchFromGitHub {
+    owner = "rtfd";
+    repo = pname;
+    rev = version;
+    sha256 = "0m6qk17irka448vcz5b39yck1qsq90k98dmkx80mni0w00yq9ggd";
+  };
+
+  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/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..35109e836fa4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/redis/default.nix
@@ -0,0 +1,20 @@
+{ lib, fetchPypi, buildPythonPackage }:
+
+buildPythonPackage rec {
+  pname = "redis";
+  version = "3.5.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0e7e0cfca8660dea8b7d5cd8c4f6c5e29e11f31158c0b0ae91a397f00e5a05a2";
+  };
+
+  # 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..c87a89b82a44
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/reedsolo/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub, cython, nose }:
+
+buildPythonPackage rec {
+  pname = "reedsolo";
+  version = "1.5.4";
+
+  # Pypi does not have the tests
+  src = fetchFromGitHub {
+    owner = "tomerfiliba";
+    repo = "reedsolomon";
+    # https://github.com/tomerfiliba/reedsolomon/issues/28
+    rev = "73926cdf81b39009bd6e46c8d49f3bbc0eaad4e4";
+    sha256 = "03wrr0c32dsl7h9k794b8fwnyzklvmxgriy49mjvvd3val829cc1";
+  };
+
+  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..e9b8beadd16d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/reflink/default.nix
@@ -0,0 +1,33 @@
+{ buildPythonPackage
+, cffi
+, fetchPypi
+, lib
+, pytestCheckHook
+, pytestrunner
+}:
+
+buildPythonPackage rec {
+  pname = "reflink";
+  version = "0.2.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-ySU1gtskQTv9cDq/wbKkneePMbSQcjnyhumhkpoebjo=";
+  };
+
+  propagatedBuildInputs = [ cffi pytestrunner ];
+
+  checkInputs = [ pytestCheckHook ];
+
+  # 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/regex/default.nix b/nixpkgs/pkgs/development/python-modules/regex/default.nix
new file mode 100644
index 000000000000..e4d6baeb425b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/regex/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python
+}:
+
+
+buildPythonPackage rec {
+  pname = "regex";
+  version = "2020.11.13";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "83d6b356e116ca119db8e7c6fc2983289d87b27b3fac238cfe5dca529d884562";
+  };
+
+  postCheck = ''
+    echo "We now run tests ourselves, since the setuptools installer doesn't."
+    ${python.interpreter} -c 'import test_regex; test_regex.test_main();'
+  '';
+
+  # No tests in archive
+  doCheck = false;
+
+  meta = {
+    description = "Alternative regular expression module, to replace re";
+    homepage = "https://bitbucket.org/mrabarnett/mrab-regex";
+    license = lib.licenses.psfl;
+    maintainers = with lib.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..896bc8e02f09
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/reikna/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, sphinx
+, pytestcov
+, pytest
+, Mako
+, numpy
+, funcsigs
+, withCuda ? false, pycuda
+, withOpenCL ? true, pyopencl
+}:
+
+buildPythonPackage rec {
+  pname = "reikna";
+  version = "0.7.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d01f4264c8379ef2962a93aacb002d491b92ef9b5b22b45f77e7821dfa87bef7";
+  };
+
+  checkInputs = [ sphinx pytestcov 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/relatorio/default.nix b/nixpkgs/pkgs/development/python-modules/relatorio/default.nix
new file mode 100644
index 000000000000..b723cd0b1858
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/relatorio/default.nix
@@ -0,0 +1,24 @@
+{ lib, fetchPypi, buildPythonPackage, genshi, lxml, python_magic }:
+
+buildPythonPackage rec {
+  pname = "relatorio";
+  version = "0.9.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0753e78b235b1e8da275509351257a861cf2cf9fafe1b414f8c1deb858a4f94e";
+  };
+
+  propagatedBuildInputs = [
+    genshi
+    lxml
+    python_magic
+  ];
+
+  meta = {
+    homepage = "https://relatorio.tryton.org/";
+    description = "A templating library able to output odt and pdf files";
+    maintainers = with lib.maintainers; [ johbo ];
+    license = lib.licenses.gpl3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/remotecv/default.nix b/nixpkgs/pkgs/development/python-modules/remotecv/default.nix
new file mode 100644
index 000000000000..dc40763f6fe6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/remotecv/default.nix
@@ -0,0 +1,39 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub, pillow, pyres, nose
+, preggy, numpy, yanc, nose-focus, mock, opencv }:
+
+buildPythonPackage rec {
+  pname = "remotecv";
+  version = "2.2.2";
+
+  propagatedBuildInputs = [ pillow pyres ];
+
+  checkInputs = [ nose preggy numpy yanc nose-focus mock opencv ];
+
+  # PyPI tarball doesn't contain tests so let's use GitHub
+  src = fetchFromGitHub {
+    owner = "thumbor";
+    repo = pname;
+    rev = version;
+    sha256 = "0slalp1x626ajy2cbdfifhxf0ffzckqdz6siqsqr6s03hrl877hy";
+  };
+
+  # Remove unnecessary argparse dependency and some seemingly unnecessary
+  # version upper bounds because nixpkgs contains (or could contain) newer
+  # versions.
+  # See: https://github.com/thumbor/remotecv/issues/15
+  patches = [
+    ./install_requires.patch
+  ];
+
+  checkPhase = ''
+    nosetests --with-yanc -s tests/
+  '';
+
+  meta = with lib; {
+    description = "OpenCV worker for facial and feature recognition";
+    homepage = "https://github.com/thumbor/remotecv/wiki";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jluttine ];
+    broken = true; # no longer compatible with latest pillow
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/remotecv/install_requires.patch b/nixpkgs/pkgs/development/python-modules/remotecv/install_requires.patch
new file mode 100644
index 000000000000..37203128486e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/remotecv/install_requires.patch
@@ -0,0 +1,16 @@
+diff --git a/setup.py b/setup.py
+index 70f765c..8003cda 100644
+--- a/setup.py
++++ b/setup.py
+@@ -53,9 +53,8 @@ remotecv is an OpenCV worker for facial and feature recognition
+     },
+ 
+     install_requires=[
+-        "argparse>=1.2.1,<1.3.0",
+-        "pyres>=1.5,<1.6",
+-        "Pillow>=4.3.0,<5.2.0",
++        "pyres>=1.5",
++        "Pillow>=4.3.0",
+     ],
+ 
+     entry_points={
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..a8f0f81ee71d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rencode/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchgit
+, cython
+}:
+
+buildPythonPackage {
+  pname = "rencode";
+  version = "git20150810";
+
+  src = fetchgit {
+    url = "https://github.com/aresch/rencode";
+    rev = "b45e04abdca0dea36e383a8199783269f186c99e";
+    sha256 = "b4bd82852d4220e8a9493d3cfaecbc57b1325708a2d48c0f8acf262edb10dc40";
+  };
+
+  buildInputs = [ cython ];
+
+  meta = with lib; {
+    homepage = "https://github.com/aresch/rencode";
+    description = "Fast (basic) object serialization similar to bencode";
+    license = licenses.gpl3;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/repeated_test/default.nix b/nixpkgs/pkgs/development/python-modules/repeated_test/default.nix
new file mode 100644
index 000000000000..a9355cda41ca
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/repeated_test/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, unittest2
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "repeated_test";
+  version = "1.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "65107444a4945668ab7be6d1a3e1814cee9b2cfc577e7c70381700b11b809d27";
+  };
+
+  buildInputs = [ unittest2 ];
+  propagatedBuildInputs = [ six ];
+
+  meta = with lib; {
+    description = "A quick unittest-compatible framework for repeating a test function over many fixtures";
+    homepage = "https://github.com/epsy/repeated_test";
+    license = licenses.mit;
+  };
+
+}
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..ad8c3aef2eac
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/repocheck/default.nix
@@ -0,0 +1,23 @@
+{ lib, stdenv
+, 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/reportlab/default.nix b/nixpkgs/pkgs/development/python-modules/reportlab/default.nix
new file mode 100644
index 000000000000..3a668077a383
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/reportlab/default.nix
@@ -0,0 +1,48 @@
+{ buildPythonPackage
+, fetchPypi
+, freetype
+, pillow
+, glibcLocales
+, python
+, isPyPy
+}:
+
+let
+  ft = freetype.overrideAttrs (oldArgs: { dontDisableStatic = true; });
+in buildPythonPackage rec {
+  pname = "reportlab";
+  version = "3.5.55";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "4f307accda32c9f17015ed77c7424f904514e349dff063f78d2462d715963e53";
+  };
+
+  checkInputs = [ glibcLocales ];
+
+  buildInputs = [ ft pillow ];
+
+  postPatch = ''
+    # Remove all the test files that require access to the internet to pass.
+    rm tests/test_lib_utils.py
+    rm tests/test_platypus_general.py
+    rm tests/test_platypus_images.py
+
+    # Remove the tests that require Vera fonts installed
+    rm tests/test_graphics_render.py
+    rm tests/test_graphics_charts.py
+  '';
+
+  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..7b8f0ecd8091
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/repoze_lru/default.nix
@@ -0,0 +1,22 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "repoze.lru";
+  version = "0.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0429a75e19380e4ed50c0694e26ac8819b4ea7851ee1fc7583c8572db80aff77";
+  };
+
+  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..53761203113d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/repoze_sphinx_autointerface/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, zope_interface
+, sphinx
+}:
+
+buildPythonPackage rec {
+  pname = "repoze.sphinx.autointerface";
+  version = "0.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "8ef0383276ab722efb1e4a6523726262058dfd82615ccf7e5004aee3fe8ecc23";
+  };
+
+  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..f64158f26a10
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/repoze_who/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, zope_interface
+, webob
+}:
+
+buildPythonPackage rec {
+  pname = "repoze.who";
+  version = "2.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "cf97450de3c8eb5c03b4037be75b018db91befab1094204e452a0b1c0f7a94a6";
+  };
+
+  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..98bed15cfa06
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/reproject/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, numpy
+, astropy
+, astropy-healpix
+, astropy-helpers
+, astropy-extension-helpers
+, scipy
+, pytest
+, pytest-astropy
+, setuptools_scm
+, cython
+}:
+
+buildPythonPackage rec {
+  pname = "reproject";
+  version = "0.7.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1jsc3ad518vyys5987fr1achq8qvnz8rm80zp5an9qxlwr4zmh4m";
+  };
+
+  patches = [ (fetchpatch {
+      # Can be removed in next release after 0.7.1
+      # See https://github.com/astropy/reproject/issues/246
+      url = "https://github.com/astropy/reproject/pull/243.patch";
+      sha256 = "0dq3ii39hsrks0b9v306dlqf07dx0hqad8rwajmzw6rfda9m3c2a";
+    })
+  ];
+
+  propagatedBuildInputs = [ numpy astropy astropy-healpix astropy-helpers scipy ];
+  nativeBuildInputs = [ astropy-helpers cython astropy-extension-helpers setuptools_scm ];
+  checkInputs = [ pytest pytest-astropy ];
+
+  # Tests must be run in the build directory
+  checkPhase = ''
+    cd build/lib*
+    pytest
+  '';
+
+  meta = with lib; {
+    description = "Reproject astronomical images";
+    homepage = "https://reproject.readthedocs.io";
+    license = licenses.bsd3;
+    maintainers = [ maintainers.smaret ];
+  };
+}
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..a2e92283dc72
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/requests-aws4auth/default.nix
@@ -0,0 +1,29 @@
+{ lib, buildPythonPackage, fetchPypi, python, requests }:
+with lib;
+buildPythonPackage rec {
+  pname = "requests-aws4auth";
+  version = "1.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "9a4a5f4a61c49f098f5f669410308ac5b0ea2682fd511ee3a4f9ff73b5bb275a";
+  };
+
+  propagatedBuildInputs = [ requests ];
+
+  # pypi package no longer contains tests
+  doCheck = false;
+  checkPhase = ''
+    cd requests_aws4auth
+    ${python.interpreter} test/requests_aws4auth_test.py
+  '';
+
+  pythonImportsCheck = [ "requests_aws4auth" ];
+
+  meta = {
+    description = "Amazon Web Services version 4 authentication for the Python Requests library.";
+    homepage = "https://github.com/sam-washington/requests-aws4auth";
+    license = licenses.mit;
+    maintainers = [ 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..2b3d57831c8d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/requests-cache/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi
+, mock, requests, six, urllib3 }:
+
+buildPythonPackage rec {
+  pname = "requests-cache";
+  version = "0.5.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "813023269686045f8e01e2289cc1e7e9ae5ab22ddd1e2849a9093ab3ab7270eb";
+  };
+
+  buildInputs = [ mock ];
+  propagatedBuildInputs = [ requests six urllib3 ];
+
+  meta = with lib; {
+    description = "Persistent cache for requests library";
+    homepage = "https://pypi.python.org/pypi/requests-cache";
+    license = licenses.bsd3;
+  };
+}
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..374627a1bb9a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/requests-file/default.nix
@@ -0,0 +1,22 @@
+{ lib, fetchPypi, buildPythonPackage, pytestCheckHook, requests, six }:
+
+buildPythonPackage rec {
+  pname   = "requests-file";
+  version = "1.5.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "07d74208d3389d01c38ab89ef403af0cfec63957d53a0081d8eca738d0247d8e";
+  };
+
+  propagatedBuildInputs = [ requests six ];
+
+  checkInputs = [ pytestCheckHook ];
+
+  meta = {
+    homepage = "https://github.com/dashea/requests-file";
+    description = "Transport adapter for fetching file:// URLs with the requests python library";
+    license = lib.licenses.asl20;
+  };
+
+}
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..188e66b5c7a8
--- /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.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1a5e61cab14627f1b5ba7de0e3fb2b681007ff7b2a49110d504e5cd6d7fd62d6";
+  };
+
+  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..cd36a4528198
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/requests-http-signature/default.nix
@@ -0,0 +1,32 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, requests
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "requests-http-signature";
+  version = "0.1.0";
+
+  # .pem files for tests aren't present on PyPI
+  src = fetchFromGitHub {
+    owner = "pyauth";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0y96wsbci296m1rcxx0ybx8r44rdvyb59p1jl27p7rgz7isr3kx1";
+  };
+
+  propagatedBuildInputs = [ requests ];
+
+  checkPhase = ''
+    ${python.interpreter} test/test.py
+  '';
+
+  meta = with lib; {
+    description = "A Requests auth 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..a1c6f4fb0a1b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/requests-kerberos/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv, fetchFromGitHub, buildPythonPackage, requests, pykerberos, mock }:
+
+buildPythonPackage rec {
+  pname = "requests-kerberos";
+  version = "0.12.0";
+
+  # tests are not present in the PyPI version
+  src = fetchFromGitHub {
+    owner = "requests";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1qw96aw84nljh9cip372mfv50p1yyirfgigavvavgpc3c5g278s6";
+  };
+
+  checkInputs = [ mock ];
+  propagatedBuildInputs = [ requests pykerberos ];
+
+  # they have a setup.py which mentions a test suite that doesn't exist...
+  patches = [ ./fix_setup.patch ];
+
+  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-kerberos/fix_setup.patch b/nixpkgs/pkgs/development/python-modules/requests-kerberos/fix_setup.patch
new file mode 100644
index 000000000000..67cc3a60f77e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/requests-kerberos/fix_setup.patch
@@ -0,0 +1,9 @@
+--- ./setup.py	1980-01-02 00:00:00.000000000 +0000
++++ ./setup.py	1980-01-02 00:00:00.000000000 +0000
+@@ -56,6 +56,5 @@
+         ':sys_platform=="win32"': ['winkerberos>=0.5.0'],
+         ':sys_platform!="win32"': ['pykerberos>=1.1.8,<2.0.0'],
+     },
+-    test_suite='test_requests_kerberos',
+     tests_require=['mock'],
+ )
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..5e85ba7d38bd
--- /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.8.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "e68f46844e4cee9d447150343c9ae875f99fa8037c6dcf5f15bf1fe9ab43d226";
+  };
+
+  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..aed6576c90df
--- /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.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0smaxs5ixng4z0k6dsgmm6s972ka3p6a2ykdpnl23mqzlw0ic9ml";
+  };
+
+  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-toolbelt/default.nix b/nixpkgs/pkgs/development/python-modules/requests-toolbelt/default.nix
new file mode 100644
index 000000000000..5a87d0a0e05b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/requests-toolbelt/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, requests
+, betamax
+, mock
+, pytest
+, pyopenssl
+}:
+
+buildPythonPackage rec {
+  pname = "requests-toolbelt";
+  version = "0.9.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "968089d4584ad4ad7c171454f0a5c6dac23971e9472521ea3b6d49d610aa6fc0";
+  };
+
+  checkInputs = [ pyopenssl betamax mock pytest ];
+  propagatedBuildInputs = [ requests ];
+
+  checkPhase = ''
+    # disabled tests access the network
+    py.test tests -k "not test_no_content_length_header \
+                  and not test_read_file \
+                  and not test_reads_file_from_url_wrapper"
+  '';
+
+  meta = {
+    description = "A toolbelt of useful classes and functions to be used with python-requests";
+    homepage = "http://toolbelt.rtfd.org";
+    license = lib.licenses.asl20;
+    maintainers = with lib.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..f98b68c13a0b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/requests-unixsocket/default.nix
@@ -0,0 +1,29 @@
+{ lib, buildPythonPackage, fetchPypi
+, pbr, requests
+, pytest, waitress }:
+
+buildPythonPackage rec {
+  pname = "requests-unixsocket";
+  version = "0.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "9e5c1a20afc3cf786197ae59c79bcdb0e7565f218f27df5f891307ee8817c1ea";
+  };
+
+  nativeBuildInputs = [ pbr ];
+  propagatedBuildInputs = [ requests ];
+
+  checkInputs = [ pytest waitress ];
+  checkPhase = ''
+    rm pytest.ini
+    py.test
+  '';
+
+  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 = [ maintainers.catern ];
+  };
+}
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..a49b07102201
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/requests/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv, fetchPypi, buildPythonPackage
+, urllib3, idna, chardet, certifi
+, pytest }:
+
+buildPythonPackage rec {
+  pname = "requests";
+  version = "2.25.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1y6mb8c0ipd64d5axq2p368yxndp3f966hmabjka2q2a5y9hn6kz";
+  };
+
+  nativeBuildInputs = [ pytest ];
+  propagatedBuildInputs = [ urllib3 idna chardet certifi ];
+  # sadly, tests require networking
+  doCheck = false;
+
+  meta = with lib; {
+    description = "An Apache2 licensed HTTP library, written in Python, for human beings";
+    homepage = "http://docs.python-requests.org/en/latest/";
+    license = licenses.asl20;
+  };
+}
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..0d91cbc7509f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/requirements-detector/default.nix
@@ -0,0 +1,43 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, isPy27
+, lib
+
+# pythonPackages
+, astroid
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "requirements-detector";
+  version = "0.6";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "landscapeio";
+    repo = pname;
+    rev = version;
+    sha256 = "1sfmm7daz0kpdx6pynsvi6qlfhrzxx783l1wb69c8dfzya4xssym";
+  };
+
+  propagatedBuildInputs = [
+    astroid
+  ];
+
+  checkInputs = [
+    pytest
+  ];
+
+  checkPhase = ''
+    pytest
+  '';
+
+  meta = {
+    description = "Python tool to find and list requirements of a Python project";
+    homepage = "https://github.com/landscapeio/requirements-detector";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [
+      kamadorueda
+    ];
+  };
+}
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..38b4ae9911d2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/resampy/default.nix
@@ -0,0 +1,38 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, pytest
+, pytestcov
+, numpy
+, scipy
+, cython
+, numba
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "resampy";
+  version = "0.2.2";
+
+  # No tests in PyPi Archive
+  src = fetchFromGitHub {
+    owner = "bmcfee";
+    repo = pname;
+    rev = version;
+    sha256 = "0qmkxl5sbgh0j73n667vyi7ywzh09iaync91yp1j5rrcmwsn0qfs";
+  };
+
+  checkInputs = [ pytest pytestcov ];
+  propagatedBuildInputs = [ numpy scipy cython numba six ];
+
+  checkPhase = ''
+    pytest tests
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/bmcfee/resampy";
+    description = "Efficient signal resampling";
+    license = licenses.isc;
+  };
+
+}
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..624094e581e9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/responses/default.nix
@@ -0,0 +1,16 @@
+{ buildPythonPackage, fetchPypi
+, cookies, mock, requests, six }:
+
+buildPythonPackage rec {
+  pname = "responses";
+  version = "0.12.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "2e5764325c6b624e42b428688f2111fea166af46623cb0127c05f6afb14d3457";
+  };
+
+  propagatedBuildInputs = [ cookies mock requests six ];
+
+  doCheck = false;
+}
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..61e2016a4975
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/respx/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, attrs
+, buildPythonPackage
+, fetchFromGitHub
+, httpcore
+, httpx
+, pytest-asyncio
+, pytest-cov
+, pytestCheckHook
+, trio
+, xmltodict
+}:
+
+buildPythonPackage rec {
+  pname = "respx";
+  version = "0.16.3";
+
+  src = fetchFromGitHub {
+    owner = "lundberg";
+    repo = pname;
+    rev = version;
+    sha256 = "0if9sg83rznl37hsjw6pfk78jpxi421g9p21wd92jcd6073g4nbd";
+  };
+
+  # Coverage is under 100 % due to the excluded tests
+  postPatch = ''
+    substituteInPlace setup.cfg --replace "--cov-fail-under 100" ""
+  '';
+
+  propagatedBuildInputs = [ httpx ];
+
+  checkInputs = [
+    httpcore
+    httpx
+    pytest-asyncio
+    pytest-cov
+    pytestCheckHook
+    trio
+  ];
+
+  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/restrictedpython/default.nix b/nixpkgs/pkgs/development/python-modules/restrictedpython/default.nix
new file mode 100644
index 000000000000..d7005e154504
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/restrictedpython/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+
+# Test dependencies
+, pytest, pytest-mock
+}:
+
+buildPythonPackage rec {
+  pname = "RestrictedPython";
+  version = "5.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "9ae16e500782b41bd1abefd8554ccb26330817bba9ce090d385aa226f1ca83e8";
+  };
+
+  #propagatedBuildInputs = [ xmltodict requests ifaddr ];
+
+  checkInputs = [
+    pytest pytest-mock
+  ];
+
+  checkPhase = ''
+    pytest
+  '';
+
+  meta = {
+    homepage = "https://github.com/zopefoundation/RestrictedPython";
+    description = "A restricted execution environment for Python to run untrusted code";
+    license = lib.licenses.zpl21;
+    maintainers = with lib.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..01c7a5e78c62
--- /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.3.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d3b10a1fe2ecac537e51ae6d151b223b78de9fafdd50e5eb6b08c243df173c80";
+  };
+
+  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..acce48c45d04
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/restview/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, docutils
+, readme_renderer
+, packaging
+, pygments
+, mock
+}:
+
+buildPythonPackage rec {
+  pname = "restview";
+  version = "2.9.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "de87c84f19526bd4a76505f6d40b51b7bb03ca43b6067c93f82f1c7237ac9e84";
+  };
+
+  propagatedBuildInputs = [ docutils readme_renderer packaging pygments ];
+  checkInputs = [ mock ];
+
+  patches = [
+    # fix tests after readme_renderer update
+    # TODO remove on next update
+    (fetchpatch {
+      url = "https://github.com/mgedmin/restview/commit/541743ded13ae55dea4c437046984a5f13d06e8b.patch";
+      sha256 = "031b1dlqx346bz7afpc011lslnq771lnxb6iy1l2285pph534bci";
+    })
+  ];
+
+  postPatch = ''
+    # dict order breaking tests
+    sed -i 's@<a href="http://www.example.com" rel="nofollow">@...@' src/restview/tests.py
+  '';
+
+  meta = {
+    description = "ReStructuredText viewer";
+    homepage = "https://mg.pov.lt/restview/";
+    license = lib.licenses.gpl2;
+    maintainers = with lib.maintainers; [ koral ];
+  };
+}
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..b35900233736
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rethinkdb/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, six
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "rethinkdb";
+  version = "2.4.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "945b5efdc10f468fc056bd53a4e4224ec4c2fe1a7e83ae47443bbb6e7c7a1f7d";
+  };
+
+  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..12ba4f9a1a5b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/retry_decorator/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv
+, 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..65127d040f42
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/retrying/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv
+, 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..02a3ef64c573
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/retworkx/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, rustPlatform
+, python
+, fetchFromGitHub
+, pipInstallHook
+, maturin
+, pip
+  # Check inputs
+, pytestCheckHook
+, numpy
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "retworkx";
+  version = "0.6.0";
+
+  src = fetchFromGitHub {
+    owner = "Qiskit";
+    repo = "retworkx";
+    rev = version;
+    sha256 = "11n30ldg3y3y6qxg3hbj837pnbwjkqw3nxq6frds647mmmprrd20";
+  };
+
+  cargoSha256 = "1vg4yf0k6yypqf9z46zz818mz7fdrgxj7zl6zjf7pnm2r8mq3qw5";
+
+  propagatedBuildInputs = [ python ];
+
+  nativeBuildInputs = [ pipInstallHook maturin pip ];
+
+  # Needed b/c need to check AFTER python wheel is installed (using Rust Build, not buildPythonPackage)
+  doCheck = false;
+  doInstallCheck = true;
+
+  installCheckInputs = [ pytestCheckHook numpy ];
+
+  buildPhase = ''
+    runHook preBuild
+    maturin build --release --manylinux off --strip
+    runHook postBuild
+  '';
+
+  installPhase = ''
+    install -Dm644 -t dist target/wheels/*.whl
+    pipInstallPhase
+  '';
+
+  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..c002f0baaa9d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rfc-bibtex/default.nix
@@ -0,0 +1,20 @@
+{ lib, stdenv, 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/rfc3986/default.nix b/nixpkgs/pkgs/development/python-modules/rfc3986/default.nix
new file mode 100644
index 000000000000..561bda08d0cd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rfc3986/default.nix
@@ -0,0 +1,22 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, idna, pytestCheckHook }:
+
+buildPythonPackage rec {
+  pname = "rfc3986";
+  version = "1.4.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "17dvx15m3r49bmif5zlli8kzjd6bys6psixzbp14sd5367d9h8qi";
+  };
+
+  propagatedBuildInputs = [ idna ];
+
+  checkInputs = [ pytestCheckHook ];
+
+  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..1ec8fc2153c1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rfc3987/default.nix
@@ -0,0 +1,19 @@
+{ lib, stdenv, 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..4e47915bdf76
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rfc6555/default.nix
@@ -0,0 +1,28 @@
+{ lib, buildPythonPackage, fetchPypi, pythonPackages }:
+
+buildPythonPackage rec {
+  pname = "rfc6555";
+  version = "0.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "05sjrd6jc0sdvx0z7d3llk82rx366jlmc7ijam0nalsv66hbn70r";
+  };
+
+  propagatedBuildInputs = with pythonPackages; [ selectors2 ];
+
+  checkInputs = with pythonPackages; [ mock pytest ];
+  # disabling tests that require a functional DNS IPv{4,6} stack to pass.
+  patches = [ ./disable_network_tests.patch ];
+  # default doCheck = true; is not enough, apparently
+  postCheck = ''
+    py.test tests/
+  '';
+
+  meta = with lib; {
+    description = "Python implementation of the Happy Eyeballs Algorithm";
+    homepage = "https://pypi.org/project/rfc6555";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ endocrimes ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rfc6555/disable_network_tests.patch b/nixpkgs/pkgs/development/python-modules/rfc6555/disable_network_tests.patch
new file mode 100644
index 000000000000..dc59111ac43f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rfc6555/disable_network_tests.patch
@@ -0,0 +1,31 @@
+diff --git a/tests/test_create_connection.py b/tests/test_create_connection.py
+index fe38026..cdb26b4 100644
+--- a/tests/test_create_connection.py
++++ b/tests/test_create_connection.py
+@@ -6,10 +6,12 @@ from .test_utils import requires_network
+ 
+ 
+ class _BasicCreateConnectionTests(object):
++
+     @requires_network
+     def test_create_connection_google(self):
+         sock = rfc6555.create_connection(('www.google.com', 80))
+ 
++    @requires_network
+     @pytest.mark.parametrize('timeout', [None, 5.0])
+     def test_create_connection_has_proper_timeout(self, timeout):
+         sock = rfc6555.create_connection(('www.google.com', 80), timeout=timeout)
+diff --git a/tests/test_ipv6.py b/tests/test_ipv6.py
+index 3ee8564..f0db28e 100644
+--- a/tests/test_ipv6.py
++++ b/tests/test_ipv6.py
+@@ -2,7 +2,9 @@ import socket
+ import mock
+ import rfc6555
+ 
++from .test_utils import requires_network
+ 
++@requires_network
+ def test_ipv6_available():
+     assert rfc6555._detect_ipv6()
+ 
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/rhpl/builder.sh b/nixpkgs/pkgs/development/python-modules/rhpl/builder.sh
new file mode 100644
index 000000000000..15e05a73f93f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rhpl/builder.sh
@@ -0,0 +1,13 @@
+source $stdenv/setup
+
+rpmextract $src
+tar xfvj rhpl-*.tar.bz2
+rm rhpl-*.tar.bz2
+cd rhpl-*
+incl=$(echo $python/include/python2.*)
+sed -i -e "s@/usr/include/\$(PYTHON)@$incl@" \
+       -e "s@PYTHONLIBDIR = /usr/\$(LIBDIR)/\$(PYTHON)/site-packages@PYTHONLIBDIR = $(toPythonPath $out)@" Makefile.inc
+sed -i -e "s@/usr/bin/install@install@g" \
+       -e "s@\$(DESTDIR)/usr/share/locale@$out/share/locale@" po/Makefile
+make PREFIX=$out
+make PREFIX=$out install
diff --git a/nixpkgs/pkgs/development/python-modules/rhpl/default.nix b/nixpkgs/pkgs/development/python-modules/rhpl/default.nix
new file mode 100644
index 000000000000..bfc53910b29a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rhpl/default.nix
@@ -0,0 +1,19 @@
+{buildPythonPackage, fetchurl, rpmextract, python, wirelesstools, gettext}:
+
+buildPythonPackage {
+  pname = "rhpl";
+  version = "0.218";
+  format = "other";
+
+  src = fetchurl {
+    url = "http://ftp-stud.hs-esslingen.de/pub/Mirrors/archive.fedoraproject.org/fedora/linux/releases/10/Everything/source/SRPMS//rhpl-0.218-1.src.rpm";
+    sha256 = "0c3sc74cjzz5dmpr2gi5naxcc5p2qmzagz7k561xj07njn0ddg16";
+  };
+
+  inherit python;
+
+  builder = ./builder.sh;
+
+  nativeBuildInputs = [ rpmextract  gettext ];
+  buildInputs = [ wirelesstools ];
+}
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..d19f47281cdc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rich/default.nix
@@ -0,0 +1,46 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, CommonMark
+, colorama
+, dataclasses
+, ipywidgets
+, poetry
+, pygments
+, typing-extensions
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "rich";
+  version = "9.1.0";
+
+  # tests not included in pypi tarball
+  src = fetchFromGitHub {
+    owner = "willmcgugan";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "18iha0fs8vm0j11k39yxj26h8qxrp27ijhx6h1yyizbygmr5b5nk";
+  };
+  format = "pyproject";
+
+  nativeBuildInputs = [ poetry ];
+  propagatedBuildInputs = [
+    CommonMark
+    colorama
+    ipywidgets
+    pygments
+    typing-extensions
+  ] ++ lib.optional (pythonOlder "3.7") dataclasses;
+
+  checkInputs = [ pytestCheckHook ];
+  pythonImportsCheck = [ "rich" ];
+
+  meta = with lib; {
+    description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal";
+    homepage = "https://github.com/willmcgugan/rich";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ris ];
+  };
+}
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/ripser/default.nix b/nixpkgs/pkgs/development/python-modules/ripser/default.nix
new file mode 100644
index 000000000000..acd017a7a2e8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ripser/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, cython
+, numpy
+, scipy
+, scikitlearn
+, persim
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "ripser";
+  version = "0.6.0";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "5c47deffbf9e163186b0997f2d59486d96a7c65766e76500f754fadfbc89f5d9";
+  };
+
+  checkInputs = [
+    pytest
+  ];
+
+  propagatedBuildInputs = [
+    cython
+    numpy
+    scipy
+    scikitlearn
+    persim
+  ];
+
+  checkPhase = ''
+    # specifically needed for darwin
+    export HOME=$(mktemp -d)
+    mkdir -p $HOME/.matplotlib
+    echo "backend: ps" > $HOME/.matplotlib/matplotlibrc
+
+    pytest
+  '';
+
+  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..eb9afc8353c7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rising/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, isPy27
+, fetchFromGitHub
+, pytestCheckHook
+, pytestcov
+, dill
+, numpy
+, pytorch
+, threadpoolctl
+, tqdm
+}:
+
+buildPythonPackage rec {
+  pname = "rising";
+  version = "0.2.0post0";
+
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "PhoenixDL";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0fb9894ppcp18wc2dhhjizj8ja53gbv9wpql4mixxxdz8z2bn33c";
+  };
+
+  propagatedBuildInputs = [ numpy pytorch threadpoolctl tqdm ];
+  checkInputs = [ dill pytestcov 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/rjsmin/default.nix b/nixpkgs/pkgs/development/python-modules/rjsmin/default.nix
new file mode 100644
index 000000000000..7ca9d711739a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rjsmin/default.nix
@@ -0,0 +1,20 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi }:
+buildPythonPackage rec {
+  pname = "rjsmin";
+  version = "1.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0cmc72rlkvzz8fl89bc83czkx0pcvhzj7yn7m29r8pgnf5fcfpdi";
+  };
+
+  # 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/rl-coach/default.nix b/nixpkgs/pkgs/development/python-modules/rl-coach/default.nix
new file mode 100644
index 000000000000..0ac5d9ab2a3b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rl-coach/default.nix
@@ -0,0 +1,100 @@
+{ stdenv
+, 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/rlp/default.nix b/nixpkgs/pkgs/development/python-modules/rlp/default.nix
new file mode 100644
index 000000000000..eca38c08f014
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rlp/default.nix
@@ -0,0 +1,31 @@
+{ lib, fetchPypi, buildPythonPackage, pytest, hypothesis, eth-utils }:
+
+buildPythonPackage rec {
+  pname = "rlp";
+  version = "2.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "665e8312750b3fc5f7002e656d05b9dcb6e93b6063df40d95c49ad90c19d1f0e";
+  };
+
+  checkInputs = [ pytest hypothesis ];
+  propagatedBuildInputs = [ eth-utils ];
+
+  # setuptools-markdown uses pypandoc which is broken at the moment
+  preConfigure = ''
+    substituteInPlace setup.py --replace \'setuptools-markdown\' ""
+    substituteInPlace setup.py --replace "long_description_markdown_filename='README.md'," ""
+  '';
+
+  checkPhase = ''
+    pytest .
+  '';
+
+  meta = {
+    description = "A package for encoding and decoding data in and from Recursive Length Prefix notation";
+    homepage = "https://github.com/ethereum/pyrlp";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ gebner ];
+  };
+}
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..8e42baf8ff74
--- /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.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1kmp3iwxxyzjsd47j2sprd47ihhkwhb3yydih3af5bbfq0ibh1w8";
+  };
+
+  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/robomachine/default.nix b/nixpkgs/pkgs/development/python-modules/robomachine/default.nix
new file mode 100644
index 000000000000..fe069be459cc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/robomachine/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv, 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; {
+    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/roboschool/default.nix b/nixpkgs/pkgs/development/python-modules/roboschool/default.nix
new file mode 100644
index 000000000000..3e15f18a3dd1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/roboschool/default.nix
@@ -0,0 +1,77 @@
+{ lib
+, buildPythonPackage
+, isPy3k
+, python
+, fetchFromGitHub
+, fetchpatch
+, qtbase
+, boost
+, assimp
+, gym
+, bullet-roboschool
+, pkg-config
+, which
+}:
+
+buildPythonPackage rec {
+  pname = "roboschool";
+  version = "1.0.39";
+
+  src = fetchFromGitHub {
+    owner = "openai";
+    repo = "roboschool";
+    rev = version;
+    sha256 = "1s7rp5bbiglnrfm33wf7x7kqj0ks3b21bqyz18c5g6vx39rxbrmh";
+  };
+
+  # fails to find boost_python for some reason
+  disabled = !isPy3k;
+
+  propagatedBuildInputs = [
+    gym
+  ];
+
+  nativeBuildInputs = [
+    pkg-config
+    qtbase # needs the `moc` tool
+    which
+  ];
+
+  buildInputs = [
+    bullet-roboschool
+    assimp
+    qtbase
+    boost
+  ];
+
+  NIX_CFLAGS_COMPILE="-I ${python}/include/${python.libPrefix}";
+
+  patches = [
+    # Remove kwarg that was removed in upstream gym
+    # https://github.com/openai/roboschool/pull/180
+    (fetchpatch {
+      name = "remove-close-kwarg.patch";
+      url = "https://github.com/openai/roboschool/pull/180/commits/334f489c8ce7af4887e376139ec676f89da5b16f.patch";
+      sha256 = "0bbz8b63m40a9lrwmh7c8d8gj9kpa8a7svdh08qhrddjkykvip6r";
+    })
+  ];
+
+  preBuild = ''
+    # First build the cpp dependencies
+    cd roboschool/cpp-household
+    make \
+      MOC=moc \
+      -j$NIX_BUILD_CORES
+    cd ../..
+  '';
+
+  # Does a QT sanity check, but QT is not expected to work in isolation
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Open-source software for robot simulation, integrated with OpenAI Gym";
+    homepage = "https://github.com/openai/roboschool";
+    license = licenses.mit;
+    maintainers = with maintainers; [ timokau ];
+  };
+}
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..3cf064d2669d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/robot-detection/default.nix
@@ -0,0 +1,22 @@
+{ lib, stdenv, 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..c3eb309dfe0b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/robotframework-databaselibrary/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv
+, 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..967138620e98
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/robotframework-requests/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, unittest2
+, robotframework
+, lxml
+, requests
+}:
+
+buildPythonPackage rec {
+  version = "0.7.2";
+  pname = "robotframework-requests";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "662e0ce5036a55bcb4cb46ff9741f40c78c670f4fb64cd37714cf83d5fd31774";
+  };
+
+  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-ride/default.nix b/nixpkgs/pkgs/development/python-modules/robotframework-ride/default.nix
new file mode 100644
index 000000000000..39e42596e2ae
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/robotframework-ride/default.nix
@@ -0,0 +1,32 @@
+{ lib, stdenv, fetchurl, buildPythonPackage, isPy3k, pygments, wxPython }:
+
+buildPythonPackage rec {
+  version = "1.2.3";
+  pname = "robotframework-ride";
+  disabled = isPy3k;
+
+  src = fetchurl {
+    url = "https://robotframework-ride.googlecode.com/files/${pname}-${version}.tar.gz";
+    sha256 = "1lf5f4x80f7d983bmkx12sxcizzii21kghs8kf63a1mj022a5x5j";
+  };
+
+  propagatedBuildInputs = [ pygments wxPython ];
+
+  # ride_postinstall.py checks that needed deps are installed and creates a
+  # desktop shortcut. We don't really need it and it clutters up bin/ so
+  # remove it.
+  postInstall = ''
+    rm -f "$out/bin/ride_postinstall.py"
+  '';
+
+  # error: invalid command 'test'
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Light-weight and intuitive editor for Robot Framework test case files";
+    homepage = "https://code.google.com/p/robotframework-ride/";
+    license = licenses.asl20;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ bjornfor ];
+  };
+}
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..5fa87d17d11f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/robotframework-selenium2library/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv, 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..60123d6b87d1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/robotframework-seleniumlibrary/default.nix
@@ -0,0 +1,30 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub, python, robotframework, selenium, mockito, robotstatuschecker, approvaltests }:
+
+buildPythonPackage rec {
+  version = "3.3.1";
+  pname = "robotframework-seleniumlibrary";
+
+  # no tests included in PyPI tarball
+  src = fetchFromGitHub {
+    owner = "robotframework";
+    repo = "SeleniumLibrary";
+    rev = "v${version}";
+    sha256 = "0dabc5dwx0pwsyiy74d7wj97k72yl28a17sasjzrdq819pyc3dvq";
+  };
+
+  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; {
+    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..7e3bcbcc55da
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/robotframework-sshlibrary/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, robotframework
+, paramiko
+, scp
+}:
+
+buildPythonPackage rec {
+  version = "3.5.1";
+  pname = "robotframework-sshlibrary";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "843af44722d1d4e39f616e5441d6f49e82202cd1a8cc9d16637a6475a8ecb023";
+  };
+
+  # 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..5bc7bbceae71
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/robotframework-tools/default.nix
@@ -0,0 +1,50 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+, robotframework
+, moretools
+, pathpy
+, six
+, zetup
+, modeled
+, pytest
+}:
+
+buildPythonPackage rec {
+  version = "0.1rc4";
+  pname = "robotframework-tools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0377ikajf6c3zcy3lc0kh4w9zmlqyplk2c2hb0yyc7h3jnfnya96";
+  };
+
+  nativeBuildInputs = [
+    zetup
+  ];
+
+  propagatedBuildInputs = [
+    robotframework
+    moretools
+    pathpy
+    six
+    modeled
+  ];
+
+  checkInputs = [
+    pytest
+  ];
+
+  checkPhase = ''
+    # tests require network
+    pytest test --ignore test/remote/test_remote.py
+  '';
+
+  meta = with lib; {
+    description = "Python Tools for Robot Framework and Test Libraries";
+    homepage = "https://bitbucket.org/userzimmermann/robotframework-tools";
+    license = licenses.gpl3;
+    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..953602ca1ada
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/robotframework/default.nix
@@ -0,0 +1,19 @@
+{ lib, stdenv, fetchPypi, buildPythonPackage }:
+
+buildPythonPackage rec {
+  pname = "robotframework";
+  version = "3.2.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a0786a916d0572bd9d6afe26e95c6021e3df5dcafa0ece6b302e36366e58c24e";
+    extension = "zip";
+  };
+
+  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..b0bd44f9c152
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/robotstatuschecker/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub, python, robotframework }:
+
+buildPythonPackage rec {
+  version = "1.3";
+  pname = "robotstatuschecker";
+
+  # no tests included in PyPI tarball
+  src = fetchFromGitHub {
+    owner = "robotframework";
+    repo = "statuschecker";
+    rev = version;
+    sha256 = "0rppwwpp4djn5c43x7icwslnxbzcfnnn3c6awpg1k97j69d2nmln";
+  };
+
+  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..126153ec50e5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/robotsuite/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi
+, unittest2, lxml, robotframework
+}:
+
+buildPythonPackage rec {
+  pname = "robotsuite";
+  version = "2.2.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "8764e01990ac6774e0c983579bcb9cb79f44373a61ad47fbae9a1dc7eedbdd61";
+  };
+
+  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..5e3644468fe8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/roku/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv, 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/roman/default.nix b/nixpkgs/pkgs/development/python-modules/roman/default.nix
new file mode 100644
index 000000000000..33f0f7f18d7d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/roman/default.nix
@@ -0,0 +1,22 @@
+{ lib, stdenv
+, 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/roombapy/default.nix b/nixpkgs/pkgs/development/python-modules/roombapy/default.nix
new file mode 100644
index 000000000000..9c438bde7562
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/roombapy/default.nix
@@ -0,0 +1,37 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, hbmqtt
+, lib
+, paho-mqtt
+, poetry
+, pytest-asyncio
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "roombapy";
+  version = "1.6.2-1";
+
+  src = fetchFromGitHub {
+    owner = "pschmitt";
+    repo = "roombapy";
+    rev = version;
+    sha256 = "14k7bys479xwpa4alpdwphzmxm3x8kc48nfqnshn1wj94vyxc425";
+  };
+
+  format = "pyproject";
+
+  nativeBuildInputs = [ poetry ];
+  propagatedBuildInputs = [ paho-mqtt ];
+
+  checkInputs = [ hbmqtt pytest-asyncio pytestCheckHook ];
+  pytestFlagsArray = [ "tests/" "--ignore=tests/test_discovery.py" ];
+  pythonImportsCheck = [ "roombapy" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/pschmitt/roombapy";
+    description = "Python program and library to control Wi-Fi enabled iRobot Roombas";
+    maintainers = with maintainers; [ justinas ];
+    license = licenses.mit;
+  };
+}
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..65edd602d8de
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rope/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, pythonAtLeast, nose }:
+
+buildPythonPackage rec {
+  pname = "rope";
+  version = "0.18.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "786b5c38c530d4846aa68a42604f61b4e69a493390e3ca11b88df0fbfdc3ed04";
+  };
+
+  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.gpl2;
+  };
+}
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..8b193caa7b8b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ropper/default.nix
@@ -0,0 +1,32 @@
+{ lib, stdenv
+, buildPythonApplication
+, fetchPypi
+, capstone
+, filebytes
+, pytest
+}:
+
+buildPythonApplication rec {
+  pname = "ropper";
+  version = "1.13.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "dfc87477c0f53d3d2836a384c106373d761cc435eafc477f299523e5404dda43";
+  };
+  # XXX tests rely on user-writeable /dev/shm to obtain process locks and return PermissionError otherwise
+  # workaround: sudo chmod 777 /dev/shm
+  checkPhase = ''
+    py.test testcases
+  '';
+  doCheck = false; # Tests not included in archive
+
+  checkInputs = [pytest];
+  propagatedBuildInputs = [ capstone filebytes ];
+  meta = with lib; {
+    homepage = "https://scoding.de/ropper/";
+    license = licenses.bsd3;
+    description = "Show information about files in different file formats";
+    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..0129ef69e2c6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/routes/default.nix
@@ -0,0 +1,34 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, repoze_lru
+, six
+, soupsieve
+, webob
+, coverage
+, webtest
+}:
+
+buildPythonPackage rec {
+  pname = "Routes";
+  version = "2.5.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b6346459a15f0cbab01a45a90c3d25caf980d4733d628b4cc1952b865125d053";
+  };
+
+  propagatedBuildInputs = [ repoze_lru six soupsieve webob ];
+  # incompatible with latest soupsieve
+  doCheck = false;
+  checkInputs = [ coverage soupsieve webtest ];
+
+  pythonImportsCheck = [ "routes" ];
+
+  meta = with lib; {
+    description = "A Python re-implementation of the Rails routes system for mapping URLs to application actions";
+    homepage = "http://routes.groovie.org/";
+    license = licenses.mit;
+  };
+
+}
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..fb84adb7d240
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rpdb/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv
+, 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/rpkg/default.nix b/nixpkgs/pkgs/development/python-modules/rpkg/default.nix
new file mode 100644
index 000000000000..731a5738e73e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rpkg/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv, buildPythonPackage, isPy3k, fetchurl, six, pycurl, cccolutils
+, koji, rpmfluff }:
+
+buildPythonPackage rec {
+  pname = "rpkg";
+  version = "1.50";
+
+  disabled = isPy3k;
+
+  src = fetchurl {
+    url = "https://releases.pagure.org/rpkg/${pname}-${version}.tar.gz";
+    sha256 = "0j83bnm9snr3m1mabw2cvd2r7d6kcnkzyz7b9p65fhcc3c7s3rvv";
+  };
+
+
+  propagatedBuildInputs = [ pycurl koji cccolutils six rpmfluff ];
+
+  doCheck = false; # needs /var/lib/rpm database to run tests
+
+  meta = with lib; {
+    description = "Python library for dealing with rpm packaging";
+    homepage = "https://pagure.io/fedpkg";
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ ];
+  };
+
+}
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..0da9d2b71018
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rply/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv, 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/rpmfluff/default.nix b/nixpkgs/pkgs/development/python-modules/rpmfluff/default.nix
new file mode 100644
index 000000000000..96050ba14b01
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rpmfluff/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv
+, 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/2.nix b/nixpkgs/pkgs/development/python-modules/rpy2/2.nix
new file mode 100644
index 000000000000..e178d3c82116
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rpy2/2.nix
@@ -0,0 +1,108 @@
+{ lib
+, python
+, buildPythonPackage
+, fetchPypi
+, isPyPy
+, isPy27
+, readline
+, R
+, rWrapper
+, rPackages
+, pcre
+, lzma
+, bzip2
+, zlib
+, icu
+, singledispatch
+, six
+, jinja2
+, pytz
+, numpy
+, pytest
+, mock
+, extraRPackages ? []
+}:
+
+buildPythonPackage rec {
+    version = "2.8.6"; # python2 support dropped in 2.9.x
+    pname = "rpy2";
+    disabled = isPyPy;
+    src = fetchPypi {
+      inherit version pname;
+      sha256 = "162zki5c1apgv6qbafi7n66y4hgpgp43xag7q75qb6kv99ri6k80";
+    };
+    buildInputs = [
+      readline
+      R
+      pcre
+      lzma
+      bzip2
+      zlib
+      icu
+    ] ++ (with rPackages; [
+      # packages expected by the test framework
+      ggplot2
+      dplyr
+      RSQLite
+      broom
+      DBI
+      dbplyr
+      hexbin
+      lme4
+      tidyr
+
+      # is in upstream's `requires` although it shouldn't be -- this is easier than patching it away
+      pytest
+    ]) ++ extraRPackages ++ rWrapper.recommendedPackages;
+
+    nativeBuildInputs = [
+      R # needed at setup time to detect R_HOME (alternatively set R_HOME explicitly)
+    ];
+
+    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.
+      ./r-libs-site.patch
+    ];
+    postPatch = ''
+      substituteInPlace ${ if isPy27 then "rpy/rinterface/__init__.py" else "rpy2/rinterface_lib/embedded.py" } --replace '@NIX_R_LIBS_SITE@' "$R_LIBS_SITE"
+    '';
+
+    doPatchelf = false; # fails because of "missing filename"
+    patchelfPhase = "";
+
+    propagatedBuildInputs = [
+      singledispatch
+      six
+      jinja2
+      pytz
+      numpy
+    ];
+
+    checkInputs = [
+      pytest
+      mock
+    ];
+    # One remaining test failure caused by different unicode encoding.
+    # https://bitbucket.org/rpy2/rpy2/issues/488
+    doCheck = false;
+    checkPhase = ''
+      ${python.interpreter} -m 'rpy2'
+    '';
+
+    # For some reason libreadline.so is not found. Curiously `ldd _rinterface.so | grep readline` shows two readline entries:
+    # libreadline.so.6 => not found
+    # libreadline.so.6 => /nix/store/z2zhmrg6jcrn5iq2779mav0nnq4vm2q6-readline-6.3p08/lib/libreadline.so.6 (0x00007f333ac43000)
+    # There must be a better way to fix this, but I don't know it.
+    postFixup = ''
+      patchelf --add-needed ${readline}/lib/libreadline.so "$out/${python.sitePackages}/rpy2/rinterface/"_rinterface*.so
+    '';
+
+    meta = {
+      homepage = "http://rpy.sourceforge.net/rpy2";
+      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/default.nix b/nixpkgs/pkgs/development/python-modules/rpy2/default.nix
new file mode 100644
index 000000000000..0b042288fb75
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rpy2/default.nix
@@ -0,0 +1,97 @@
+{ stdenv
+, lib
+, python
+, buildPythonPackage
+, fetchpatch
+, fetchPypi
+, isPyPy
+, R
+, rWrapper
+, rPackages
+, pcre
+, lzma
+, bzip2
+, zlib
+, icu
+, ipython
+, jinja2
+, pytz
+, pandas
+, numpy
+, cffi
+, tzlocal
+, simplegeneric
+, pytestCheckHook
+, extraRPackages ? []
+}:
+
+buildPythonPackage rec {
+    version = "3.4.1";
+    pname = "rpy2";
+
+    disabled = isPyPy;
+    src = fetchPypi {
+      inherit version pname;
+      sha256 = "1qnjjlgh6i31z45jykwd29n1336gq678fn9zw7gh0rv5d6sn0hv4";
+    };
+
+    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
+      lzma
+      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/r-libs-site.patch b/nixpkgs/pkgs/development/python-modules/rpy2/r-libs-site.patch
new file mode 100644
index 000000000000..a55b6038bb4b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rpy2/r-libs-site.patch
@@ -0,0 +1,20 @@
+diff --git a/rpy/rinterface/__init__.py b/rpy/rinterface/__init__.py
+index 9362e57..1af258e 100644
+--- a/rpy/rinterface/__init__.py
++++ b/rpy/rinterface/__init__.py
+@@ -43,6 +43,15 @@ if not R_HOME:
+ if not os.environ.get("R_HOME"):
+     os.environ['R_HOME'] = R_HOME
+ 
++# 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
++
+ if sys.platform == 'win32':
+     _load_r_dll(R_HOME)
+ 
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..a9e10f02b0bb
--- /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 1f4babbf..322363c5 100644
+--- a/rpy2/rinterface_lib/embedded.py
++++ b/rpy2/rinterface_lib/embedded.py
+@@ -118,6 +118,16 @@ def _initr(
+         if openrlib.R_HOME is None:
+             raise ValueError('openrlib.R_HOME cannot be None.')
+         os.environ['R_HOME'] = openrlib.R_HOME
++
++        # 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..e549a00c8948
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rpyc/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, nose
+, plumbum
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "rpyc";
+  version = "5.0.1";
+
+  src = fetchFromGitHub {
+    owner = "tomerfiliba";
+    repo = pname;
+    rev = version;
+    sha256 = "1g75k4valfjgab00xri4pf8c8bb2zxkhgkpyy44fjk7s5j66daa1";
+  };
+
+  propagatedBuildInputs = [ plumbum ];
+
+  checkInputs = [ pytestCheckHook ];
+
+  # Disable tests that requires network access
+  disabledTests = [
+    "test_api"
+    "test_pruning"
+    "test_rpyc"
+  ];
+  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..c9ca5977cb10
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rq/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv, fetchFromGitHub, buildPythonPackage, isPy27, click, redis }:
+
+buildPythonPackage rec {
+  pname = "rq";
+  version = "1.5.2";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "rq";
+    repo = "rq";
+    rev = "v${version}";
+    sha256 = "0ikqmpq0g1qiqwd7ar1286l4hqjb6aj2wr844gihhb8ijzwhp8va";
+  };
+
+  # test require a running redis rerver, which is something we can't do yet
+  doCheck = false;
+
+  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/4_0.nix b/nixpkgs/pkgs/development/python-modules/rsa/4_0.nix
new file mode 100644
index 000000000000..8400647aaad6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rsa/4_0.nix
@@ -0,0 +1,33 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, unittest2
+, pyasn1
+, mock
+, isPy3k
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "rsa";
+  version = "4.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1a836406405730121ae9823e19c6e806c62bbad73f890574fff50efa4122c487";
+  };
+
+  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')"
+  '';
+
+  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/rsa/default.nix b/nixpkgs/pkgs/development/python-modules/rsa/default.nix
new file mode 100644
index 000000000000..b688369beb56
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rsa/default.nix
@@ -0,0 +1,37 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, unittest2
+, pyasn1
+, mock
+, isPy3k
+, pythonOlder
+, poetry
+}:
+
+buildPythonPackage rec {
+  pname = "rsa";
+  version = "4.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "109ea5a66744dd859bf16fe904b8d8b627adafb9408753161e766a92e7d681fa";
+  };
+
+  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/rtmidi-python/default.nix b/nixpkgs/pkgs/development/python-modules/rtmidi-python/default.nix
new file mode 100644
index 000000000000..a1d8102fecc1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rtmidi-python/default.nix
@@ -0,0 +1,34 @@
+{ lib, buildPythonPackage, fetchPypi, cython, alsaLib }:
+
+buildPythonPackage rec {
+  pname = "rtmidi-python";
+  version = "0.2.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1wpcaxfpbmsjc78g8841kpixr0a3v6zn0ak058s3mm25kcysp4m0";
+  };
+
+  postPatch = ''
+    rm rtmidi_python.cpp
+  '';
+
+  nativeBuildInputs = [ cython ];
+  buildInputs = [ alsaLib ];
+
+  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; [ hexa ];
+  };
+}
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/rtslib/default.nix b/nixpkgs/pkgs/development/python-modules/rtslib/default.nix
new file mode 100644
index 000000000000..e53756b0181a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rtslib/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv, fetchFromGitHub, buildPythonPackage, six, pyudev, pygobject3 }:
+
+buildPythonPackage rec {
+  pname = "rtslib";
+  version = "2.1.74";
+
+  src = fetchFromGitHub {
+    owner = "open-iscsi";
+    repo = "${pname}-fb";
+    rev = "v${version}";
+    sha256 = "1in10z6ckmkfhykar435k1fmswbfajysv4g9nsav893ij8g694fy";
+  };
+
+  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/ruamel_base/default.nix b/nixpkgs/pkgs/development/python-modules/ruamel_base/default.nix
new file mode 100644
index 000000000000..950f523f4a9a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ruamel_base/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "ruamel.base";
+  version = "1.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1wswxrn4givsm917mfl39rafgadimf1sldpbjdjws00g1wx36hf0";
+  };
+
+  meta = with lib; {
+    description = "Common routines for ruamel packages";
+    homepage = "https://sourceforge.net/projects/ruamel-base/";
+    license = licenses.mit;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ruamel_ordereddict/default.nix b/nixpkgs/pkgs/development/python-modules/ruamel_ordereddict/default.nix
new file mode 100644
index 000000000000..1e5820a37f73
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ruamel_ordereddict/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+, isPyPy
+}:
+
+buildPythonPackage rec {
+  pname = "ruamel.ordereddict";
+  version = "0.4.15";
+  disabled = isPy3k || isPyPy;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d7d9cf8b11e7662deb460260cf062980cd84b87a1d0457132060ab9d44e0a5f4";
+  };
+
+  meta = with lib; {
+    description = "A version of dict that keeps keys in insertion resp. sorted order";
+    homepage = "https://sourceforge.net/projects/ruamel-ordereddict/";
+    license = licenses.mit;
+  };
+
+}
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..6bda50d24ad5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ruamel_yaml/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, ruamel_base
+, ruamel_ordereddict
+, ruamel_yaml_clib
+, isPy3k
+, isPyPy
+}:
+
+buildPythonPackage rec {
+  pname = "ruamel.yaml";
+  version = "0.16.12";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "076cc0bc34f1966d920a49f18b52b6ad559fbe656a0748e3535cf7b3f29ebf9e";
+  };
+
+  # Tests use relative paths
+  doCheck = false;
+
+  propagatedBuildInputs = [ ruamel_base ]
+    ++ lib.optional (!isPy3k) ruamel_ordereddict
+    ++ lib.optional (!isPyPy) ruamel_yaml_clib;
+
+  # causes namespace clash on py27
+  dontUsePythonImportsCheck = !isPy3k;
+  pythonImportsCheck = [
+    "ruamel.yaml"
+    "ruamel.base"
+  ];
+
+  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;
+  };
+
+}
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..debf2aaf7747
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ruamel_yaml_clib/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchhg
+, ruamel_base
+, ruamel_ordereddict
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "ruamel.yaml.clib";
+  version = "0.2.0";
+
+  src = fetchhg {
+    url = "http://hg.code.sf.net/p/ruamel-yaml-clib/code";
+    rev = version;
+    sha256 = "0kq6zi96qlm72lzj90fc2rfk6nm5kqhk6qxdl8wl9s3a42b0v6wl";
+  };
+
+  # outputs match wheel
+  doCheck = false;
+
+  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;
+  };
+
+}
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..edb793c19d51
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rubymarshal/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv, 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..a425c077343f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ruffus/default.nix
@@ -0,0 +1,48 @@
+{ gevent
+, buildPythonPackage
+, fetchFromGitHub
+, hostname
+, pytest
+, python
+, 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/runsnakerun/default.nix b/nixpkgs/pkgs/development/python-modules/runsnakerun/default.nix
new file mode 100644
index 000000000000..1475b0032313
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/runsnakerun/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, squaremap
+, wxPython
+}:
+
+buildPythonPackage rec {
+  pname = "runsnakerun";
+  version = "2.0.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a66a0cdf0333dc3c0830c18e2f3d62f741dea197cd01a7e0059da4886a3a123f";
+  };
+
+  propagatedBuildInputs = [ squaremap wxPython ];
+
+  meta = with lib; {
+    description = "GUI Viewer for Python profiling runs";
+    homepage = "http://www.vrplumber.com/programming/runsnakerun/";
+    license = licenses.bsd3;
+  };
+
+}
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..69b928aad089
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/runway-python/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, flask
+, flask-compress
+, flask-cors
+, flask-sockets
+, imageio
+, numpy
+, scipy
+, pillow
+, gevent
+, wget
+, six
+, colorcet
+, unidecode
+, urllib3
+}:
+
+buildPythonPackage rec {
+  pname = "runway-python";
+  version = "0.6.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "66cf1517dd817bf6db3792608920274f964dd0ced8dabecd925b8bc17aa95740";
+  };
+
+  propagatedBuildInputs = [
+    colorcet
+    flask
+    flask-compress
+    flask-cors
+    flask-sockets
+    gevent
+    imageio
+    numpy
+    pillow
+    scipy
+    six
+    unidecode
+    urllib3
+    wget
+  ];
+
+  # tests are not packaged in the released tarball
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "runway"
+  ];
+
+  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/rx/default.nix b/nixpkgs/pkgs/development/python-modules/rx/default.nix
new file mode 100644
index 000000000000..00808e744a29
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rx/default.nix
@@ -0,0 +1,29 @@
+{ lib, fetchFromGitHub, buildPythonPackage, pythonOlder, nose }:
+
+buildPythonPackage rec {
+  pname = "rx";
+  version = "3.1.0";
+  disabled = pythonOlder "3.6";
+
+  # There are no tests on the pypi source
+  src = fetchFromGitHub {
+    owner = "ReactiveX";
+    repo = "rxpy";
+    rev = "v${version}";
+    sha256 = "0rcwa8001il9p7s096b9gc5yld8cyxvrsmwh1gpc9b87j172z6ax";
+  };
+
+  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;
+
+  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..7f3e6527d060
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rxv/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, defusedxml
+, requests
+, pytest
+, requests-mock
+, mock
+, pytestcov
+, pytest-timeout
+, testtools
+}:
+
+buildPythonPackage rec {
+  pname = "rxv";
+  version = "0.6.0";
+
+  src = fetchFromGitHub {
+    owner = "wuub";
+    repo = pname;
+    # Releases are not tagged
+    rev = "9b586203665031f93960543a272bb1a8f541ed37";
+    sha256 = "1dw3ayrzknai2279bhkgzcapzw06rhijlny33rymlbp7irp0gvnj";
+  };
+
+  propagatedBuildInputs = [ defusedxml requests ];
+
+  checkInputs = [ pytest requests-mock mock pytestcov pytest-timeout testtools ];
+  checkPhase = ''
+    pytest
+  '';
+
+  meta = with lib; {
+    description = "Automation Library for Yamaha RX-V473, RX-V573, RX-V673, RX-V773 receivers";
+    homepage = "https://github.com/wuub/rxv";
+    license = licenses.mit;
+    maintainers = with maintainers; [ flyfloh ];
+  };
+}
+
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..5fbf4b6fab2c
--- /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; [ danharaj ];
+  };
+}
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/s3fs/default.nix b/nixpkgs/pkgs/development/python-modules/s3fs/default.nix
new file mode 100644
index 000000000000..0154059c4f7b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/s3fs/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, docutils, aiobotocore, fsspec }:
+
+buildPythonPackage rec {
+  pname = "s3fs";
+  version = "0.5.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "7396943cbc1cf92eb6f7aa93be5f64a3bfa59d76908262e89bae06e3c87fa59d";
+  };
+
+  buildInputs = [ docutils ];
+  propagatedBuildInputs = [ aiobotocore 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;
+
+  meta = with lib; {
+    description = "S3FS builds on boto3 to provide a convenient Python filesystem interface for S3.";
+    homepage = "https://github.com/dask/s3fs/";
+    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..6f816fc9bb89
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/s3transfer/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, fetchPypi
+, pythonOlder
+, buildPythonPackage
+, docutils
+, mock
+, nose
+, coverage
+, wheel
+, unittest2
+, botocore
+, futures
+}:
+
+buildPythonPackage rec {
+  pname = "s3transfer";
+  version = "0.3.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "921a37e2aefc64145e7b73d50c71bb4f26f46e4c9f414dc648c6245ff92cf7db";
+  };
+
+  propagatedBuildInputs =
+    [ botocore
+    ] ++ lib.optional (pythonOlder "3") futures;
+
+  buildInputs = [
+    docutils
+    mock
+    nose
+    coverage
+    wheel
+    unittest2
+  ];
+
+  checkPhase = ''
+    pushd s3transfer/tests
+    nosetests -v unit/ functional/
+    popd
+  '';
+
+  # version on pypi has no tests/ dir
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/boto/s3transfer";
+    license = licenses.asl20;
+    description = "A library for managing Amazon S3 transfers";
+  };
+}
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..aab3201047d6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sabyenc3/default.nix
@@ -0,0 +1,22 @@
+{ lib, fetchPypi, python3Packages }:
+
+python3Packages.buildPythonPackage rec {
+  pname = "sabyenc3";
+  version = "4.0.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "dfaa0bdd01752a9cfde0d349a8f4e178b04b1cf9c1bc018b287961192cd2bb90";
+  };
+
+  # tests are not included in pypi distribution
+  doCheck = false;
+
+  meta = {
+    description = "yEnc Decoding for Python 3";
+    homepage = "https://github.com/sabnzbd/sabyenc/";
+    license = lib.licenses.lgpl3;
+    maintainers = [ lib.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..35c7a7443299
--- /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.4.6";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "015wa9nhqgd0kb60bw19g86ga25s9mpvsbqkahi3kw6df6j0wzss";
+  };
+
+  # 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..9f97757edad4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sacremoses/default.nix
@@ -0,0 +1,37 @@
+{ buildPythonPackage
+, lib, stdenv
+, 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..d167760c3e0e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/safe/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv
+, 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/safety/default.nix b/nixpkgs/pkgs/development/python-modules/safety/default.nix
new file mode 100644
index 000000000000..c268f2699595
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/safety/default.nix
@@ -0,0 +1,33 @@
+{ lib, buildPythonPackage, fetchPypi, requests, dparse, click, setuptools, pytestCheckHook }:
+
+buildPythonPackage rec {
+  pname = "safety";
+  version = "1.9.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "23bf20690d4400edc795836b0c983c2b4cbbb922233108ff925b7dd7750f00c9";
+  };
+
+  propagatedBuildInputs = [ requests dparse click setuptools ];
+
+  # Disable tests depending on online services
+  checkInputs = [ pytestCheckHook ];
+  dontUseSetuptoolsCheck = true;
+  disabledTests = [
+    "test_check_live"
+    "test_check_live_cached"
+  ];
+
+  preCheck = ''
+    export HOME=$(mktemp -d)
+  '';
+
+  meta = with lib; {
+    description =
+      "Safety checks your installed dependencies for known security vulnerabilities";
+    homepage = "https://github.com/pyupio/safety";
+    license = licenses.mit;
+    maintainers = with maintainers; [ thomasdesr ];
+  };
+}
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..5e6aa5927eca
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/salmon-mail/default.nix
@@ -0,0 +1,34 @@
+{ lib, stdenv, 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; {
+    homepage = "https://salmon-mail.readthedocs.org/";
+    description = "Pythonic mail application server";
+    license = licenses.gpl3;
+    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..a4a19f7ad12e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/samplerate/default.nix
@@ -0,0 +1,36 @@
+{ lib, stdenv
+, buildPythonPackage
+, numpy
+, pkgs
+}:
+
+buildPythonPackage {
+  pname = "scikits.samplerate";
+  version = "0.3.3";
+
+  src = pkgs.fetchgit {
+    url = "https://github.com/cournape/samplerate";
+    rev = "a536c97eb2d6195b5f266ea3cc3a35364c4c2210";
+    sha256 = "0mgic7bs5zv5ji05vr527jlxxlb70f9dg93hy1lzyz2plm1kf7gg";
+  };
+
+  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..d29e89db8462
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/samsungctl/default.nix
@@ -0,0 +1,29 @@
+{ lib, buildPythonPackage, fetchPypi
+, websocket_client
+}:
+
+buildPythonPackage rec {
+  pname = "samsungctl";
+  version = "0.7.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0ipz3fd65rqkxlb02sql0awc3vnslrwb2pfrsnpfnf8bfgxpbh9g";
+  };
+
+  propagatedBuildInputs = [
+    websocket_client
+  ];
+
+  # 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..3a12568c4d6d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/samsungtvws/default.nix
@@ -0,0 +1,32 @@
+{ lib, buildPythonPackage, fetchPypi, isPy27
+, requests
+, websocket_client
+}:
+
+buildPythonPackage rec {
+  pname = "samsungtvws";
+  version = "1.6.0";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "09nls4n0lbnr8nj8105lagr9h2my8lb1s2k285kmsbli36ywd8lj";
+  };
+
+  propagatedBuildInputs = [
+    websocket_client
+    requests
+  ];
+
+  # no tests
+  doCheck = false;
+
+  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/sandboxlib/default.nix b/nixpkgs/pkgs/development/python-modules/sandboxlib/default.nix
new file mode 100644
index 000000000000..42872e318916
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sandboxlib/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, pbr
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "sandboxlib";
+  version = "0.31";
+  disabled = isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0csj8hbpylqdkxcpqkcfs73dfvdqkyj23axi8m9drqdi4dhxb41h";
+  };
+
+  buildInputs = [ pbr ];
+
+  meta = with lib; {
+    description = "Sandboxing Library for Python";
+    homepage = "https://pypi.python.org/pypi/sandboxlib/0.3.1";
+    license = licenses.gpl2;
+  };
+
+}
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..d45c736d8d03
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sane/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, saneBackends
+}:
+
+buildPythonPackage rec {
+  pname = "sane";
+  version = "2.9.1";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "python-sane";
+    sha256 = "JAmOuDxujhsBEm5q16WwR5wHsBPF0iBQm1VYkv5JJd4=";
+  };
+
+  buildInputs = [
+    saneBackends
+  ];
+
+  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/sanic-auth/default.nix b/nixpkgs/pkgs/development/python-modules/sanic-auth/default.nix
new file mode 100644
index 000000000000..c78b6f13d152
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sanic-auth/default.nix
@@ -0,0 +1,24 @@
+{ lib, buildPythonPackage, fetchPypi, sanic, pytestCheckHook }:
+
+buildPythonPackage rec {
+  pname = "Sanic-Auth";
+  version = "0.3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0dc24ynqjraqwgvyk0g9bj87zgpq4xnssl24hnsn7l5vlkmk8198";
+  };
+
+  propagatedBuildInputs = [ sanic ];
+
+  checkInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "sanic_auth" ];
+
+  meta = with lib; {
+    description = "Simple Authentication for Sanic";
+    homepage = "https://github.com/pyx/sanic-auth/";
+    license = licenses.bsdOriginal;
+    maintainers = [ maintainers.arnoldfarkas ];
+  };
+}
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..f503b0b85561
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sanic/default.nix
@@ -0,0 +1,47 @@
+{ lib, buildPythonPackage, fetchPypi
+, aiofiles, httptools, httpx, multidict, ujson, uvloop, websockets
+, pytestCheckHook, beautifulsoup4, gunicorn, httpcore, uvicorn
+, pytest-asyncio, pytest-benchmark, pytest-dependency, pytest-sanic, pytest-sugar, pytestcov
+}:
+
+buildPythonPackage rec {
+  pname = "sanic";
+  version = "20.9.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "06p0lsxqbfbka2yaqlpp0bg5pf7ma44zi6kq7qbb6hhry48dp1w6";
+  };
+
+  patchPhase = ''
+    substituteInPlace setup.py \
+      --replace '"multidict==5.0.0"' '"multidict"' \
+      --replace '"httpx==0.15.4"' '"httpx"' \
+      --replace '"httpcore==0.3.0"' '"httpcore"' \
+      --replace '"pytest==5.2.1"' '"pytest"'
+  '';
+
+  propagatedBuildInputs = [
+    aiofiles httptools httpx multidict ujson uvloop websockets
+  ];
+
+  checkInputs = [
+    pytestCheckHook beautifulsoup4 gunicorn httpcore uvicorn
+    pytest-asyncio pytest-benchmark pytest-dependency pytest-sanic pytest-sugar pytestcov
+  ];
+
+  disabledTests = [
+    "test_gunicorn" # No "examples" directory in pypi distribution.
+    "test_logo" # Fails to filter out "DEBUG asyncio:selector_events.py:59 Using selector: EpollSelector"
+    "test_zero_downtime" # No "examples.delayed_response.app" module in pypi distribution.
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  meta = with lib; {
+    description = "A microframework based on uvloop, httptools, and learnings of flask";
+    homepage = "http://github.com/channelcat/sanic/";
+    license = licenses.mit;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sapi-python-client/default.nix b/nixpkgs/pkgs/development/python-modules/sapi-python-client/default.nix
new file mode 100644
index 000000000000..8a7a62d8ce84
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sapi-python-client/default.nix
@@ -0,0 +1,30 @@
+{ lib, stdenv, git, setuptools, setuptools_scm, fetchFromGitHub, requests, boto3, buildPythonPackage, responses }:
+
+buildPythonPackage rec {
+    pname = "sapi-python-client";
+    version = "0.1.3";
+
+    src = fetchFromGitHub {
+        owner = "keboola";
+        repo = pname;
+        rev  = version;
+        sha256 = "1xja4v5d30hy26lfys21vcz1lcs88v8mvjxwl2dc3wxx2pzdvcf6";
+    };
+
+    postPatch = ''
+        sed -i 's|use_scm_version=True|version="${version}"|' setup.py
+    '';
+
+    doCheck = false; # requires API token and an active keboola bucket
+
+    nativeBuildInputs = [ git setuptools_scm ];
+
+    propagatedBuildInputs = [ setuptools requests boto3 responses ];
+
+    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/sarge/default.nix b/nixpkgs/pkgs/development/python-modules/sarge/default.nix
new file mode 100644
index 000000000000..1d46e65d3490
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sarge/default.nix
@@ -0,0 +1,21 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "sarge";
+  version = "0.1.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f48fb904e64f10ad6bef62422eaf4736acfd9b13ab64ba44822637a9dbb53265";
+  };
+
+  # No tests in PyPI tarball
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://sarge.readthedocs.org/";
+    description = "A wrapper for subprocess which provides command pipeline functionality";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ abbradar ];
+  };
+}
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..06d2d40d1802
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sasmodels/default.nix
@@ -0,0 +1,30 @@
+{ lib, fetchFromGitHub, buildPythonPackage, pytest, numpy, scipy, matplotlib, docutils
+, pyopencl, opencl-headers
+}:
+
+buildPythonPackage rec {
+  pname = "sasmodels";
+  version = "1.0.2";
+
+  src = fetchFromGitHub {
+    owner = "SasView";
+    repo = "sasmodels";
+    rev = "v${version}";
+    sha256 = "1qvh7q0fkls5r8r9mrph6igcvv8x3qsslqsc5jf1n20alcs5zjrl";
+  };
+
+  buildInputs = [ opencl-headers ];
+  checkInputs = [ pytest ];
+  propagatedBuildInputs = [ docutils matplotlib numpy scipy pyopencl ];
+
+  checkPhase = ''
+    HOME=$(mktemp -d) py.test -c ./pytest.ini
+  '';
+
+  meta = {
+    description = "Library of small angle scattering models";
+    homepage = "http://sasview.org";
+    license = lib.licenses.bsd3;
+    maintainers = with lib.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..5aae62972688
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/scales/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv
+, 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/scandir/default.nix b/nixpkgs/pkgs/development/python-modules/scandir/default.nix
new file mode 100644
index 000000000000..f92b1f5a6ed7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/scandir/default.nix
@@ -0,0 +1,20 @@
+{ lib, python, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "scandir";
+  version = "1.10.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 ="1bkqwmf056pkchf05ywbnf659wqlp6lljcdb0y88wr9f0vv32ijd";
+  };
+
+  checkPhase = "${python.interpreter} test/run_tests.py";
+
+  meta = with lib; {
+    description = "A better directory iterator and faster os.walk()";
+    homepage = "https://github.com/benhoyt/scandir";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ abbradar ];
+  };
+}
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..2b9eb5517a46
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/scapy/default.nix
@@ -0,0 +1,77 @@
+{ 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.4";
+
+  disabled = isPyPy;
+
+  src = fetchFromGitHub {
+    owner = "secdev";
+    repo = "scapy";
+    rev = "v${version}";
+    sha256 = "1wpx7gps3g8q5ykbfcd67mxwcs416zg37b53fwfzzlc1m58vhk3p";
+  };
+
+  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
+  '';
+
+  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.gpl2;
+    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..596ed993233e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/schedule/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, mock
+}:
+
+buildPythonPackage rec {
+  pname = "schedule";
+  version = "0.6.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f9fb5181283de4db6e701d476dd01b6a3dd81c38462a54991ddbb9d26db857c9";
+  };
+
+  buildInputs = [ mock ];
+
+  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/default.nix b/nixpkgs/pkgs/development/python-modules/schema/default.nix
new file mode 100644
index 000000000000..1502c7d10abe
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/schema/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, contextlib2, pytest, mock }:
+
+buildPythonPackage rec {
+
+  pname = "schema";
+  version = "0.7.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "4cf529318cfd1e844ecbe02f41f7e5aa027463e7403666a52746f31f04f47a5e";
+  };
+
+  preConfigure = ''
+    substituteInPlace requirements.txt --replace '==' '>='
+  '';
+
+  propagatedBuildInputs = [ contextlib2 ];
+
+  checkInputs = [ pytest mock ];
+  checkPhase = "pytest ./test_schema.py";
+
+  meta = with lib; {
+    description = "Library for validating Python data structures";
+    homepage = "https://github.com/keleshev/schema";
+    license = licenses.mit;
+    maintainers = [ 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..8f479500a138
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/schiene/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, requests
+, beautifulsoup4
+}:
+
+buildPythonPackage rec {
+  pname = "schiene";
+  version = "0.23";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "014aaxmk7yxyml1xgfk3zqallyb5zi04m0v7jgqjkbjqq4n4j3ck";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    beautifulsoup4
+  ];
+
+  # tests are not present
+  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/scikit-bio/default.nix b/nixpkgs/pkgs/development/python-modules/scikit-bio/default.nix
new file mode 100644
index 000000000000..8fa0186498f4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/scikit-bio/default.nix
@@ -0,0 +1,54 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, cython
+, lockfile
+, cachecontrol
+, decorator
+, ipython
+, matplotlib
+, natsort
+, numpy
+, pandas
+, scipy
+, hdmedians
+, scikitlearn
+, coverage
+, python
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  version = "0.5.6";
+  pname = "scikit-bio";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "48b73ec53ce0ff2c2e3e05f3cfcf93527c1525a8d3e9dd4ae317b4219c37f0ea";
+  };
+
+  buildInputs = [ cython ];
+  checkInputs = [ coverage ];
+  propagatedBuildInputs = [ lockfile cachecontrol decorator ipython matplotlib natsort numpy pandas scipy hdmedians scikitlearn ];
+
+  # remove on when version > 0.5.4
+  postPatch = ''
+    sed -i "s/numpy >= 1.9.2, < 1.14.0/numpy/" setup.py
+    sed -i "s/pandas >= 0.19.2, < 0.23.0/pandas/" setup.py
+  '';
+
+  # cython package not included for tests
+  doCheck = false;
+
+  checkPhase = ''
+    ${python.interpreter} -m skbio.test
+  '';
+
+  meta = with lib; {
+    homepage = "http://scikit-bio.org/";
+    description = "Data structures, algorithms and educational resources for bioinformatics";
+    license = licenses.bsd3;
+    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..6694c3abe4df
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/scikit-build/default.nix
@@ -0,0 +1,82 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, distro
+, packaging
+, setuptools
+, wheel
+# Test Inputs
+, cmake
+, codecov
+, coverage
+, cython
+, flake8
+, ninja
+, pathpy
+, pytest
+, pytestcov
+, pytest-mock
+, pytestrunner
+, pytest-virtualenv
+, requests
+, six
+, virtualenv
+}:
+
+buildPythonPackage rec {
+  pname = "scikit-build";
+  version = "0.11.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0p4smkl2rbpl00m5va5qa8hp2hqb3284p2cs6k8zlmi4kgbdyh6s";
+  };
+
+  propagatedBuildInputs = [
+    distro
+    packaging
+    setuptools
+    wheel
+  ];
+  checkInputs = [
+    cmake
+    codecov
+    coverage
+    cython
+    flake8
+    ninja
+    pathpy
+    pytest
+    pytestcov
+    pytest-mock
+    pytestrunner
+    pytest-virtualenv
+    requests
+    six
+    virtualenv
+  ];
+
+  dontUseCmakeConfigure = true;
+
+  disabledTests = lib.concatMapStringsSep " and " (s: "not " + s) ([
+    "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
+  ]);
+
+  checkPhase = ''
+    py.test -k '${disabledTests}'
+  '';
+
+  meta = with lib; {
+    description = "Improved build system generator for CPython C/C++/Fortran/Cython extensions";
+    homepage = "http://scikit-build.org/";
+    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..8705488ba14c
--- /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 = "2019.1.30";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "eb64b6d8e30b8df8f8636d5fc4fd7ca6a9b05938ccd62518c80c1d9e823069dd";
+  };
+
+  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..7923565c3f4f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/scikit-fuzzy/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, isPy27
+, fetchFromGitHub
+, matplotlib
+, networkx
+, nose
+, numpy
+, scipy
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "scikit-fuzzy";
+  version = "unstable-2020-10-03";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = "eecf303b701e3efacdc9b9066207ef605d4facaa";
+    sha256 = "18dl0017iqwc7446hqgabhibgjwdakhmycpis6zpvvkkv4ip5062";
+  };
+
+  propagatedBuildInputs = [ networkx numpy scipy ];
+  checkInputs = [ matplotlib nose pytestCheckHook ];
+
+  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-image/default.nix b/nixpkgs/pkgs/development/python-modules/scikit-image/default.nix
new file mode 100644
index 000000000000..44d2c240ce54
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/scikit-image/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, cython
+, numpy
+, scipy
+, matplotlib
+, networkx
+, six
+, pillow
+, pywavelets
+, dask
+, cloudpickle
+, pytest
+, imageio
+, tifffile
+}:
+
+buildPythonPackage rec {
+  pname = "scikit-image";
+  version = "0.17.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "bd954c0588f0f7e81d9763dc95e06950e68247d540476e06cb77bcbcd8c2d8b3";
+  };
+
+  nativeBuildInputs = [ cython ];
+
+  propagatedBuildInputs = [
+    cloudpickle
+    dask
+    imageio
+    matplotlib
+    networkx
+    numpy
+    pillow
+    pywavelets
+    scipy
+    six
+    tifffile
+  ];
+
+  checkInputs = [ pytest ];
+
+  # No tests in archive
+  doCheck = false;
+
+  meta = {
+    description = "Image processing routines for SciPy";
+    homepage = "https://scikit-image.org";
+    license = lib.licenses.bsd3;
+  };
+}
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..0a5171f22fbf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/scikit-optimize/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, isPy27
+, buildPythonPackage
+, fetchFromGitHub
+, matplotlib
+, numpy
+, scipy
+, scikitlearn
+, pyaml
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "scikit-optimize";
+  version = "0.8.1";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "scikit-optimize";
+    repo = "scikit-optimize";
+    rev = "v${version}";
+    sha256 = "1bz8gxccx8n99abw49j8h5zf3i568g5hcf8nz1yinma8jqhxjkjh";
+  };
+
+  propagatedBuildInputs = [
+    matplotlib
+    numpy
+    scipy
+    scikitlearn
+    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-tda/default.nix b/nixpkgs/pkgs/development/python-modules/scikit-tda/default.nix
new file mode 100644
index 000000000000..f6d573573b9c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/scikit-tda/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, numpy
+, scipy
+, scikitlearn
+, matplotlib
+, numba
+, umap-learn
+, cython
+, ripser
+, persim
+, pillow
+, kmapper
+, tadasets
+, pytest
+, isPy27
+}:
+
+buildPythonPackage rec {
+  pname = "scikit-tda";
+  version = "0.0.4";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "scikit-tda";
+    repo = "scikit-tda";
+    rev = version;
+    sha256 = "0a90k6i9fkmc9gf250b4fidx2fzd2qrn025l74mjk51fvf23q13a";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+    scipy
+    scikitlearn
+    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/scikitlearn/0.20.nix b/nixpkgs/pkgs/development/python-modules/scikitlearn/0.20.nix
new file mode 100644
index 000000000000..81915e83d2dc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/scikitlearn/0.20.nix
@@ -0,0 +1,38 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi
+, gfortran, glibcLocales
+, numpy, scipy, pytest, pillow
+}:
+
+# 0.20.x is the last version that maintains python2 compatibility
+
+buildPythonPackage rec {
+  pname = "scikit-learn";
+  version = "0.20.4";
+  # UnboundLocalError: local variable 'message' referenced before assignment
+  disabled = stdenv.isi686;  # https://github.com/scikit-learn/scikit-learn/issues/5534
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1z3w2c50dwwa297j88pr16pyrjysagsvdj7vrlq40q8777rs7a6z";
+  };
+
+  buildInputs = [ pillow gfortran glibcLocales ];
+  propagatedBuildInputs = [ numpy scipy numpy.blas ];
+  checkInputs = [ pytest ];
+
+  LC_ALL="en_US.UTF-8";
+
+  doCheck = !stdenv.isAarch64;
+  # Skip test_feature_importance_regression - does web fetch
+  checkPhase = ''
+    cd $TMPDIR
+    HOME=$TMPDIR OMP_NUM_THREADS=1 pytest -k "not test_feature_importance_regression" --pyargs sklearn
+  '';
+
+  meta = with lib; {
+    description = "A set of python modules for machine learning and data mining";
+    homepage = "https://scikit-learn.org";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/scikitlearn/default.nix b/nixpkgs/pkgs/development/python-modules/scikitlearn/default.nix
new file mode 100644
index 000000000000..e7307c926320
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/scikitlearn/default.nix
@@ -0,0 +1,67 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, gfortran, glibcLocales
+, numpy, scipy, pytest, pillow
+, cython
+, joblib
+, llvmPackages
+, threadpoolctl
+}:
+
+buildPythonPackage rec {
+  pname = "scikit-learn";
+  version = "0.24.1";
+  # UnboundLocalError: local variable 'message' referenced before assignment
+  disabled = stdenv.isi686;  # https://github.com/scikit-learn/scikit-learn/issues/5534
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "oDNKGALmTWVgIsO/q1anP71r9LEpg0PzaIryFRgQu98=";
+  };
+
+  buildInputs = [
+    pillow
+    gfortran
+    glibcLocales
+  ] ++ lib.optionals stdenv.cc.isClang [
+    llvmPackages.openmp
+  ];
+
+  nativeBuildInputs = [
+    cython
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    scipy
+    numpy.blas
+    joblib
+    threadpoolctl
+  ];
+  checkInputs = [ pytest ];
+
+  LC_ALL="en_US.UTF-8";
+
+  doCheck = !stdenv.isAarch64;
+  # Skip test_feature_importance_regression - does web fetch
+  checkPhase = ''
+    cd $TMPDIR
+    HOME=$TMPDIR OMP_NUM_THREADS=1 pytest -k "not test_feature_importance_regression" --pyargs 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; [ ];
+  };
+}
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..383cf1f70c68
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/scikits-odes/default.nix
@@ -0,0 +1,55 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchPypi
+, fetchurl
+, cython
+, enum34
+, gfortran
+, isPy27
+, isPy3k
+, numpy
+, pytest
+, python
+, scipy
+, sundials
+}:
+
+buildPythonPackage rec {
+  pname = "scikits.odes";
+  version = "2.6.1";
+
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0kbf2n16h9s35x6pavlx6sff0pqr68i0x0609z92a4vadni32n6b";
+  };
+
+  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..8d08e43bc713
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/scipy/default.nix
@@ -0,0 +1,61 @@
+{lib, fetchPypi, python, buildPythonPackage, gfortran, nose, pytest, numpy, pybind11}:
+
+let
+  pybind = pybind11.overridePythonAttrs(oldAttrs: {
+    cmakeFlags = oldAttrs.cmakeFlags ++ [
+      "-DPYBIND11_TEST=off"
+    ];
+    doCheck = false; # Circular test dependency
+  });
+in buildPythonPackage rec {
+  pname = "scipy";
+  version = "1.6.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0rh5b1rwdcvvagld8vpxnpaibszy1skpx39a0fwzd5gx5pwcjvfb";
+  };
+
+  checkInputs = [ nose pytest ];
+  nativeBuildInputs = [ gfortran ];
+  buildInputs = [ numpy.blas pybind ];
+  propagatedBuildInputs = [ numpy ];
+
+  # Remove tests because of broken wrapper
+  prePatch = ''
+    rm scipy/linalg/tests/test_lapack.py
+  '';
+
+  doCheck = true;
+
+  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
+  '';
+
+  checkPhase = ''
+    runHook preCheck
+    pushd dist
+    ${python.interpreter} -c 'import scipy; scipy.test("fast", verbose=10)'
+    popd
+    runHook postCheck
+  '';
+
+  passthru = {
+    blas = numpy.blas;
+  };
+
+  setupPyBuildFlags = [ "--fcompiler='gnu95'" ];
+
+  SCIPY_USE_G77_ABI_WRAPPER = 1;
+
+  meta = {
+    description = "SciPy (pronounced 'Sigh Pie') is open-source software for mathematics, science, and engineering. ";
+    homepage = "https://www.scipy.org/";
+    maintainers = with lib.maintainers; [ fridh ];
+  };
+}
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..f5cd96e71aaf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/scp/default.nix
@@ -0,0 +1,34 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, paramiko
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "scp";
+  version = "0.13.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "8bd748293d7362073169b96ce4b8c4f93bcc62cfc5f7e1d949e01e406a025bd4";
+  };
+
+  propagatedBuildInputs = [
+    paramiko
+  ];
+
+  checkPhase = ''
+    SCPPY_PORT=10022 ${python.interpreter} test.py
+  '';
+
+  #The Pypi package doesn't include the test
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/jbardin/scp.py";
+    description = "SCP module for paramiko";
+    license = licenses.lgpl3;
+    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..7beefa4e8999
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/scramp/default.nix
@@ -0,0 +1,24 @@
+{ lib, buildPythonPackage, fetchFromGitHub, pytestCheckHook }:
+
+buildPythonPackage rec {
+  pname = "scramp";
+  version = "1.2.0";
+
+  src = fetchFromGitHub {
+    owner = "tlocke";
+    repo = "scramp";
+    rev = version;
+    sha256 = "15jb7z5l2lijxr60fb9v55i3f81h6d83c0b7fv5q0fv5q259nv0a";
+  };
+
+  checkInputs = [ 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/scrapy-deltafetch/default.nix b/nixpkgs/pkgs/development/python-modules/scrapy-deltafetch/default.nix
new file mode 100644
index 000000000000..900943a0e153
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/scrapy-deltafetch/default.nix
@@ -0,0 +1,24 @@
+{ stdenv, lib, fetchPypi, buildPythonPackage, scrapy, bsddb3 }:
+
+buildPythonPackage rec {
+  pname = "scrapy-deltafetch";
+  version = "1.2.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1m511psddvlapg492ny36l8rzy7z4i39yx6a1agxzfz6s9b83fq8";
+  };
+
+  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..4f6eecfe9143
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/scrapy-fake-useragent/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv, fetchFromGitHub, buildPythonPackage, pytestCheckHook, pytestcov, 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 pytestcov 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..ab00377f4a0e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/scrapy-splash/default.nix
@@ -0,0 +1,24 @@
+{ stdenv, lib, fetchPypi, buildPythonPackage, scrapy, six }:
+
+buildPythonPackage rec {
+  pname = "scrapy-splash";
+  version = "0.7.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1dg7csdza2hzqskd9b9gx0v3saqsch4f0fwdp0a3p0822aqqi488";
+  };
+
+  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..6887eded3bfd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/scrapy/default.nix
@@ -0,0 +1,108 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, isPy27
+, fetchPypi
+, glibcLocales
+, pytestCheckHook
+, testfixtures
+, pillow
+, twisted
+, cryptography
+, w3lib
+, lxml
+, queuelib
+, pyopenssl
+, service-identity
+, parsel
+, pydispatcher
+, cssselect
+, zope_interface
+, protego
+, jmespath
+, sybil
+, pytest-twisted
+, botocore
+, itemadapter
+, itemloaders
+}:
+
+buildPythonPackage rec {
+  version = "2.4.1";
+  pname = "Scrapy";
+
+  disabled = isPy27;
+
+  checkInputs = [
+    glibcLocales
+    jmespath
+    pytestCheckHook
+    sybil
+    testfixtures
+    pillow
+    pytest-twisted
+    botocore
+  ];
+
+  propagatedBuildInputs = [
+    twisted
+    cryptography
+    cssselect
+    lxml
+    parsel
+    pydispatcher
+    pyopenssl
+    queuelib
+    service-identity
+    w3lib
+    zope_interface
+    protego
+    itemadapter
+    itemloaders
+  ];
+
+  LC_ALL = "en_US.UTF-8";
+
+  # Disable doctest plugin because it causes pytest to hang
+  preCheck = ''
+    substituteInPlace pytest.ini --replace "--doctest-modules" ""
+  '';
+
+  pytestFlagsArray = [
+    "--ignore=tests/test_proxy_connect.py"
+    "--ignore=tests/test_utils_display.py"
+    "--ignore=tests/test_command_check.py"
+  ];
+
+  disabledTests = [
+    "FTPFeedStorageTest"
+    "test_noconnect"
+    "test_retry_dns_error"
+    "test_custom_asyncio_loop_enabled_true"
+    "test_custom_loop_asyncio"
+  ] ++ lib.optionals stdenv.isDarwin [
+    "test_xmliter_encoding"
+    "test_download"
+  ];
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "68c48f01a58636bdf0f6fcd5035a19ecf277b58af24bd70c36dc6e556df3e005";
+  };
+
+  postInstall = ''
+    install -m 644 -D extras/scrapy.1 $out/share/man/man1/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
+  '';
+
+  __darwinAllowLocalNetworking = true;
+
+  meta = with lib; {
+    description = "A fast high-level web crawling and web scraping framework, used to crawl websites and extract structured data from their pages";
+    homepage = "https://scrapy.org/";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ drewkett 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..f71f8d0c263a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/screeninfo/default.nix
@@ -0,0 +1,36 @@
+{ lib, stdenv, buildPythonApplication, fetchPypi, isPy27, isPy36, dataclasses, libX11, libXinerama, libXrandr }:
+
+buildPythonApplication rec {
+  pname = "screeninfo";
+  version = "0.6.6";
+  disabled = isPy27; # dataclasses isn't available for python2
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "c93fcc3c9421cc2046e57468241c4c08c0c6cffd0e05a85cb0b18de8fe8b026f";
+  };
+
+  # dataclasses is a compatibility shim for python 3.6 ONLY
+  patchPhase = if isPy36 then "" else ''
+    substituteInPlace setup.py \
+      --replace "\"dataclasses\"," ""
+  '' + ''
+    substituteInPlace screeninfo/enumerators/xinerama.py \
+      --replace "load_library(\"X11\")" "ctypes.cdll.LoadLibrary(\"${libX11}/lib/libX11.so\")" \
+      --replace "load_library(\"Xinerama\")" "ctypes.cdll.LoadLibrary(\"${libXinerama}/lib/libXinerama.so\")"
+    substituteInPlace screeninfo/enumerators/xrandr.py \
+      --replace "load_library(\"X11\")" "ctypes.cdll.LoadLibrary(\"${libX11}/lib/libX11.so\")" \
+      --replace "load_library(\"Xrandr\")" "ctypes.cdll.LoadLibrary(\"${libXrandr}/lib/libXrandr.so\")"
+  '';
+
+  propagatedBuildInputs = lib.optional isPy36 dataclasses;
+
+  buildInputs = [ libX11 libXinerama libXrandr];
+
+  meta = with lib; {
+    description = "Fetch location and size of physical screens";
+    homepage = "https://github.com/rr-/screeninfo";
+    license = licenses.mit;
+    maintainers = [ maintainers.nickhu ];
+  };
+}
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..ab234ce22434
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/scripttest/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv
+, 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..128e9276608d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/scs/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, blas
+, lapack
+, numpy
+, scipy
+, scs
+  # check inputs
+, nose
+}:
+
+buildPythonPackage rec {
+  inherit (scs) pname version;
+
+  src = fetchFromGitHub {
+    owner = "bodono";
+    repo = "scs-python";
+    rev = "f02abdc0e2e0a5851464e30f6766ccdbb19d73f0"; # need to choose commit manually, untagged
+    sha256 = "174b5s7cwgrn1m55jlrszdl403zhpzc4yl9acs6kjv9slmg1mmjr";
+  };
+
+  preConfigure = ''
+    rm -r scs
+    ln -s ${scs.src} scs
+  '';
+
+  buildInputs = [
+    lapack
+    blas
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    scipy
+  ];
+
+  checkInputs = [ nose ];
+  checkPhase = ''
+    nosetests
+  '';
+  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.gpl3;
+    maintainers = with maintainers; [ drewrisinger ];
+  };
+}
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..0003d9c01312
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sdnotify/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv
+, 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/0.9.1.nix b/nixpkgs/pkgs/development/python-modules/seaborn/0.9.1.nix
new file mode 100644
index 000000000000..79361a491698
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/seaborn/0.9.1.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, nose
+, pandas
+, matplotlib
+}:
+
+buildPythonPackage rec {
+  pname = "seaborn";
+  version = "0.9.1";
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "da33aa8c20a9a342ce73831d02831a10413f54a05471c7f31edf34f225d456ae";
+  };
+
+  checkInputs = [ nose ];
+  propagatedBuildInputs = [ pandas matplotlib ];
+
+  checkPhase = ''
+    nosetests -v
+  '';
+
+  # Computationally very demanding tests
+  doCheck = false;
+
+  meta = {
+    description = "Statisitical data visualization";
+    homepage = "https://seaborn.pydata.org/";
+    license = with lib.licenses; [ bsd3 ];
+    maintainers = [ ];
+  };
+}
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..b3bf8fce0fca
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/seaborn/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, nose
+, pandas
+, matplotlib
+}:
+
+buildPythonPackage rec {
+  pname = "seaborn";
+  version = "0.11.1";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "44e78eaed937c5a87fc7a892c329a7cc091060b67ebd1d0d306b446a74ba01ad";
+  };
+
+  checkInputs = [ nose ];
+  propagatedBuildInputs = [ pandas matplotlib ];
+
+  checkPhase = ''
+    nosetests -v
+  '';
+
+  # Computationally very demanding tests
+  doCheck = false;
+
+  meta = {
+    description = "Statisitical data visualization";
+    homepage = "https://seaborn.pydata.org/";
+    license = with lib.licenses; [ bsd3 ];
+    maintainers = with lib.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..cc9594d04525
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/seabreeze/default.nix
@@ -0,0 +1,43 @@
+{ lib, stdenv
+, fetchFromGitHub
+, buildPythonPackage
+, pyusb
+, numpy
+}:
+
+## 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 = "0.6.0";
+
+  src = fetchFromGitHub {
+    owner = "ap--";
+    repo = "python-seabreeze";
+    rev = "python-seabreeze-v${version}";
+    sha256 = "0bc2s9ic77gz9m40w89snixphxlzib60xa4f49n4zasjrddfz1l8";
+  };
+
+  postInstall = ''
+    mkdir -p $out/etc/udev/rules.d
+    cp misc/10-oceanoptics.rules $out/etc/udev/rules.d/10-oceanoptics.rules
+  '';
+
+  # underlying c libraries are tested and fail
+  # (c libs are used with anaconda, which we don't care about as we use the alternative path, being that of pyusb).
+  doCheck = false;
+
+  propagatedBuildInputs = [ pyusb numpy ];
+
+  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/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..78ddb269f3db
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/secp256k1/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pkg-config
+, pytest
+, pytestrunner
+, cffi
+, secp256k1
+}:
+
+buildPythonPackage rec {
+  pname = "secp256k1";
+  version = "0.13.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a3b43e02d321c09eafa769a6fc2c156f555cab3a7db62175ef2fd21e16cdf20c";
+  };
+
+  nativeBuildInputs = [ pkg-config ];
+  checkInputs = [ pytest pytestrunner ];
+  propagatedBuildInputs = [ cffi secp256k1 ];
+
+  # Tests are not included in archive
+  doCheck = false;
+
+  preConfigure = ''
+    cp -r ${secp256k1.src} libsecp256k1
+    touch libsecp256k1/autogen.sh
+    export INCLUDE_DIR=${secp256k1}/include
+    export LIB_DIR=${secp256k1}/lib
+  '';
+
+  checkPhase = ''
+    py.test tests
+  '';
+
+  postPatch = ''
+    sed -i '38,45d' setup.py
+    substituteInPlace setup.py --replace ", 'pytest-runner==2.6.2'" ""
+  '';
+
+  meta = {
+    homepage = "https://github.com/ludbb/secp256k1-py";
+    description = "Python FFI bindings for secp256k1";
+    license = with lib.licenses; [ mit ];
+    maintainers = with lib.maintainers; [ chris-martin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/secretstorage/2.nix b/nixpkgs/pkgs/development/python-modules/secretstorage/2.nix
new file mode 100644
index 000000000000..378be5be3130
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/secretstorage/2.nix
@@ -0,0 +1,24 @@
+{ lib, fetchPypi, buildPythonPackage, cryptography, dbus-python }:
+
+buildPythonPackage rec {
+  pname = "secretstorage";
+  version = "2.3.1";
+
+  src = fetchPypi {
+    pname = "SecretStorage";
+    inherit version;
+    sha256 = "1di9gx4m27brs6ar774m64s017iz742mnmw39kvfc8skfs3mrxis";
+  };
+
+  propagatedBuildInputs = [ cryptography dbus-python ];
+
+  # Needs a D-Bus Sesison
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/mitya57/secretstorage";
+    description = "Python bindings to FreeDesktop.org Secret Service API";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ orivej ];
+  };
+}
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..157876476761
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/secretstorage/default.nix
@@ -0,0 +1,29 @@
+{ lib, fetchPypi, buildPythonPackage, pythonOlder, cryptography, jeepney }:
+
+buildPythonPackage rec {
+  pname = "secretstorage";
+  version = "3.3.0";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    pname = "SecretStorage";
+    inherit version;
+    sha256 = "1aj669d5s8pmr6y2d286fxd13apnxzw0ivd1dr6xdni9i3rdxkrh";
+  };
+
+  propagatedBuildInputs = [
+    cryptography
+    jeepney
+  ];
+
+  # Needs a D-Bus Sesison
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/mitya57/secretstorage";
+    description = "Python bindings to FreeDesktop.org Secret Service API";
+    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..49fcb52a154f
--- /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.2.1";
+  pname = "secure";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "typeerror";
+    repo = "secure.py";
+    rev = "v${version}";
+    sha256 = "1nbxwi0zccrha6js14ibd596kdi1wpqr7jgs442mqclw4b3f77q5";
+  };
+
+  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/seekpath/default.nix b/nixpkgs/pkgs/development/python-modules/seekpath/default.nix
new file mode 100644
index 000000000000..637b55eec8d7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/seekpath/default.nix
@@ -0,0 +1,36 @@
+{ lib, stdenv, 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..00953a8e9090
--- /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; [ hexa ];
+  };
+}
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..ff6b81d3105d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/selectors2/default.nix
@@ -0,0 +1,30 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi
+, nose, psutil, mock }:
+
+buildPythonPackage rec {
+  version = "2.0.2";
+  pname = "selectors2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1f1bbaac203a23fbc851dc1b5a6e92c50698cc8cefa5873eb5b89eef53d1d82b";
+  };
+
+  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; {
+    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/selectors34/default.nix b/nixpkgs/pkgs/development/python-modules/selectors34/default.nix
new file mode 100644
index 000000000000..ea3b403fdaed
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/selectors34/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, python
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "selectors34";
+  version = "1.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "09f5066337f8a76fb5233f267873f89a27a17c10bf79575954894bb71686451c";
+  };
+
+  propagatedBuildInputs = [ six ];
+
+  checkPhase = ''
+    ${python.interpreter} setup.py test
+  '';
+
+  meta = with lib; {
+    description = "A backport of the selectors module from Python 3.4";
+    homepage = "https://github.com/berkerpeksag/selectors34";
+    license = licenses.psfl;
+    maintainers = with maintainers; [ prusnak ];
+    };
+}
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..664f84933ed7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/selenium/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, stdenv
+, fetchPypi
+, fetchFromGitHub
+, buildPythonPackage
+, geckodriver
+, urllib3
+, xorg
+}:
+
+
+let
+  # Recompiling x_ignore_nofocus.so as the original one dlopen's libX11.so.6 by some
+  # absolute paths. Replaced by relative path so it is found when used in nix.
+  x_ignore_nofocus =
+    fetchFromGitHub {
+      owner = "SeleniumHQ";
+      repo = "selenium";
+      rev = "selenium-3.6.0";
+      sha256 = "13wf4hx4i7nhl4s8xkziwxl0km1j873syrj4amragj6mpip2wn8v";
+    };
+in
+
+buildPythonPackage rec {
+  pname = "selenium";
+  version = "3.141.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "039hf9knvl4s3hp21bzwsp1g5ri9gxsh504dp48lc6nr1av35byy";
+  };
+
+  buildInputs = [xorg.libX11];
+
+  propagatedBuildInputs = [
+    geckodriver urllib3
+  ];
+
+  patchPhase = lib.optionalString stdenv.isLinux ''
+    cp "${x_ignore_nofocus}/cpp/linux-specific/"* .
+    substituteInPlace x_ignore_nofocus.c --replace "/usr/lib/libX11.so.6" "${xorg.libX11.out}/lib/libX11.so.6"
+    cc -c -fPIC x_ignore_nofocus.c -o x_ignore_nofocus.o
+    cc -shared \
+      -Wl,${if stdenv.isDarwin then "-install_name" else "-soname"},x_ignore_nofocus.so \
+      -o x_ignore_nofocus.so \
+      x_ignore_nofocus.o
+    cp -v x_ignore_nofocus.so selenium/webdriver/firefox/${if stdenv.is64bit then "amd64" else "x86"}/
+  '';
+
+  meta = with lib; {
+    description = "The selenium package is used to automate web browser interaction from Python";
+    homepage = "http://www.seleniumhq.org";
+    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..e939142fd82f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/semantic-version/default.nix
@@ -0,0 +1,20 @@
+{ lib, fetchPypi, buildPythonPackage }:
+
+buildPythonPackage rec {
+  pname = "semantic_version";
+  version = "2.8.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d2cb2de0558762934679b9a104e82eca7af448c9f4974d1f3eeccff651df8a54";
+  };
+
+  # ModuleNotFoundError: No module named 'tests'
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A library implementing the 'SemVer' scheme";
+    license = licenses.bsdOriginal;
+    maintainers = with maintainers; [ layus makefu ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/semantic/default.nix b/nixpkgs/pkgs/development/python-modules/semantic/default.nix
new file mode 100644
index 000000000000..83e4879e1fdd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/semantic/default.nix
@@ -0,0 +1,30 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+, quantities
+, numpy
+}:
+
+buildPythonPackage rec {
+  pname = "semantic";
+  version = "1.0.3";
+  disabled = isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "bbc47dad03dddb1ba5895612fdfa1e43cfb3c497534976cebacd4f3684b505b4";
+  };
+
+  propagatedBuildInputs = [ quantities numpy ];
+
+  # strange setuptools error (can not import semantic.test)
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Common Natural Language Processing Tasks for Python";
+    homepage = "https://github.com/crm416/semantic";
+    license = licenses.mit;
+  };
+
+}
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..71ec776db7c4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/semver/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv
+, fetchFromGitHub
+, buildPythonPackage
+, pytestCheckHook
+, pytestcov
+}:
+
+buildPythonPackage rec {
+  pname = "semver";
+  version = "2.10.2";
+
+  src = fetchFromGitHub {
+    owner = "python-semver";
+    repo = "python-semver";
+    rev = version;
+    sha256 = "0yxjmcgk5iwp53l9z1cg0ajrj18i09ircs11ifpdrggzm8n1blf3";
+  };
+
+  preCheck = "rm -rf dist"; # confuses source vs dist imports in pytest
+  checkInputs = [ pytestCheckHook pytestcov ];
+
+  meta = with lib; {
+    description = "Python package to work with Semantic Versioning (http://semver.org/)";
+    homepage = "https://python-semver.readthedocs.io/en/latest/";
+    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..a91be0151119
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/send2trash/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "Send2Trash";
+  version = "1.5.0";
+
+  src = fetchFromGitHub {
+    owner = "hsoft";
+    repo = "send2trash";
+    rev = version;
+    sha256 = "1c76zldhw2ay7q7r00nnzcampjz9lkqfcbzqpm0iqp5i6bmmv30v";
+  };
+
+  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..77cd35938635
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sendgrid/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, flask
+, pytestCheckHook
+, python-http-client
+, pyyaml
+, starkbank-ecdsa
+, werkzeug
+}:
+
+buildPythonPackage rec {
+  pname = "sendgrid";
+  version = "6.5.0";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = "sendgrid-python";
+    rev = version;
+    sha256 = "14kqjdv49486ksc1s0m0hc4k5nf9vn1v1g489mpib01hiiqxjp1b";
+  };
+
+  propagatedBuildInputs = [
+    python-http-client
+    starkbank-ecdsa
+  ];
+
+  checkInputs = [
+    flask
+    pytestCheckHook
+    pyyaml
+    werkzeug
+  ];
+
+  # Exclude tests that require network access
+  pytestFlagsArray = [
+    "--ignore test/test_sendgrid.py"
+    "--ignore 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/sentencepiece/default.nix b/nixpkgs/pkgs/development/python-modules/sentencepiece/default.nix
new file mode 100644
index 000000000000..dd324260f836
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sentencepiece/default.nix
@@ -0,0 +1,18 @@
+{ buildPythonPackage
+, stdenv
+, 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..6c69ea26b2a6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sentinel/default.nix
@@ -0,0 +1,17 @@
+{ lib, buildPythonPackage, fetchPypi}:
+
+buildPythonPackage rec {
+  pname = "sentinel";
+  version = "0.1.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "c7aeee3f57c56a8e52771fc64230345deecd62c48debbbe1f1aca453439741d0";
+  };
+
+  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/sentry-sdk/default.nix b/nixpkgs/pkgs/development/python-modules/sentry-sdk/default.nix
new file mode 100644
index 000000000000..ea9bbc1f0c3f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sentry-sdk/default.nix
@@ -0,0 +1,67 @@
+{ aiohttp
+, blinker
+, botocore
+, bottle
+, buildPythonPackage
+, celery
+, certifi
+, chalice
+, django
+, falcon
+, fetchPypi
+, flask
+, iana-etc
+, isPy3k
+, libredirect
+, pyramid
+, rq
+, sanic
+, sqlalchemy
+, lib, stdenv
+, tornado
+, urllib3
+, trytond
+, werkzeug
+, executing
+, pure-eval
+, asttokens
+}:
+
+buildPythonPackage rec {
+  pname = "sentry-sdk";
+  version = "0.19.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1052f0ed084e532f66cb3e4ba617960d820152aee8b93fc6c05bd53861768c1c";
+  };
+
+  checkInputs = [ blinker botocore chalice django flask tornado bottle rq falcon sqlalchemy werkzeug trytond
+    executing pure-eval asttokens ]
+  ++ lib.optionals isPy3k [ celery pyramid sanic aiohttp ];
+
+  propagatedBuildInputs = [ urllib3 certifi ];
+
+
+  # The Sentry tests need access to `/etc/protocols` (the tests call
+  # `socket.getprotobyname('tcp')`, which reads from this file). Normally
+  # this path isn't available in the sandbox. Therefore, use libredirect
+  # to make on eavailable from `iana-etc`. This is a test-only operation.
+  preCheck = ''
+    export NIX_REDIRECTS=/etc/protocols=${iana-etc}/etc/protocols
+    export LD_PRELOAD=${libredirect}/lib/libredirect.so
+  '';
+
+  postCheck = "unset NIX_REDIRECTS LD_PRELOAD";
+
+  # no tests
+  doCheck = false;
+  pythonImportsCheck = [ "sentry_sdk" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/getsentry/sentry-python";
+    description = "New Python SDK for Sentry.io";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ 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..095b47db2bff
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sepaxml/default.nix
@@ -0,0 +1,37 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub, isPy27
+, lxml
+, pytest
+, text-unidecode
+, xmlschema
+}:
+
+buildPythonPackage rec {
+  version = "2.2.0";
+  pname = "sepaxml";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "raphaelm";
+    repo = "python-sepaxml";
+    rev = version;
+    sha256 = "1qmgdcz61hs65m2fddwn9jpyk2sxifdb0f3jz1n0lgy774z0pmas";
+  };
+
+  propagatedBuildInputs = [
+    text-unidecode
+    xmlschema
+  ];
+
+  checkInputs = [ pytest lxml ];
+
+  checkPhase = ''
+    pytest
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/raphaelm/python-sepaxml/";
+    description = "SEPA Direct Debit XML generation in python";
+    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..ba4cdca0c636
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/seqdiag/default.nix
@@ -0,0 +1,31 @@
+{ lib, stdenv, fetchurl, buildPythonPackage, isPy27, pep8, nose, unittest2, docutils
+, blockdiag
+}:
+
+buildPythonPackage rec {
+  pname = "seqdiag";
+  version = "2.0.0";
+  disabled = isPy27;
+
+  src = fetchurl {
+    url = "mirror://pypi/s/seqdiag/${pname}-${version}.tar.gz";
+    sha256 = "0k7j4f9j3d0325piwvbv90nfh0wzfk2n6s73s6h6nsxmqshcgswk";
+  };
+
+  buildInputs = [ pep8 nose unittest2 docutils ];
+
+  propagatedBuildInputs = [ blockdiag ];
+
+  # Tests fail:
+  #   ...
+  #   ERROR: Failure: OSError ([Errno 2] No such file or directory: '/tmp/nix-build-python2.7-seqdiag-0.9.0.drv-0/seqdiag-0.9.0/src/seqdiag/tests/diagrams/')
+  doCheck = false;
+
+  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/serpent/default.nix b/nixpkgs/pkgs/development/python-modules/serpent/default.nix
new file mode 100644
index 000000000000..36840813b401
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/serpent/default.nix
@@ -0,0 +1,34 @@
+{ stdenv
+, buildPythonPackage
+, fetchPypi
+, lib
+, python
+, isPy27
+, enum34
+, attrs
+, pytz
+}:
+
+buildPythonPackage rec {
+  pname = "serpent";
+  version = "1.30.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "72753820246a7d8486e8b385353e3bbf769abfceec2e850fa527a288b084ff7a";
+  };
+
+  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/serverlessrepo/default.nix b/nixpkgs/pkgs/development/python-modules/serverlessrepo/default.nix
new file mode 100644
index 000000000000..1e6f8307fbca
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/serverlessrepo/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest
+, boto3
+, six
+, pyyaml
+, mock
+}:
+
+buildPythonPackage rec {
+  pname = "serverlessrepo";
+  version = "0.1.10";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "671f48038123f121437b717ed51f253a55775590f00fbab6fbc6a01f8d05c017";
+  };
+
+  propagatedBuildInputs = [
+    six
+    boto3
+    pyyaml
+  ];
+
+  checkInputs = [ pytest mock ];
+
+  checkPhase = ''
+    pytest tests/unit
+  '';
+
+  postPatch = ''
+    substituteInPlace setup.py --replace "pyyaml~=3.12" "pyyaml~=5.1"
+  '';
+
+  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 = lib.licenses.asl20;
+    maintainers = with maintainers; [ dhkl ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/serversyncstorage/default.nix b/nixpkgs/pkgs/development/python-modules/serversyncstorage/default.nix
new file mode 100644
index 000000000000..fa212d6a4de5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/serversyncstorage/default.nix
@@ -0,0 +1,47 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, isPy27
+, testfixtures
+, unittest2
+, webtest
+, pyramid
+, sqlalchemy
+, simplejson
+, mozsvc
+, cornice
+, pyramid_hawkauth
+, pymysql
+, pymysqlsa
+, umemcache
+, WSGIProxy
+, requests
+, pybrowserid
+}:
+
+buildPythonPackage rec {
+  pname = "serversyncstorage";
+  version = "1.6.14";
+  disabled = !isPy27;
+
+  src = fetchFromGitHub {
+    owner = "mozilla-services";
+    repo = "server-syncstorage";
+    rev = version;
+    sha256 = "08xclxj38rav8yay9cijiavv35jbyf6a9jzr24vgcna8pjjnbbmh";
+  };
+
+  checkInputs = [ testfixtures unittest2 webtest ];
+  propagatedBuildInputs = [
+    pyramid sqlalchemy simplejson mozsvc cornice pyramid_hawkauth pymysql
+    pymysqlsa umemcache WSGIProxy requests pybrowserid
+  ];
+
+  meta = with lib; {
+    broken = cornice.version != "0.17";
+    description = "The SyncServer server software, as used by Firefox Sync";
+    homepage = "https://github.com/mozilla-services/server-syncstorage";
+    license = licenses.mpl20;
+    maintainers = with maintainers; [ nadrieril ];
+  };
+}
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..5465fe7c9942
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/service_identity/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, cryptography
+, ipaddress
+, pyasn1
+, pyasn1-modules
+, idna
+, attrs
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "service_identity";
+  version = "18.1.0";
+
+  src = fetchFromGitHub {
+    owner = "pyca";
+    repo = pname;
+    rev = version;
+    sha256 = "1aw475ksmd4vpl8cwfdcsw2v063nbhnnxpy633sb75iqp9aazhlx";
+  };
+
+  propagatedBuildInputs = [
+    pyasn1 pyasn1-modules idna attrs cryptography
+  ] ++ lib.optionals (pythonOlder "3.3") [ ipaddress ];
+
+  checkInputs = [ pytest ];
+  checkPhase = "py.test";
+
+  meta = with lib; {
+    description = "Service identity verification for pyOpenSSL";
+    license = licenses.mit;
+    homepage = "https://service-identity.readthedocs.io";
+  };
+}
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..a9c0e7fda893
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/setproctitle/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "setproctitle";
+  version = "1.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "9b4e48722dd96cbd66d5bf2eab930fff8546cd551dd8d774c8a319448bd381a6";
+  };
+
+  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/setuptools-git/default.nix b/nixpkgs/pkgs/development/python-modules/setuptools-git/default.nix
new file mode 100644
index 000000000000..18fae7b1610b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/setuptools-git/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv
+, 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..ba42c21ad360
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/setuptools-lint/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv, 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..2d9a4b17d40f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/setuptools-rust/default.nix
@@ -0,0 +1,33 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, semantic-version
+, setuptools
+, setuptools_scm
+, toml
+}:
+
+buildPythonPackage rec {
+  pname = "setuptools-rust";
+  version = "0.11.6";
+
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a5b5954909cbc5d66b914ee6763f81fa2610916041c7266105a469f504a7c4ca";
+  };
+
+  nativeBuildInputs = [ setuptools_scm ];
+
+  propagatedBuildInputs = [ semantic-version setuptools toml ];
+
+  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; [ danieldk ];
+  };
+}
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..d8558aaf83a7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/setuptools-scm-git-archive/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, setuptools_scm, pytest }:
+
+buildPythonPackage rec {
+  pname = "setuptools-scm-git-archive";
+  version = "1.1";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "setuptools_scm_git_archive";
+    sha256 = "6026f61089b73fa1b5ee737e95314f41cb512609b393530385ed281d0b46c062";
+  };
+
+  nativeBuildInputs = [ setuptools_scm ];
+
+  checkInputs = [ pytest ];
+
+  doCheck = false;
+  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/44.0.nix b/nixpkgs/pkgs/development/python-modules/setuptools/44.0.nix
new file mode 100644
index 000000000000..7c7d6b01e408
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/setuptools/44.0.nix
@@ -0,0 +1,83 @@
+{ stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, python
+, wrapPython
+, unzip
+, callPackage
+, bootstrapped-pip
+, lib
+, pipInstallHook
+, setuptoolsBuildHook
+}:
+
+let
+  pname = "setuptools";
+  version = "44.0.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}";
+      sha256 = "0z3q0qinyp1rmnxkw3y5f6nbsxhqlfq5k7skfrqa6ymb3zr009y1";
+      name = "${pname}-${version}-source";
+    };
+
+    patches = [
+      ./tag-date.patch
+    ];
+
+    buildPhase = ''
+      ${python.pythonForBuild.interpreter} bootstrap.py
+      ${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" ${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.strings.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/default.nix b/nixpkgs/pkgs/development/python-modules/setuptools/default.nix
new file mode 100644
index 000000000000..12bbbb7d0e5b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/setuptools/default.nix
@@ -0,0 +1,83 @@
+{ stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, python
+, wrapPython
+, unzip
+, callPackage
+, bootstrapped-pip
+, lib
+, pipInstallHook
+, setuptoolsBuildHook
+}:
+
+let
+  pname = "setuptools";
+  version = "50.3.1";
+
+  # Create an sdist of setuptools
+  sdist = stdenv.mkDerivation rec {
+    name = "${pname}-${version}-sdist.tar.gz";
+
+    src = fetchFromGitHub {
+      owner = "pypa";
+      repo = pname;
+      rev = "v${version}";
+      sha256 = "Z4KHB3Pv4wZPou/Vbp1DFDgDp47OTDfVChGP55GtIJE=";
+      name = "${pname}-${version}-source";
+    };
+
+    patches = [
+      ./tag-date.patch
+    ];
+
+    buildPhase = ''
+      ${python.pythonForBuild.interpreter} bootstrap.py
+      ${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.strings.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/tag-date.patch b/nixpkgs/pkgs/development/python-modules/setuptools/tag-date.patch
new file mode 100644
index 000000000000..441177a5d17e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/setuptools/tag-date.patch
@@ -0,0 +1,12 @@
+diff --git a/setup.cfg b/setup.cfg
+index f23714b6..8aaeb330 100644
+--- a/setup.cfg
++++ b/setup.cfg
+@@ -1,6 +1,6 @@
+ [egg_info]
+ tag_build = .post
+-tag_date = 1
++tag_date = 0
+
+ [aliases]
+ clean_egg_info = egg_info -Db ''
diff --git a/nixpkgs/pkgs/development/python-modules/setuptools_scm/default.nix b/nixpkgs/pkgs/development/python-modules/setuptools_scm/default.nix
new file mode 100644
index 000000000000..a766bb6c294f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/setuptools_scm/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, pip, pytest }:
+
+buildPythonPackage rec {
+  pname = "setuptools_scm";
+  version = "4.1.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a8994582e716ec690f33fec70cca0f85bd23ec974e3f783233e4879090a7faa8";
+  };
+
+  # Requires pytest, circular dependency
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://bitbucket.org/pypa/setuptools_scm/";
+    description = "Handles managing your python package versions in scm metadata";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/setuptoolsdarcs/default.nix b/nixpkgs/pkgs/development/python-modules/setuptoolsdarcs/default.nix
new file mode 100644
index 000000000000..f6358a831c9c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/setuptoolsdarcs/default.nix
@@ -0,0 +1,30 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, darcsver
+}:
+
+buildPythonPackage rec {
+  pname = "setuptools_darcs";
+  version = "1.2.11";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1wsh0g1fn10msqk87l5jrvzs0yj5mp6q9ld3gghz6zrhl9kqzdn1";
+  };
+
+  # In order to break the dependency on darcs -> ghc, we don't add
+  # darcs as a propagated build input.
+  propagatedBuildInputs = [ darcsver ];
+
+  # ugly hack to specify version that should otherwise come from darcs
+  patchPhase = ''
+    substituteInPlace setup.py --replace "name=PKG" "name=PKG, version='${version}'"
+  '';
+
+  meta = with lib; {
+    description = "Setuptools plugin for the Darcs version control system";
+    homepage = "http://allmydata.org/trac/setuptools_darcs";
+    license = licenses.bsd0;
+  };
+}
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..1d29f77cf0f2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/setuptoolstrial/default.nix
@@ -0,0 +1,38 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, pytest
+, virtualenv
+, pytestrunner
+, pytest-virtualenv
+, twisted
+, pathlib2
+}:
+
+buildPythonPackage rec {
+  pname = "setuptools_trial";
+  version = "0.6.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "14220f8f761c48ba1e2526f087195077cf54fad7098b382ce220422f0ff59b12";
+  };
+
+  buildInputs = [ pytest virtualenv pytestrunner 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 nand0p ];
+  };
+
+}
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..89f716d9be25
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sexpdata/default.nix
@@ -0,0 +1,23 @@
+{ lib, stdenv
+, 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..8a37f41086ea
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sfepy/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, buildPythonPackage
+, fetchurl
+, numpy
+, scipy
+, matplotlib
+, pyparsing
+, tables
+, cython
+, python
+, sympy
+}:
+
+buildPythonPackage rec {
+  name = "sfepy_${version}";
+  version = "2019.4";
+
+  src = fetchurl {
+    url="https://github.com/sfepy/sfepy/archive/release_${version}.tar.gz";
+    sha256 = "1l9vgcw09l6bwhgfzlbn68fzpvns25r6nkd1pcp7hz5165hs6zzn";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+    cython
+    scipy
+    matplotlib
+    pyparsing
+    tables
+    sympy
+  ];
+
+  postPatch = ''
+    # broken test
+    rm tests/test_homogenization_perfusion.py
+    rm tests/test_splinebox.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 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; {
+    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..6884bed27483
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sgmllib3k/default.nix
@@ -0,0 +1,27 @@
+{ stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, isPy27
+, lib
+}:
+
+buildPythonPackage rec {
+  pname = "sgmllib3k";
+  version = "1.0.0";
+  disabled = isPy27;
+
+  # fetchFromGitHub instead of fetchPypi to run tests.
+  src = fetchFromGitHub {
+    owner = "hsoft";
+    repo = "sgmllib";
+    rev = "799964676f35349ca2dd04503e34c2b3ad522c0d";
+    sha256 = "0bzf6pv85dzfxfysm6zbj8m40hp0xzr9h8qlk4hp3nmy88rznqvr";
+  };
+
+  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..964512460bf1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sh/default.nix
@@ -0,0 +1,36 @@
+{ lib, buildPythonPackage, fetchPypi, fetchpatch, python, coverage, lsof, glibcLocales, coreutils }:
+
+buildPythonPackage rec {
+  pname = "sh";
+  version = "1.14.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "39aa9af22f6558a0c5d132881cf43e34828ca03e4ae11114852ca6a55c7c1d8e";
+  };
+
+  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..c51490ce6a40
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sh/disable-broken-tests-darwin.patch
@@ -0,0 +1,49 @@
+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>
+---
+ test.py | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/test.py b/test.py
+index f8029c0..ba1d141 100644
+--- a/test.py
++++ b/test.py
+@@ -404,6 +404,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
+ 
+@@ -1004,6 +1005,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
+@@ -1801,6 +1803,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
+@@ -2899,6 +2902,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
+ 
+-- 
+2.27.0
+
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..2225466658d5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/shamir-mnemonic/default.nix
@@ -0,0 +1,22 @@
+{ lib, fetchPypi, buildPythonPackage, isPy3k, click, colorama }:
+
+buildPythonPackage rec {
+  pname = "shamir-mnemonic";
+  version = "0.1.0";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1cc08d276e05b13cd32bd3b0c5d1cb6c30254e0086e0f6857ec106d4cceff121";
+  };
+
+  propagatedBuildInputs = [ click colorama ];
+
+  meta = with lib; {
+    description = "Reference implementation of SLIP-0039";
+    homepage = "https://github.com/trezor/python-shamir-mnemonic";
+    license = licenses.mit;
+    maintainers = with maintainers; [ _1000101 ];
+  };
+}
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..1ce9a879ee19
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/shap/default.nix
@@ -0,0 +1,70 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, isPy27
+, pytestCheckHook
+, numpy
+, scipy
+, scikitlearn
+, pandas
+, tqdm
+, slicer
+, numba
+, matplotlib
+, nose
+, ipython
+}:
+
+buildPythonPackage rec {
+  pname = "shap";
+  version = "0.36.0";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "slundberg";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1wxnxvbz6avzzfqjfbcqd4v879hvpq4021v31fhdpccr2q317rr9";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+    scipy
+    scikitlearn
+    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;
+  };
+}
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..b5dd0be5445c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/shapely/default.nix
@@ -0,0 +1,47 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, substituteAll, pythonOlder
+, geos, pytest, cython
+, numpy
+}:
+
+buildPythonPackage rec {
+  pname = "Shapely";
+  version = "1.7.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0adiz4jwmwxk7k1awqifb1a9bj5x4nx4gglb5dz9liam21674h8n";
+  };
+  disabled = pythonOlder "3.5";
+
+  nativeBuildInputs = [
+    geos # for geos-config
+    cython
+  ];
+
+  checkInputs = [ pytest ];
+
+  propagatedBuildInputs = [ numpy ];
+
+  # environment variable used in shapely/_buildcfg.py
+  GEOS_LIBRARY_PATH = "${geos}/lib/libgeos_c${stdenv.hostPlatform.extensions.sharedLibrary}";
+
+  patches = [
+    (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";
+    })
+  ];
+
+  # Disable the tests that improperly try to use the built extensions
+  checkPhase = ''
+    rm -r shapely # prevent import of local shapely
+    py.test tests
+  '';
+
+  meta = with lib; {
+    description = "Geometric objects, predicates, and operations";
+    maintainers = with maintainers; [ knedlsepp ];
+    homepage = "https://pypi.python.org/pypi/Shapely/";
+  };
+}
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..7681fb1d9bb2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/shapely/library-paths.patch
@@ -0,0 +1,161 @@
+diff --git a/shapely/geos.py b/shapely/geos.py
+index d5a67d2..19b7ffc 100644
+--- a/shapely/geos.py
++++ b/shapely/geos.py
+@@ -61,127 +61,17 @@ def load_dll(libname, fallbacks=None, mode=DEFAULT_MODE):
+             "Could not find lib {} or load any of its variants {}.".format(
+                 libname, fallbacks or []))
+ 
+-_lgeos = None
+-
+-if sys.platform.startswith('linux'):
+-    # Test to see if we have a wheel repaired by 'auditwheel' containing its
+-    # own libgeos_c
+-    geos_whl_so = glob.glob(os.path.abspath(os.path.join(os.path.dirname(
+-        __file__), '.libs/libgeos_c-*.so.*')))
+-    if len(geos_whl_so) == 1:
+-        _lgeos = CDLL(geos_whl_so[0])
+-        LOG.debug("Found GEOS DLL: %r, using it.", _lgeos)
+-    elif hasattr(sys, 'frozen'):
+-        geos_pyinstaller_so = glob.glob(os.path.join(sys.prefix, 'libgeos_c-*.so.*'))
+-        if len(geos_pyinstaller_so) == 1:
+-            _lgeos = CDLL(geos_pyinstaller_so[0])
+-            LOG.debug("Found GEOS DLL: %r, using it.", _lgeos)
+-    elif os.getenv('CONDA_PREFIX', ''):
+-        # conda package.
+-        _lgeos = CDLL(os.path.join(sys.prefix, 'lib', 'libgeos_c.so'))
+-    else:
+-        alt_paths = [
+-            'libgeos_c.so.1',
+-            'libgeos_c.so',
+-        ]
+-        _lgeos = load_dll('geos_c', fallbacks=alt_paths)
+-    # Necessary for environments with only libc.musl
+-    c_alt_paths = [
+-        'libc.musl-x86_64.so.1'
+-    ]
+-    free = load_dll('c', fallbacks=c_alt_paths).free
+-    free.argtypes = [c_void_p]
+-    free.restype = None
+-
+-elif sys.platform == 'darwin':
+-    # Test to see if we have a delocated wheel with a GEOS dylib.
+-    geos_whl_dylib = os.path.abspath(os.path.join(os.path.dirname(
+-        __file__), '.dylibs/libgeos_c.1.dylib'))
+-
+-    if os.path.exists(geos_whl_dylib):
+-        handle = CDLL(None)
+-        if hasattr(handle, "initGEOS_r"):
+-            LOG.debug("GEOS already loaded")
+-            _lgeos = handle
+-        else:
+-            _lgeos = CDLL(geos_whl_dylib)
+-            LOG.debug("Found GEOS DLL: %r, using it.", _lgeos)
+-
+-    elif os.getenv('CONDA_PREFIX', ''):
+-        # conda package.
+-        _lgeos = CDLL(os.path.join(sys.prefix, 'lib', 'libgeos_c.dylib'))
+-    else:
+-        if hasattr(sys, 'frozen'):
+-            try:
+-                # .app file from py2app
+-                alt_paths = [os.path.join(
+-                    os.environ['RESOURCEPATH'], '..', 'Frameworks',
+-                    'libgeos_c.dylib')]
+-            except KeyError:
+-                # binary from pyinstaller
+-                alt_paths = [
+-                    os.path.join(sys.executable, 'libgeos_c.dylib')]
+-                if hasattr(sys, '_MEIPASS'):
+-                    alt_paths.append(
+-                        os.path.join(sys._MEIPASS, 'libgeos_c.1.dylib'))
+-        else:
+-            alt_paths = [
+-                # The Framework build from Kyng Chaos
+-                "/Library/Frameworks/GEOS.framework/Versions/Current/GEOS",
+-                # macports
+-                '/opt/local/lib/libgeos_c.dylib',
+-                # homebrew
+-                '/usr/local/lib/libgeos_c.dylib',
+-            ]
+-        _lgeos = load_dll('geos_c', fallbacks=alt_paths)
+-
+-    # ctypes.CDLL(None) internally calls dlopen(NULL), and as the dlopen
+-    # manpage says, "If filename is NULL, then the returned handle is for the
+-    # main program". This way we can let the linker do the work to figure out
+-    # which libc Python is actually using.
+-    free = CDLL(None).free
+-    free.argtypes = [c_void_p]
+-    free.restype = None
+-
+-elif sys.platform == 'win32':
+-    if os.getenv('CONDA_PREFIX', ''):
+-        # conda package.
+-        _lgeos = CDLL(os.path.join(sys.prefix, 'Library', 'bin', 'geos_c.dll'))
+-    else:
+-        try:
+-            egg_dlls = os.path.abspath(
+-                os.path.join(os.path.dirname(__file__), 'DLLs'))
+-            if hasattr(sys, '_MEIPASS'):
+-                wininst_dlls = sys._MEIPASS
+-            elif hasattr(sys, "frozen"):
+-                wininst_dlls = os.path.normpath(
+-                    os.path.abspath(sys.executable + '../../DLLS'))
+-            else:
+-                wininst_dlls = os.path.abspath(os.__file__ + "../../../DLLs")
+-            original_path = os.environ['PATH']
+-            os.environ['PATH'] = "%s;%s;%s" % \
+-                (egg_dlls, wininst_dlls, original_path)
+-            _lgeos = load_dll("geos_c.dll")
+-        except (ImportError, WindowsError, OSError):
+-            raise
+-
+-        def free(m):
+-            try:
+-                cdll.msvcrt.free(m)
+-            except WindowsError:
+-                # XXX: See http://trac.gispython.org/projects/PCL/ticket/149
+-                pass
+-
+-elif sys.platform == 'sunos5':
+-    _lgeos = load_dll('geos_c', fallbacks=['libgeos_c.so.1', 'libgeos_c.so'])
+-    free = CDLL('libc.so.1').free
+-    free.argtypes = [c_void_p]
+-    free.restype = None
+-else:  # other *nix systems
+-    _lgeos = load_dll('geos_c', fallbacks=['libgeos_c.so.1', 'libgeos_c.so'])
+-    free = load_dll('c', fallbacks=['libc.so.6']).free
+-    free.argtypes = [c_void_p]
+-    free.restype = None
++_lgeos = CDLL('@libgeos_c@')
++if sys.platform == 'darwin':
++    # ctypes.CDLL(None) internally calls dlopen(NULL), and as the dlopen
++    # manpage says, "If filename is NULL, then the returned handle is for the
++    # main program". This way we can let the linker do the work to figure out
++    # which libc Python is actually using.
++    free = CDLL(None).free
++else:
++    free = CDLL('@libc@').free
++free.argtypes = [c_void_p]
++free.restype = None
+ 
+ 
+ def _geos_version():
+diff --git a/tests/test_dlls.py b/tests/test_dlls.py
+index 35f9cc2..3dfcaac 100644
+--- a/tests/test_dlls.py
++++ b/tests/test_dlls.py
+@@ -12,12 +12,7 @@ class LoadingTestCase(unittest.TestCase):
+     @unittest.skipIf(sys.platform == "win32", "FIXME: adapt test for win32")
+     def test_fallbacks(self):
+         load_dll('geos_c', fallbacks=[
+-            os.path.join(sys.prefix, "lib", "libgeos_c.dylib"), # anaconda (Mac OS X)
+-            '/opt/local/lib/libgeos_c.dylib',  # MacPorts
+-            '/usr/local/lib/libgeos_c.dylib',  # homebrew (Mac OS X)
+-            os.path.join(sys.prefix, "lib", "libgeos_c.so"), # anaconda (Linux)
+-            'libgeos_c.so.1',
+-            'libgeos_c.so'])
++            '@libgeos_c@'])
+ 
+ 
+ def test_suite():
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/shellingham/default.nix b/nixpkgs/pkgs/development/python-modules/shellingham/default.nix
new file mode 100644
index 000000000000..77a4b98f54c3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/shellingham/default.nix
@@ -0,0 +1,20 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "shellingham";
+  version = "1.3.2";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "576c1982bea0ba82fb46c36feb951319d7f42214a82634233f58b40d858a751e";
+  };
+
+  meta = with lib; {
+    description = "Tool to Detect 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..b7508a8f6447
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/shiboken2/default.nix
@@ -0,0 +1,37 @@
+{ buildPythonPackage, python, fetchurl, 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 qt5.qtbase qt5.qtxmlpatterns ];
+
+  cmakeFlags = [
+    "-DBUILD_TESTS=OFF"
+  ];
+
+  postInstall = ''
+    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..8fd15b71a015
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/shippai/default.nix
@@ -0,0 +1,19 @@
+{ lib, stdenv, 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/shodan/default.nix b/nixpkgs/pkgs/development/python-modules/shodan/default.nix
new file mode 100644
index 000000000000..f361659d9acb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/shodan/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, click-plugins
+, colorama
+, requests
+, setuptools
+, XlsxWriter
+}:
+
+buildPythonPackage rec {
+  pname = "shodan";
+  version = "1.24.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0b5ec40c954cd48c4e3234e81ad92afdc68438f82ad392fed35b7097eb77b6dd";
+  };
+
+  propagatedBuildInputs = [
+    click-plugins
+    colorama
+    requests
+    setuptools
+    XlsxWriter
+  ];
+
+  # The tests require a shodan api key, so skip them.
+  doCheck = false;
+
+  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..35401afa6e3e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/shortuuid/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv
+, buildPythonPackage
+, isPy3k
+, fetchPypi
+, pep8
+}:
+
+buildPythonPackage rec {
+  pname = "shortuuid";
+  version = "1.0.1";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "3c11d2007b915c43bee3e10625f068d8a349e04f0d81f08f5fa08507427ebf1f";
+  };
+
+  buildInputs = [pep8];
+
+  meta = with lib; {
+    description = "A generator library for 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..1499f1ce4bc8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/should-dsl/default.nix
@@ -0,0 +1,22 @@
+{ lib, stdenv, 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..9959f26036cf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/shouldbe/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv
+, 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/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..7fd955abd17c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sievelib/default.nix
@@ -0,0 +1,47 @@
+{ lib, buildPythonPackage, fetchPypi, fetchpatch, mock
+, future, six, setuptools_scm }:
+
+buildPythonPackage rec {
+  pname = "sievelib";
+  version = "1.1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1sl1fnwr5jdacrrnq2rvzh4vv1dyxd3x31vnqga36gj8h546h7mz";
+  };
+
+  patches = [
+    (fetchpatch {
+      name = "pip-10-pip-req.patch";
+      url = "https://github.com/tonioo/sievelib/commit/1deef0e2bf039a0e817ea6f19aaf1947dc9fafbc.patch";
+      sha256 = "0vaj73mcij9dism8vfaai82irh8j1b2n8gf9jl1a19d2l26jrflk";
+    })
+    (fetchpatch {
+      name = "requirements-in-setup-py.patch";
+      url = "https://github.com/tonioo/sievelib/commit/91f40ec226ea288e98379da01672a46dabd89fc9.patch";
+      sha256 = "0hph89xn16r353rg6f05bh0cgigmwdc736bya089qc03jhssrgns";
+    })
+  ];
+
+  buildInputs = [ setuptools_scm ];
+  propagatedBuildInputs = [ future six ];
+  checkInputs = [ mock ];
+
+  meta = {
+    description = "Client-side Sieve and Managesieve library written in Python";
+    homepage    = "https://github.com/tonioo/sievelib";
+    license     = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ leenaars ];
+    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)
+    '';
+  };
+}
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..12614a3446bb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/signedjson/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, canonicaljson
+, unpaddedbase64
+, pynacl
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "signedjson";
+  version = "1.1.0";
+
+  src = fetchFromGitHub {
+    owner = "matrix-org";
+    repo = "python-${pname}";
+    rev = "refs/tags/v${version}";
+    sha256 = "18s388hm3babnvakbbgfqk0jzq25nnznvhygywd3azp9b4yzmd5c";
+  };
+
+  propagatedBuildInputs = [ canonicaljson unpaddedbase64 pynacl typing-extensions ];
+
+  meta = with lib; {
+    homepage = "https://pypi.org/project/signedjson/";
+    description = "Sign JSON with Ed25519 signatures";
+    license = licenses.asl20;
+  };
+}
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..0c11a2b6c561
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sigtools/default.nix
@@ -0,0 +1,33 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, repeated_test
+, sphinx
+, mock
+, coverage
+, unittest2
+, funcsigs
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "sigtools";
+  version = "2.0.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1b890f22ece64bc47d3d4e84c950581e83917794a6cf1548698145590e221aff";
+  };
+
+  buildInputs = [ repeated_test sphinx mock coverage unittest2 ];
+  propagatedBuildInputs = [ funcsigs six ];
+
+  patchPhase = ''sed -i s/test_suite="'"sigtools.tests"'"/test_suite="'"unittest2.collector"'"/ setup.py'';
+
+  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..958f53be567d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/simanneal/default.nix
@@ -0,0 +1,23 @@
+{ lib, stdenv, fetchFromGitHub, buildPythonPackage, pytest }:
+
+buildPythonPackage rec {
+  pname = "simanneal";
+  version = "0.4.2";
+
+  src = fetchFromGitHub {
+    owner = "perrygeo";
+    repo = "simanneal";
+    rev = version;
+    sha256 = "0p75da4nbk6iy16aahl0ilqg605jrr6aa1pzfyd9hc7ak2vs6840";
+  };
+
+  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/simple-salesforce/default.nix b/nixpkgs/pkgs/development/python-modules/simple-salesforce/default.nix
new file mode 100644
index 000000000000..3b6803aa5de2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/simple-salesforce/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, requests
+, pyopenssl
+, cryptography
+, idna
+, mock
+, isPy27
+, nose
+, pytz
+, responses
+}:
+
+buildPythonPackage rec {
+  pname = "simple-salesforce";
+  version = "0.74.3";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1n960xgrnmv20l31nm0im7pb4nfa83bmx4x4clqrh2jkpzq3ric0";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    pyopenssl
+    cryptography
+    idna
+  ];
+
+  checkInputs = [
+    nose
+    pytz
+    responses
+  ] ++ lib.optionals isPy27 [ mock ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "mock==1.0.1" "mock"
+  '';
+
+  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..f8d579b6088d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/simple-websocket-server/default.nix
@@ -0,0 +1,22 @@
+{ lib, stdenv, 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/simpleai/default.nix b/nixpkgs/pkgs/development/python-modules/simpleai/default.nix
new file mode 100644
index 000000000000..0786ebfae6e4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/simpleai/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, numpy
+, isPy3k
+}:
+
+buildPythonPackage rec {
+   version = "0.8.2";
+   pname = "simpleai";
+   disabled = isPy3k;
+
+   src = fetchPypi {
+     inherit pname version;
+     sha256 = "2927d460b09ff6dd177999c2f48f3275c84c956efe5b41b567b5316e2259d21e";
+   };
+
+   propagatedBuildInputs = [ numpy ];
+
+   #No tests in archive
+   doCheck = false;
+
+   meta = with lib; {
+     homepage = "https://github.com/simpleai-team/simpleai";
+     description = "This lib implements many of the artificial intelligence algorithms described on the book 'Artificial Intelligence, a Modern Approach'";
+     maintainers = with maintainers; [ NikolaMandic ];
+   };
+
+}
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..948716a9b7cb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/simpleaudio/default.nix
@@ -0,0 +1,24 @@
+{ alsaLib, 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 = [ alsaLib ];
+
+  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..ed86b48fc072
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/simplebayes/default.nix
@@ -0,0 +1,36 @@
+{ lib, stdenv
+, 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..cb6f50fdd287
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/simpleeval/default.nix
@@ -0,0 +1,16 @@
+{ lib, fetchPypi, buildPythonPackage }:
+
+buildPythonPackage rec {
+  pname = "simpleeval";
+  version = "0.9.10";
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1skvl467kj83rzkhk01i0wm8m5vmh6j5znrfdizn6r18ii45a839";
+  };
+  meta = {
+    homepage = "https://github.com/danthedeckie/simpleeval";
+    description = "A simple, safe single expression evaluator library";
+    maintainers = with lib.maintainers; [ johbo ];
+    license = lib.licenses.mit;
+  };
+}
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..6e498ebeaea8
--- /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.14";
+
+  src = fetchFromGitHub {
+    repo = "simplefix";
+    owner = "da4089";
+    rev = "v${version}";
+    sha256 = "1qccb63w6swq7brp0zinkkngpazmb25r21adry5cq6nniqs5g5zx";
+  };
+
+  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/simplejson/default.nix b/nixpkgs/pkgs/development/python-modules/simplejson/default.nix
new file mode 100644
index 000000000000..fe08f5bbe2e5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/simplejson/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, stdenv
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "simplejson";
+  version = "3.17.0";
+  doCheck = !stdenv.isDarwin;
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1b1hhh1dia673vhq3jl2br1iqwb9yjii6iak56w96s9972vjbz3z";
+  };
+
+  # Package does not need pytest, but its a bit easier debugging.
+  checkInputs = [ pytest ];
+  # Ignore warnings because test does not expect them in stderr
+  # See https://github.com/simplejson/simplejson/issues/241
+  checkPhase = ''
+    PYTHONWARNINGS="ignore" pytest simplejson/tests
+  '';
+
+  meta = {
+    description = "A simple, fast, extensible JSON encoder/decoder for Python";
+    longDescription = ''
+      simplejson is compatible with Python 2.4 and later with no
+      external dependencies.  It 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 lib.licenses; [ mit afl21 ];
+  };
+}
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..6b8bac25b87b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/simplekml/default.nix
@@ -0,0 +1,20 @@
+{ lib , buildPythonPackage , fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "simplekml";
+  version = "1.3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "17h48r1dsfz4g9xcxh1xq85h20hiz7qzzymc1gla96bj2wh4wyv5";
+  };
+
+  doCheck = false; # no tests are defined in 1.3.5
+
+  meta = with lib; {
+    description = "Generate KML with as little effort as possible";
+    homepage =  "https://readthedocs.org/projects/simplekml/";
+    license = licenses.lgpl3Plus;
+    maintainers = with maintainers; [ rvolosatovs ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/simpleparse/default.nix b/nixpkgs/pkgs/development/python-modules/simpleparse/default.nix
new file mode 100644
index 000000000000..6395f4af223d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/simpleparse/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+, isPyPy
+}:
+
+buildPythonPackage rec {
+  version = "2.2.2";
+  pname = "simpleparse";
+  disabled = isPy3k || isPyPy;
+
+  src = fetchPypi {
+    pname = "SimpleParse";
+    inherit version;
+    sha256 = "010szm4mbqgfdksa2n4l9avj617rb0gkwrryc70mfjmyww0bd1m6";
+  };
+
+  doCheck = false;  # weird error
+
+  meta = with lib; {
+    description = "A Parser Generator for Python";
+    homepage = "https://pypi.python.org/pypi/SimpleParse";
+    license = licenses.bsd0;
+  };
+
+}
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..f718b3655f6f
--- /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/singledispatch/default.nix b/nixpkgs/pkgs/development/python-modules/singledispatch/default.nix
new file mode 100644
index 000000000000..789a24f3e818
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/singledispatch/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "singledispatch";
+  version = "3.4.0.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "5b06af87df13818d14f08a028e42f566640aef80805c3b50c5056b086e3c2b9c";
+  };
+
+  propagatedBuildInputs = [ six ];
+
+  # pypi singledispatch tarbal does not contain tests
+  doCheck = false;
+
+  meta = {
+    description = "This library brings functools.singledispatch from Python 3.4 to Python 2.6-3.3.";
+    homepage = "https://docs.python.org/3/library/functools.html";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ costrouc ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sip/5.x.nix b/nixpkgs/pkgs/development/python-modules/sip/5.x.nix
new file mode 100644
index 000000000000..cebffd5765bd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sip/5.x.nix
@@ -0,0 +1,26 @@
+{ lib, fetchPypi, buildPythonPackage, packaging, toml }:
+
+buildPythonPackage rec {
+  pname = "sip";
+  version = "5.5.0";
+
+  src = fetchPypi {
+    pname = "sip";
+    inherit version;
+    sha256 = "1idaivamp1jvbbai9yzv471c62xbqxhaawccvskaizihkd0lq0jx";
+  };
+
+  propagatedBuildInputs = [ packaging toml ];
+
+  # There aren't tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "sipbuild" ];
+
+  meta = with lib; {
+    description = "Creates C++ bindings for Python modules";
+    homepage    = "http://www.riverbankcomputing.co.uk/";
+    license     = licenses.gpl3Only;
+    maintainers = with maintainers; [ eduardosm ];
+  };
+}
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..0027c1c0ba5f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sip/default.nix
@@ -0,0 +1,44 @@
+{ lib, fetchurl, buildPythonPackage, python, isPyPy, sip-module ? "sip" }:
+
+buildPythonPackage rec {
+  pname = sip-module;
+  version = "4.19.24";
+  format = "other";
+
+  disabled = isPyPy;
+
+  src = fetchurl {
+    url = "https://www.riverbankcomputing.com/static/Downloads/sip/${version}/sip-${version}.tar.gz";
+    sha256 = "1ra15vb5i9gkg2vdvh16cq9x2mmzw1yi3xphxs8q34q1pf83gkgd";
+  };
+
+  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    = "http://www.riverbankcomputing.co.uk/";
+    license     = licenses.gpl2Plus;
+    maintainers = with maintainers; [ lovek323 sander ];
+    platforms   = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sipsimple/default.nix b/nixpkgs/pkgs/development/python-modules/sipsimple/default.nix
new file mode 100644
index 000000000000..568ce67d1434
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sipsimple/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, isPy3k
+, pkgs
+, cython
+, dnspython
+, dateutil
+, xcaplib
+, msrplib
+, lxml
+, python-otr
+}:
+
+buildPythonPackage rec {
+  pname = "sipsimple";
+  version = "3.4.2";
+  disabled = isPy3k;
+
+  src = fetchFromGitHub {
+    owner = "AGProjects";
+    repo = "python-sipsimple";
+    rev = "release-${version}";
+    sha256 = "094xf343d6zjhg9jwbm3dr74zq264cyqnn22byvm2m88lnagmhmr";
+  };
+
+  preConfigure = ''
+    # TODO: Executable bits are set by upstream with the next release
+    # see AGProjects/python-sipsimple/commit/a36d66cf758afb43c59f7ac48b193c4148eb1848
+    chmod +x ./deps/pjsip/configure ./deps/pjsip/aconfigure
+
+    export LD=$CC
+  '';
+
+  nativeBuildInputs = [ pkgs.pkg-config ];
+  buildInputs = with pkgs; [ alsaLib ffmpeg_3 libv4l sqlite libvpx ];
+  propagatedBuildInputs = [ cython pkgs.openssl dnspython dateutil xcaplib msrplib lxml python-otr ];
+
+  meta = with lib; {
+    description = "SIP SIMPLE implementation for Python";
+    homepage = "https://sipsimpleclient.org/";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ pSub ];
+  };
+
+}
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..8d8cd790cdef
--- /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.15.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259";
+  };
+
+  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/skein/default.nix b/nixpkgs/pkgs/development/python-modules/skein/default.nix
new file mode 100644
index 000000000000..40a179264273
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/skein/default.nix
@@ -0,0 +1,40 @@
+{ buildPythonPackage
+, callPackage
+, fetchPypi
+, isPy27
+, jre
+, lib
+, pythonPackages
+, stdenv
+}:
+
+let
+  pname = "skein";
+  version = "0.8.0";
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0nb64p1hzshgi1kfc2jx1v9vn8b0wzs50460wfra3fsxh0ap66ab";
+  };
+  skeinJar = callPackage ./skeinjar.nix { inherit src version; };
+in
+buildPythonPackage rec {
+  inherit pname version src;
+  disabled = isPy27;
+
+  propagatedBuildInputs = with pythonPackages; [ cryptography grpcio grpcio-tools jupyter pytest pyyaml requests jre ];
+
+  preBuild = ''
+    # Ensure skein.jar exists skips the maven build in setup.py
+    mkdir -p skein/java
+    ln -s ${skeinJar} skein/java/skein.jar
+  '';
+
+  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 ];
+    broken = true; # maven repo src isn't stable
+  };
+
+}
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..c1a0d8a57515
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/skein/skeinjar.nix
@@ -0,0 +1,21 @@
+{ callPackage, stdenv, maven, src, version }:
+
+let
+  skeinRepo = callPackage ./skeinrepo.nix { inherit src version; };
+in
+stdenv.mkDerivation rec {
+  name = "skein-${version}.jar";
+
+  inherit src;
+
+  nativeBuildInputs = [ maven ];
+
+  buildPhase = ''
+    mvn --offline -f java/pom.xml package -Dmaven.repo.local="${skeinRepo}" -Dskein.version=${version} -Dversion=${version}
+  '';
+
+  installPhase = ''
+    # Making sure skein.jar exists skips the maven build in setup.py
+    mv java/target/skein-*.jar $out
+  '';
+}
diff --git a/nixpkgs/pkgs/development/python-modules/skein/skeinrepo.nix b/nixpkgs/pkgs/development/python-modules/skein/skeinrepo.nix
new file mode 100644
index 000000000000..85b4f19c8f73
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/skein/skeinrepo.nix
@@ -0,0 +1,46 @@
+{ autoPatchelfHook, lib, maven, stdenv, src, version }:
+
+stdenv.mkDerivation rec {
+  name = "skein-${version}-maven-repo";
+
+  inherit src;
+
+  nativeBuildInputs = [ maven ] ++ lib.optional stdenv.isLinux autoPatchelfHook;
+
+  doBuild = false;
+
+  installPhase = ''
+    mkdir -p $out
+
+    archs="${
+      if stdenv.isLinux
+      then "linux-x86_32 linux-x86_64"
+      else "osx-x86_64"
+    }"
+
+    for arch in $archs
+    do
+      mvn -Dmaven.repo.local=$out dependency:get -Dartifact=com.google.protobuf:protoc:3.0.0:exe:$arch
+      mvn -Dmaven.repo.local=$out dependency:get -Dartifact=io.grpc:protoc-gen-grpc-java:1.16.0:exe:$arch
+    done
+
+    if ${ lib.boolToString stdenv.isLinux }
+    then
+      autoPatchelf $out
+    fi
+
+    # We have to use maven package here as dependency:go-offline doesn't
+    # fetch every required jar.
+    mvn -f java/pom.xml -Dmaven.repo.local=$out package
+
+    rm $(find $out -name _remote.repositories)
+    rm $(find $out -name resolver-status.properties)
+  '';
+
+  outputHashMode = "recursive";
+  outputHashAlgo = "sha256";
+  outputHash = if stdenv.isLinux
+    then "12f0q3444qw6y4f6qsa9540a0fz4cgi844zzi8z1phqn3k4dnl6v"
+    else "0bjbwiv17cary1isxca0m2hsvgs1i5fh18z247h1hky73lnhbrz8";
+
+} // lib.optionalAttrs stdenv.isLinux { dontAutoPatchelf = true; }
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..3d2007732e8c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/skidl/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, requests
+, future
+, kinparse
+, enum34
+, pyspice
+, graphviz
+, pillow
+, cffi
+}:
+
+buildPythonPackage rec {
+  pname = "skidl";
+  version = "unstable-2020-09-15";
+
+  src = fetchFromGitHub {
+    owner = "xesscorp";
+    repo = "skidl";
+    rev = "551bdb92a50c0894b0802c0a89b4cb62a5b4038f";
+    sha256 = "1g65cyxpkqshgsggav2q3f76rbj5pzh7sacyhmhzvfz4zfarkcxk";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    future
+    kinparse
+    enum34
+    pyspice
+    graphviz
+    pillow
+    cffi
+  ];
+
+  # Checks require availability of the kicad symbol libraries.
+  doCheck = false;
+  pythonImportsCheck = [ "skidl" ];
+
+  meta = with lib; {
+    description = "SKiDL is a module that extends Python with the ability to design electronic circuits";
+    homepage = "https://xesscorp.github.io/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..36ec8b18ca7e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sklearn-deap/default.nix
@@ -0,0 +1,36 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub, fetchpatch, numpy, scipy, deap, scikitlearn, 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 newer versions of scikit-learn. 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 scikitlearn ];
+
+  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 ];
+  };
+}
+
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..bb41f61517fc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/skorch/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pytest
+, pytestcov
+, flaky
+, numpy
+, pandas
+, pytorch
+, scikitlearn
+, scipy
+, tabulate
+, tqdm
+}:
+
+buildPythonPackage rec {
+  pname = "skorch";
+  version = "0.9.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "bdce9370153fd80c5c4ec499a639f55eef0620e45d4b15fbf7d7ff2a225a3d40";
+  };
+
+  propagatedBuildInputs = [ numpy pytorch scikitlearn scipy tabulate tqdm ];
+  checkInputs = [ pytest pytestcov flaky pandas pytestCheckHook ];
+
+  # on CPU, these expect artifacts from previous GPU run
+  disabledTests = [
+    "test_load_cuda_params_to_cpu"
+    "test_pickle_load"
+  ];
+
+  meta = with lib; {
+    description = "Scikit-learn compatible neural net library using Pytorch";
+    homepage = "https://skorch.readthedocs.io";
+    changelog = "https://github.com/skorch-dev/skorch/blob/master/CHANGES.md";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/slackclient/default.nix b/nixpkgs/pkgs/development/python-modules/slackclient/default.nix
new file mode 100644
index 000000000000..571398b783dc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/slackclient/default.nix
@@ -0,0 +1,58 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, aiohttp
+, black
+, codecov
+, flake8
+, isPy3k
+, mock
+, pytest-mock
+, pytestCheckHook
+, pytestcov
+, pytestrunner
+, requests
+, responses
+, six
+, websocket_client
+}:
+
+buildPythonPackage rec {
+  pname = "python-slackclient";
+  version = "2.5.0";
+
+  disabled = !isPy3k;
+
+  src = fetchFromGitHub {
+    owner  = "slackapi";
+    repo   = pname;
+    rev    = version;
+    sha256 = "1ngj1mivbln19546195k400w9yaw69g0w6is7c75rqwyxr8wgzsk";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    websocket_client
+    requests
+    six
+  ];
+
+  checkInputs = [
+    black
+    codecov
+    flake8
+    mock
+    pytest-mock
+    pytestCheckHook
+    pytestcov
+    pytestrunner
+    responses
+  ];
+
+  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..e6d5e59a80e7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sleekxmpp/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv, fetchPypi, buildPythonPackage, dns, pyasn1 }:
+
+buildPythonPackage rec {
+  pname = "sleekxmpp";
+  version = "1.3.3";
+
+  propagatedBuildInputs = [ dns pyasn1 ];
+
+  patches = [
+    ./dnspython-ip6.patch
+  ];
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d213c1de71d92505f95ced0460ee0f84fdc4ddcacb7d7dd343739ed4028e5569";
+  };
+
+  meta = with lib; {
+    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/slicedimage/default.nix b/nixpkgs/pkgs/development/python-modules/slicedimage/default.nix
new file mode 100644
index 000000000000..08bdc183186c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/slicedimage/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, boto3
+, diskcache
+, enum34
+, packaging
+, pathlib
+, numpy
+, requests
+, scikitimage
+, six
+, pytest
+, isPy27
+, tifffile
+}:
+
+buildPythonPackage rec {
+  pname = "slicedimage";
+  version = "4.1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "7369f1d7fa09f6c9969625c4b76a8a63d2507a94c6fc257183da1c10261703e9";
+  };
+
+  propagatedBuildInputs = [
+    boto3
+    diskcache
+    packaging
+    numpy
+    requests
+    scikitimage
+    six
+    tifffile
+  ] ++ lib.optionals isPy27 [ pathlib enum34 ];
+
+  checkInputs = [
+    pytest
+  ];
+
+  # ignore tests which require setup
+  checkPhase = ''
+    pytest --ignore tests/io_
+  '';
+
+  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..b5521f415d7b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/slicer/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, pytestCheckHook
+, pandas
+, pytorch
+}:
+
+buildPythonPackage rec {
+  pname = "slicer";
+  version = "0.0.5";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "8c0fe9845056207d7344d5850e93551f9be20656178d443332aa02da9c71ba44";
+  };
+
+  checkInputs = [ pytestCheckHook pandas pytorch ];
+
+  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..396692200039
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/slicerator/default.nix
@@ -0,0 +1,32 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, python
+, six
+}:
+
+buildPythonPackage rec {
+  version = "1.0.0";
+  pname = "slicerator";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "18e60393e6765ca96986f801bbae62a617a1eba6ed57784e61b165ffc7dc1848";
+  };
+
+  propagatedBuildInputs = [ six ];
+
+  checkPhase = ''
+    ${python.interpreter} run_tests.py
+  '';
+
+  # run_tests.py not packaged with pypi release
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/soft-matter/slicerator";
+    description = "A lazy-loading, fancy-sliceable iterable";
+    license = licenses.bsdOriginal;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/slimit/default.nix b/nixpkgs/pkgs/development/python-modules/slimit/default.nix
new file mode 100644
index 000000000000..30654bd03f61
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/slimit/default.nix
@@ -0,0 +1,36 @@
+{ lib, buildPythonPackage, fetchPypi, isPy3k, fetchpatch, python, ply }:
+
+buildPythonPackage rec {
+  pname = "slimit";
+  version = "0.8.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "f433dcef899f166b207b67d91d3f7344659cb33b8259818f084167244e17720b";
+  };
+
+  # Some patches from https://github.com/rspivak/slimit/pull/65
+  patches = lib.optionals isPy3k [
+    (fetchpatch {
+      url = "https://github.com/lelit/slimit/commit/a61e12d88cc123c4b7af2abef21d06fd182e561a.patch";
+      sha256 = "0lbhvkgn4l8g9fwvb81rfwjx7hsaq2pid8a5gczdk1ba65wfvdq5";
+    })
+    (fetchpatch {
+      url = "https://github.com/lelit/slimit/commit/e8331659fb89e8a4613c5e4e338c877fead9c551.patch";
+      sha256 = "1hv4ysn09c9bfd5bxhhrp51hsi81hdidmx0y7zcrjjiich9ayrni";
+    })
+  ];
+
+  propagatedBuildInputs = [ ply ];
+
+  checkPhase = ''
+    ${python.interpreter} -m unittest discover -s src/slimit
+  '';
+
+  meta = with lib; {
+    description = "JavaScript minifier";
+    homepage = "https://slimit.readthedocs.org/";
+    license = licenses.mit;
+  };
+}
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..deb12817a7bd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/slither-analyzer/default.nix
@@ -0,0 +1,38 @@
+{ lib, buildPythonPackage, fetchPypi, makeWrapper, pythonOlder
+, crytic-compile, prettytable, setuptools, solc
+}:
+
+buildPythonPackage rec {
+  pname = "slither-analyzer";
+  version = "0.7.0";
+
+  disabled = pythonOlder "3.6";
+
+  # No Python tests
+  doCheck = false;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "10r479xidgxvas4wb0z6injp59jrn7rfq8d7bxlcalc2dy4mawr0";
+  };
+
+  nativeBuildInputs = [ makeWrapper ];
+  propagatedBuildInputs = [ crytic-compile prettytable setuptools ];
+
+  postFixup = ''
+    wrapProgram $out/bin/slither \
+      --prefix PATH : "${lib.makeBinPath [ solc ]}"
+  '';
+
+  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.agpl3;
+    maintainers = [ maintainers.asymmetric ];
+  };
+}
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..012a49eb3236
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/slixmpp/default.nix
@@ -0,0 +1,34 @@
+{ lib, buildPythonPackage, fetchPypi, isPy3k, substituteAll, aiodns, pyasn1, pyasn1-modules, aiohttp, gnupg, nose }:
+
+buildPythonPackage rec {
+  pname = "slixmpp";
+  version = "1.6.0";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0jamly1jv31ragpv8yn52av1m48iwl4i7f9knb67vmk8c22rjdwa";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./hardcode-gnupg-path.patch;
+      inherit gnupg;
+    })
+  ];
+
+  propagatedBuildInputs = [ aiodns pyasn1 pyasn1-modules aiohttp ];
+
+  checkInputs = [ nose ];
+
+  checkPhase = ''
+    nosetests --where=tests --exclude=live -i slixtest.py
+  '';
+
+  meta = {
+    description = "Elegant Python library for XMPP";
+    license = lib.licenses.mit;
+    homepage = "https://dev.louiz.org/projects/slixmpp";
+  };
+}
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..a7520c62a62c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/slob/default.nix
@@ -0,0 +1,34 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, isPy3k
+, PyICU
+, python
+}:
+
+buildPythonPackage {
+  pname = "slob";
+  version = "unstable-2016-11-03";
+  disabled = !isPy3k;
+
+  src = fetchFromGitHub {
+    owner = "itkach";
+    repo = "slob";
+    rev = "d1ed71e4778729ecdfc2fe27ed783689a220a6cd";
+    sha256 = "1r510s4r124s121wwdm9qgap6zivlqqxrhxljz8nx0kv0cdyypi5";
+  };
+
+  propagatedBuildInputs = [ PyICU ];
+
+  checkPhase = ''
+    ${python.interpreter} -m unittest slob
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/itkach/slob/";
+    description = "Reference implementation of the slob (sorted list of blobs) format";
+    license = licenses.gpl3;
+    maintainers = [ maintainers.rycee ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/slowaes/default.nix b/nixpkgs/pkgs/development/python-modules/slowaes/default.nix
new file mode 100644
index 000000000000..5d738fea57e0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/slowaes/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "slowaes";
+  version = "0.1a1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "83658ae54cc116b96f7fdb12fdd0efac3a4e8c7c7064e3fac3f4a881aa54bf09";
+  };
+
+  disabled = isPy3k;
+
+  meta = with lib; {
+    homepage = "http://code.google.com/p/slowaes/";
+    description = "AES implemented in pure python";
+    license = with licenses; [ asl20 ];
+  };
+
+}
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_open/default.nix b/nixpkgs/pkgs/development/python-modules/smart_open/default.nix
new file mode 100644
index 000000000000..3a1c890f0481
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/smart_open/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, boto
+, boto3
+, bz2file
+, mock
+, moto
+, requests
+, responses
+}:
+
+buildPythonPackage rec {
+  pname = "smart_open";
+  version = "4.1.0";
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "26af5c1a3f2b76aab8c3200310f0fc783790ec5a231ffeec102e620acdd6262e";
+  };
+
+  # nixpkgs version of moto is >=1.2.0, remove version pin to fix build
+  postPatch = ''
+    substituteInPlace ./setup.py --replace "moto==0.4.31" "moto"
+  '';
+
+  # moto>=1.0.0 is backwards-incompatible and some tests fail with it,
+  # so disable tests for now
+  doCheck = false;
+
+  checkInputs = [ mock moto responses ];
+
+  # upstream code requires both boto and boto3
+  propagatedBuildInputs = [ boto boto3 bz2file requests ];
+  meta = {
+    license = lib.licenses.mit;
+    description = "smart_open is a Python 2 & Python 3 library for efficient streaming of very large file";
+    maintainers = with lib.maintainers; [ jyp ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/smartdc/default.nix b/nixpkgs/pkgs/development/python-modules/smartdc/default.nix
new file mode 100644
index 000000000000..0b36a7e9f6e7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/smartdc/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, requests
+, http_signature
+}:
+
+buildPythonPackage rec {
+  pname = "smartdc";
+  version = "0.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "6ffd866fb98386324e189e24d4f7532f66c1b20eece35ca1a6cb4b2a2639fc85";
+  };
+
+  propagatedBuildInputs = [ requests http_signature ];
+
+  meta = with lib; {
+    description = "Joyent SmartDataCenter CloudAPI connector using http-signature authentication via Requests";
+    homepage = "https://github.com/atl/py-smartdc";
+    license = licenses.mit;
+  };
+
+}
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..a497f3db413b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/smartypants/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchhg
+, isPyPy
+}:
+
+buildPythonPackage rec {
+  version = "1.8.6";
+  pname = "smartypants";
+  disabled = isPyPy;
+
+  src = fetchhg {
+    url = "https://bitbucket.org/livibetter/smartypants.py";
+    rev = "v${version}";
+    sha256 = "1cmzz44d2hm6y8jj2xcq1wfr26760gi7iq92ha8xbhb1axzd7nq6";
+  };
+
+  meta = with lib; {
+    description = "Python with the SmartyPants";
+    homepage = "https://bitbucket.org/livibetter/smartypants.py";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+
+}
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..6715cfd60d95
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/smbus-cffi/default.nix
@@ -0,0 +1,47 @@
+{ 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=";
+    })
+  ];
+
+  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/smmap/default.nix b/nixpkgs/pkgs/development/python-modules/smmap/default.nix
new file mode 100644
index 000000000000..04b86ad5f6f7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/smmap/default.nix
@@ -0,0 +1,19 @@
+{ lib, fetchPypi, buildPythonPackage, nosexcover }:
+
+buildPythonPackage rec {
+  pname = "smmap";
+  version = "3.0.4";
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "9c98bbd1f9786d22f14b3d4126894d56befb835ec90cef151af566c7e19b5d24";
+  };
+
+  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..fe22f121efb7
--- /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.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0jzxlfwf0861ilh4xyd70hmkdbvdki52aalglm1bnpxkg6i3jhfz";
+  };
+
+  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..2c54f65d9c35
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/snakeviz/default.nix
@@ -0,0 +1,22 @@
+{ lib, stdenv, fetchPypi, buildPythonPackage, tornado }:
+
+buildPythonPackage rec {
+  pname = "snakeviz";
+  version = "2.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0s6byw23hr2khqx2az36hpi52fk4v6bfm1bb7biaf0d2nrpqgbcj";
+  };
+
+  # 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..8446683cb1aa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/snapcast/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, isPy3k, pytest
+, construct }:
+
+buildPythonPackage rec {
+  pname = "snapcast";
+  version = "2.1.1";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "c3ecd63d997fbcf6e5322dc47c1f02615f1d9611cba01ec18e9c9f8c14ed824b";
+  };
+
+  checkInputs = [ pytest ];
+
+  propagatedBuildInputs = [ construct ];
+
+  # no checks from Pypi - https://github.com/happyleavesaoc/python-snapcast/issues/23
+  doCheck = false;
+
+  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..901987fbff66
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/snitun/default.nix
@@ -0,0 +1,33 @@
+{ lib, stdenv, buildPythonPackage, python, fetchFromGitHub
+, attrs, cryptography, async-timeout, pytest-aiohttp, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "snitun";
+  version = "0.20";
+
+  src = fetchFromGitHub {
+    owner = "NabuCasa";
+    repo = pname;
+    rev = version;
+    sha256 = "1nscfwycclfbll709w1q46w6rl0r5c3b85rsc7zwc3ixd1k8aajp";
+  };
+
+  propagatedBuildInputs = [ attrs cryptography async-timeout ];
+
+  checkInputs = [ pytestCheckHook pytest-aiohttp ];
+
+  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"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/nabucasa/snitun";
+    description = "SNI proxy with TCP multiplexer";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ Scriptkiddi ];
+  };
+}
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..3364470da1b3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/snowballstemmer/default.nix
@@ -0,0 +1,23 @@
+{ lib, stdenv, buildPythonPackage, PyStemmer, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "snowballstemmer";
+  version = "2.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "df3bac3df4c2c01363f3dd2cfa78cce2840a79b9f1c2d2de9ce8d31683992f52";
+  };
+
+  # 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..96f489ec6ed9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/snowflake-connector-python/default.nix
@@ -0,0 +1,77 @@
+{ buildPythonPackage
+, isPy27
+, asn1crypto
+, azure-storage-blob
+, boto3
+, certifi
+, cffi
+, fetchPypi
+, future
+, idna
+, ijson
+, isPy3k
+, lib
+, oscrypto
+, pyarrow
+, pyasn1-modules
+, pycryptodomex
+, pyjwt
+, pyopenssl
+, pytz
+, requests
+, six
+, urllib3
+}:
+
+buildPythonPackage rec {
+  pname = "snowflake-connector-python";
+  version = "2.3.8";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-zsS5+0UGDwZM65MILfgAvZ67AbXGcLsVmGacgoxX530=";
+  };
+
+  propagatedBuildInputs = [
+    azure-storage-blob
+    asn1crypto
+    boto3
+    certifi
+    cffi
+    future
+    idna
+    ijson
+    oscrypto
+    pycryptodomex
+    pyjwt
+    pyopenssl
+    pytz
+    requests
+    six
+  ] ++ lib.optionals (!isPy3k) [
+    pyarrow
+    pyasn1-modules
+    urllib3
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "'boto3>=1.4.4,<1.16'," "'boto3~=1.16'," \
+      --replace "'cryptography>=2.5.0,<3.0.0'," "'cryptography'," \
+      --replace "'pyOpenSSL>=16.2.0,<20.0.0'," "'pyOpenSSL'," \
+      --replace "'idna<2.10'," "'idna'," \
+      --replace "'requests<2.24.0'," "'requests',"
+  '';
+
+  # 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://www.snowflake.com/";
+    license = licenses.asl20;
+  };
+}
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..bccca3ee6b67
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/snowflake-sqlalchemy/default.nix
@@ -0,0 +1,31 @@
+{ buildPythonPackage
+, lib
+, fetchPypi
+, sqlalchemy
+, snowflake-connector-python
+}:
+
+buildPythonPackage rec {
+  pname = "snowflake-sqlalchemy";
+  version = "1.2.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "e79d83d4947a0945488699324802eda4ad4a63c7680ad5b2a42c71f4faa2cd8b";
+  };
+
+  propagatedBuildInputs = [
+    sqlalchemy
+    snowflake-connector-python
+  ];
+
+  # 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;
+  };
+}
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..b7d7f25614d9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/snscrape/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, isPy3k
+, fetchPypi
+, setuptools_scm
+, setuptools
+, requests
+, lxml
+, beautifulsoup4
+}:
+
+buildPythonPackage rec {
+  pname = "snscrape";
+  version = "0.3.4";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "36ba7f95c8bf5202749189f760e591952f19c849379c35ff598aafafe5d0cfef";
+  };
+
+  # There are no tests; make sure the executable works.
+  checkPhase = ''
+    export PATH=$PATH:$out/bin
+    snscrape --help
+  '';
+
+  nativeBuildInputs = [ setuptools_scm ];
+  propagatedBuildInputs = [ setuptools requests lxml beautifulsoup4 ];
+
+  meta = with lib; {
+    homepage = "https://github.com/JustAnotherArchivist/snscrape";
+    description = "A social networking service scraper in Python";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ ivan ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/snug/default.nix b/nixpkgs/pkgs/development/python-modules/snug/default.nix
new file mode 100644
index 000000000000..08896467b4e5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/snug/default.nix
@@ -0,0 +1,39 @@
+{ buildPythonPackage, lib, fetchFromGitHub, glibcLocales
+, pytest, pytest-mock, gentools
+, typing, singledispatch, pythonOlder
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "snug";
+  version = "1.3.4";
+  disabled = isPy3k;
+
+  # Pypi doesn't ship the tests, so we fetch directly from GitHub
+  src = fetchFromGitHub {
+    owner = "ariebovenberg";
+    repo = "snug";
+    rev = "v${version}";
+    sha256 = "0jmg0sivz9ljazlnsrrqaizrb3r7asy5pa0dj3idx49gbig4589i";
+  };
+
+  # Prevent unicode decoding error in setup.py
+  # while reading README.rst and HISTORY.rst
+  buildInputs = [ glibcLocales ];
+  LC_ALL = "en_US.UTF-8";
+
+  propagatedBuildInputs =
+    lib.optionals (pythonOlder "3.4") [ singledispatch ] ++
+    lib.optionals (pythonOlder "3.5") [ typing ];
+
+  checkInputs = [ pytest pytest-mock gentools ];
+  checkPhase = "pytest";
+
+  meta = with lib; {
+    description = "Tiny toolkit for writing reusable interactions with web APIs";
+    license = licenses.mit;
+    homepage = "https://snug.readthedocs.io/en/latest/";
+    maintainers = with maintainers; [ mredaelli ];
+  };
+
+}
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/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/socksipy-branch/default.nix b/nixpkgs/pkgs/development/python-modules/socksipy-branch/default.nix
new file mode 100644
index 000000000000..ca9d8707ac63
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/socksipy-branch/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv
+, 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..e203dc1c7aa5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/soco/default.nix
@@ -0,0 +1,60 @@
+{ buildPythonPackage
+, coveralls
+, fetchFromGitHub
+, flake8
+, graphviz
+, lib
+, mock
+, pytestCheckHook
+, requests
+, sphinx
+, sphinx_rtd_theme
+, toml
+, xmltodict
+}:
+
+buildPythonPackage rec {
+  pname = "soco";
+  version = "0.20";
+
+  # N.B. We fetch from GitHub because the PyPI tarball doesn't contain the
+  # required files to run the tests.
+  src = fetchFromGitHub {
+    owner = "SoCo";
+    repo = "SoCo";
+    rev = "v${version}";
+    sha256 = "0p87aw7wxgdjz0m0nqqcfvbn24hlbq1hh1zxdq2c0k2jcbmaj8zc";
+  };
+
+  # N.B. These exist because:
+  # 1. Upstream's pinning isn't well maintained, leaving dependency versions no
+  #    longer in nixpkgs.
+  # 2. There is no benefit for us to be running linting and coverage tests.
+  postPatch = ''
+    sed -i "/black/d" ./requirements-dev.txt
+    sed -i "/pylint/d" ./requirements-dev.txt
+    sed -i "/pytest-cov/d" ./requirements-dev.txt
+  '';
+
+  propagatedBuildInputs = [
+    requests
+    toml
+    xmltodict
+  ];
+  checkInputs = [
+    pytestCheckHook
+    coveralls
+    flake8
+    graphviz
+    mock
+    sphinx
+    sphinx_rtd_theme
+  ];
+
+  meta = with lib; {
+    homepage = "http://python-soco.com/";
+    description = "A CLI and library to control Sonos speakers";
+    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..3c2a5e2a356d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/softlayer/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, isPy27
+, ptable
+, click
+, requests
+, prompt_toolkit
+, pygments
+, urllib3
+, pytest
+, pytestcov
+, mock
+, sphinx
+, testtools
+}:
+
+buildPythonPackage rec {
+  pname = "softlayer-python";
+  version = "5.8.4";
+  disabled = isPy27;
+
+  propagatedBuildInputs = [ ptable click requests prompt_toolkit pygments urllib3 ];
+
+  checkInputs = [ pytest pytestcov mock sphinx testtools ptable click requests prompt_toolkit pygments urllib3 ];
+
+  checkPhase = ''
+    pytest
+  '';
+
+  src = fetchFromGitHub {
+    owner = "softlayer";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "10kzi7kvvifr21a46q2xqsibs0bx5ys22nfym0bg605ka37vcz88";
+  };
+
+  meta = with lib; {
+    description = "A set of Python libraries that assist in calling the SoftLayer API.";
+    homepage = "https://github.com/softlayer/softlayer-python";
+    license = licenses.mit;
+  };
+}
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..0ce6e338e61f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/solo-python/default.nix
@@ -0,0 +1,52 @@
+{ lib, buildPythonPackage, fetchFromGitHub, pythonOlder
+, click, ecdsa, fido2, intelhex, pyserial, pyusb, requests}:
+
+ buildPythonPackage rec {
+  pname = "solo-python";
+  version = "0.0.26";
+  format = "flit";
+  disabled = pythonOlder "3.6"; # only python>=3.6 is supported
+
+  src = fetchFromGitHub {
+    owner = "solokeys";
+    repo = pname;
+    rev = version;
+    sha256 = "05rwqrhr1as6zqhg63d6wga7l42jm2azbav5w6ih8mx5zbxf61yz";
+  };
+
+  # replaced pinned fido, with unrestricted fido version
+  patchPhase = ''
+    sed -i '/fido2/c\"fido2",' pyproject.toml
+  '';
+
+  propagatedBuildInputs = [
+    click
+    ecdsa
+    fido2
+    intelhex
+    pyserial
+    pyusb
+    requests
+  ];
+
+  # allow for writable directory for darwin
+  preBuild = ''
+    export HOME=$TMPDIR
+  '';
+
+  # repo doesn't contain tests, ensure imports aren't broken
+  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..bd351b5e86fa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/somajo/default.nix
@@ -0,0 +1,23 @@
+{ pkgs, lib, stdenv, fetchFromGitHub, buildPythonPackage, isPy3k, regex }:
+
+buildPythonPackage rec {
+  pname = "SoMaJo";
+  version = "2.1.1";
+  disabled = !isPy3k;
+
+  src = fetchFromGitHub {
+    owner = "tsproisl";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0yj3yb0qvfdv4wh7nzcsh9in8nzk7b59dvjj0x02rsmlv4kw9ah1";
+  };
+
+  propagatedBuildInputs = [ regex ];
+
+  meta = with lib; {
+    description = "Tokenizer and sentence splitter for German and English web texts";
+    homepage = "https://github.com/tsproisl/SoMaJo";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ danieldk ];
+  };
+}
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..095c0917e596
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sopel/default.nix
@@ -0,0 +1,61 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, isPyPy
+, dnspython
+, geoip2
+, ipython
+, praw
+, pyenchant
+, pygeoip
+, pytestCheckHook
+, python
+, pytz
+, sqlalchemy
+, xmltodict
+}:
+
+buildPythonPackage rec {
+  pname = "sopel";
+  version = "7.0.7";
+  disabled = isPyPy;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "84d42708d176aecfb7b95299af0e484896f5f80df61f43c92d8e7a53de0b2099";
+  };
+
+  propagatedBuildInputs = [
+    dnspython
+    geoip2
+    ipython
+    praw
+    pyenchant
+    pygeoip
+    pytz
+    sqlalchemy
+    xmltodict
+  ];
+
+  # remove once https://github.com/sopel-irc/sopel/pull/1653 lands
+  postPatch = ''
+    substituteInPlace requirements.txt \
+      --replace "praw>=4.0.0,<6.0.0" "praw"
+  '';
+
+  checkInputs = [ pytestCheckHook ];
+
+  preCheck = ''
+    export TESTDIR=$(mktemp -d)
+    cp -R ./test $TESTDIR
+    pushd $TESTDIR
+  '';
+
+  postCheck = ''
+    popd
+  '';
+
+  meta = with lib; {
+    description = "Simple and extensible IRC bot";
+    homepage = "http://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..e918a1aee3bc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sorl_thumbnail/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, setuptools_scm
+}:
+
+buildPythonPackage rec {
+  pname = "sorl-thumbnail";
+  version = "12.7.0";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "fbe6dfd66a1aceb7e0203895ff5622775e50266f8d8cfd841fe1500bd3e19018";
+  };
+
+  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..3f4a68406726
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sortedcontainers/default.nix
@@ -0,0 +1,24 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "sortedcontainers";
+  version = "2.3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "59cc937650cf60d677c16775597c89a960658a09cf7c1a668f86e1e4464b10a1";
+  };
+
+  # pypi tarball does not come with tests
+  doCheck = false;
+
+  meta = {
+    description = "Python Sorted Container Types: SortedList, SortedDict, and SortedSet";
+    homepage = "http://www.grantjenks.com/docs/sortedcontainers/";
+    license = lib.licenses.asl20;
+    maintainers = with lib.maintainers; [ costrouc ];
+  };
+}
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..7787e8b16b85
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sounddevice/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, cffi
+, numpy
+, portaudio
+, substituteAll
+}:
+
+buildPythonPackage rec {
+  pname = "sounddevice";
+  version = "0.4.1";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f21978921186c0c7183af032fab77b735d824f3e926d76adb3fd0912e289ce0b";
+  };
+
+  propagatedBuildInputs = [ cffi numpy portaudio ];
+
+  # No tests included nor upstream available.
+  doCheck = false;
+
+  patches = [
+    (substituteAll {
+      src = ./fix-portaudio-library-path.patch;
+      portaudio = "${portaudio}/lib/libportaudio.so.2";
+    })
+  ];
+
+  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..dea0e345a999
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/soundfile/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest
+, numpy
+, libsndfile
+, cffi
+, isPyPy
+, stdenv
+}:
+
+buildPythonPackage rec {
+  pname = "soundfile";
+  version = "0.10.3.post1";
+
+  src = fetchPypi {
+    pname = "SoundFile";
+    inherit version;
+    sha256 = "0yqhrfz7xkvqrwdxdx2ydy4h467sk7z3gf984y1x2cq7cm1gy329";
+  };
+
+    checkInputs = [ pytest ];
+    propagatedBuildInputs = [ numpy libsndfile cffi ];
+
+    meta = {
+      description = "An audio library based on libsndfile, CFFI and NumPy";
+      license = lib.licenses.bsd3;
+      homepage = "https://github.com/bastibe/PySoundFile";
+      maintainers = with lib.maintainers; [ fridh ];
+    };
+
+    postPatch = ''
+      substituteInPlace soundfile.py --replace "_find_library('sndfile')" "'${libsndfile.out}/lib/libsndfile${stdenv.hostPlatform.extensions.sharedLibrary}'"
+    '';
+
+    # https://github.com/bastibe/PySoundFile/issues/157
+    disabled = isPyPy ||  stdenv.isi686;
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/soupsieve/1.nix b/nixpkgs/pkgs/development/python-modules/soupsieve/1.nix
new file mode 100644
index 000000000000..bb5ecbc839c2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/soupsieve/1.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest
+, beautifulsoup4
+, isPy3k
+, backports_functools_lru_cache
+}:
+
+buildPythonPackage rec {
+  pname = "soupsieve";
+  version = "1.9.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "7985bacc98c34923a439967c1a602dc4f1e15f923b6fcf02344184f86cc7efaa";
+  };
+
+  checkPhase = ''
+    py.test
+  '';
+
+  checkInputs = [ pytest beautifulsoup4 ];
+
+  propagatedBuildInputs = lib.optional (!isPy3k) backports_functools_lru_cache;
+
+  # Circular test dependency on beautifulsoup4
+  doCheck = false;
+
+  meta = {
+    description = "A CSS4 selector implementation for Beautiful Soup";
+    license = lib.licenses.mit;
+    homepage = "https://github.com/facelessuser/soupsieve";
+  };
+
+}
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..22d1926d8bb4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/soupsieve/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest
+, beautifulsoup4
+, isPy3k
+, backports_functools_lru_cache
+}:
+
+buildPythonPackage rec {
+  pname = "soupsieve";
+  version = "2.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a59dc181727e95d25f781f0eb4fd1825ff45590ec8ff49eadfd7f1a537cc0232";
+  };
+
+  checkPhase = ''
+    py.test
+  '';
+
+  checkInputs = [ pytest beautifulsoup4 ];
+
+  propagatedBuildInputs = lib.optional (!isPy3k) backports_functools_lru_cache;
+
+  # Circular test dependency on beautifulsoup4
+  doCheck = false;
+
+  meta = {
+    description = "A CSS4 selector implementation for Beautiful Soup";
+    license = lib.licenses.mit;
+    homepage = "https://github.com/facelessuser/soupsieve";
+  };
+
+}
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..822eb8ac0743
--- /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', 'ORG'),
+        ('earlier this week', 'DATE')
+    ]
+
+
+def test_nouns(doc_en_core_web_sm):
+    assert [
+        chunk.text for chunk in doc_en_core_web_sm.noun_chunks] == [
+        'Sebastian Thrun',
+        'self-driving cars',
+        'Google',
+        'few people',
+        'the company',
+        'him',
+        'I',
+        'you',
+        'very senior CEOs',
+        'major American car companies',
+        'my hand',
+        'I',
+        'Thrun',
+        'an interview',
+        'Recode']
+
+
+def test_verbs(doc_en_core_web_sm):
+    assert [
+        token.lemma_ for token in doc_en_core_web_sm if token.pos_ == "VERB"] == [
+        'start',
+        'work',
+        'drive',
+        'take',
+        'can',
+        'tell',
+        'would',
+        'shake',
+        'turn',
+        'talk',
+        'say']
diff --git a/nixpkgs/pkgs/development/python-modules/spacy/annotation-test/default.nix b/nixpkgs/pkgs/development/python-modules/spacy/annotation-test/default.nix
new file mode 100644
index 000000000000..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..e13127abeb31
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/spacy/default.nix
@@ -0,0 +1,76 @@
+{ lib
+, buildPythonPackage
+, callPackage
+, fetchPypi
+, pythonOlder
+, pytest
+, blis
+, catalogue
+, cymem
+, jsonschema
+, murmurhash
+, numpy
+, pathlib
+, plac
+, preshed
+, requests
+, setuptools
+, srsly
+, thinc
+, wasabi
+}:
+
+buildPythonPackage rec {
+  pname = "spacy";
+  version = "2.3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "315278ab60094643baecd866017c7d4cbd966efd2d517ad0e6c888edf7fa5aef";
+  };
+
+  propagatedBuildInputs = [
+    blis
+    catalogue
+    cymem
+    jsonschema
+    murmurhash
+    numpy
+    plac
+    preshed
+    requests
+    setuptools
+    srsly
+    thinc
+    wasabi
+  ] ++ lib.optional (pythonOlder "3.4") pathlib;
+
+  checkInputs = [
+    pytest
+  ];
+
+  doCheck = false;
+  # checkPhase = ''
+  #   ${python.interpreter} -m pytest spacy/tests --vectors --models --slow
+  # '';
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "blis>=0.4.0,<0.8.0" "blis>=0.4.0,<1.0" \
+      --replace "catalogue>=0.0.7,<1.1.0" "catalogue>=0.0.7,<3.0" \
+      --replace "plac>=0.9.6,<1.2.0" "plac>=0.9.6,<2.0" \
+      --replace "srsly>=1.0.2,<1.1.0" "srsly>=1.0.2,<3.0" \
+      --replace "thinc>=7.4.1,<7.5.0" "thinc>=7.4.1,<8"
+  '';
+
+  pythonImportsCheck = [ "spacy" ];
+
+  passthru.tests.annotation = callPackage ./annotation-test { };
+
+  meta = with lib; {
+    description = "Industrial-strength Natural Language Processing (NLP) with Python and Cython";
+    homepage = "https://github.com/explosion/spaCy";
+    license = licenses.mit;
+    maintainers = with maintainers; [ danieldk sdll ];
+  };
+}
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..3a427f8932a5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/spacy/models.json
@@ -0,0 +1,264 @@
+[{
+  "pname": "da_core_news_lg",
+  "version": "2.3.0",
+  "sha256": "18y1jany1ha27jkwb9563haxsbylm0axkh5c8009lsfxc8y2w9hr",
+  "license": "cc-by-sa-40"
+},
+{
+  "pname": "da_core_news_md",
+  "version": "2.3.0",
+  "sha256": "06nm5grj5jdx0rja7vw1f91vvd69p6vhafrwpfr1npqk24j6cacb",
+  "license": "cc-by-sa-40"
+},
+{
+  "pname": "da_core_news_sm",
+  "version": "2.3.0",
+  "sha256": "00byhlrcbg4wxplr473g9b3126pvk4vwy0q34xg0zx4994qb6rgn",
+  "license": "cc-by-sa-40"
+},
+{
+  "pname": "de_core_news_lg",
+  "version": "2.3.0",
+  "sha256": "0rixhgdz4z7sq6f2b1w3n5cn1645cr37g40hbd9xzlvdzdf5cg6d",
+  "license": "mit"
+},
+{
+  "pname": "de_core_news_md",
+  "version": "2.3.0",
+  "sha256": "0kxir1w000r5fn1kpa38m7688xinkn2mk1m82aiwqlck3r72jdi6",
+  "license": "mit"
+},
+{
+  "pname": "de_core_news_sm",
+  "version": "2.3.0",
+  "sha256": "00cbmrf4njg28laysapdnp4rv4lw4yw03rxkynw1ain5fwb0izl7",
+  "license": "mit"
+},
+{
+  "pname": "el_core_news_lg",
+  "version": "2.3.0",
+  "sha256": "001c19dd1kirlvzbdv2i89zw8nf6c4icv2w0chm7rd6x9m3i13gd",
+  "license": "cc-by-nc-sa-30"
+},
+{
+  "pname": "el_core_news_md",
+  "version": "2.3.0",
+  "sha256": "170x8bzm5nf02mhkxyxjk58yk2639hsjb5b9prcc69500c0vmnp0",
+  "license": "cc-by-nc-sa-30"
+},
+{
+  "pname": "el_core_news_sm",
+  "version": "2.3.0",
+  "sha256": "10mh3za4jvr07rawzk8ps642rp11s3smraj9xvrxflik4fqkz18b",
+  "license": "cc-by-nc-sa-30"
+},
+{
+  "pname": "en_core_web_lg",
+  "version": "2.3.0",
+  "sha256": "0mfa5wz31ya295jhyj489gb4qy806zmpq1zc11bvv5alv2m35if2",
+  "license": "mit"
+},
+{
+  "pname": "en_core_web_md",
+  "version": "2.3.0",
+  "sha256": "1ys8sqkhiap1mq6mhbkbq8bc07lvl68xngbx725xkwvirzl5gabh",
+  "license": "mit"
+},
+{
+  "pname": "en_core_web_sm",
+  "version": "2.3.0",
+  "sha256": "04icv9qf4pj53ll8vqxcjl2a723q1k00i7lifk8wx5saif28g37a",
+  "license": "mit"
+},
+{
+  "pname": "en_vectors_web_lg",
+  "version": "2.3.0",
+  "sha256": "13g012rwh0bcxx3ii5mmygqzyryah1y3zd000zhidnacc1x1g743",
+  "license": "cc-by-sa-30"
+},
+{
+  "pname": "es_core_news_lg",
+  "version": "2.3.0",
+  "sha256": "1r0pr0lzs3j9w7rd5z9nw87iayjm36v7f7gamvaiiphs6bc5p7ls",
+  "license": "gpl3"
+},
+{
+  "pname": "es_core_news_md",
+  "version": "2.3.0",
+  "sha256": "0nz33bmpr3rxqbnv6vb1id8pkfsvh8ii8vqplwgb3b8772kmpzy2",
+  "license": "gpl3"
+},
+{
+  "pname": "es_core_news_sm",
+  "version": "2.3.0",
+  "sha256": "02xqhg4m0gg5r9yibvl02zixkll6w0nsmbdhp07y5yyaqjarc90d",
+  "license": "gpl3"
+},
+{
+  "pname": "fr_core_news_lg",
+  "version": "2.3.0",
+  "sha256": "1yliamws8nqqjhpk9gr2dzlk0dms2mr958zbj21biv8fimbq60ik",
+  "license": "lgpllr"
+},
+{
+  "pname": "fr_core_news_md",
+  "version": "2.3.0",
+  "sha256": "04fk212ksac3bp9dj7dmzsdcnbqmbsgymsic6ddcv9zbfdv5d0db",
+  "license": "lgpllr"
+},
+{
+  "pname": "fr_core_news_sm",
+  "version": "2.3.0",
+  "sha256": "0kldww855z67qfc9maa9z1lsvdf5vj5vc8gj0x3h68kv5n1xr4h0",
+  "license": "lgpllr"
+},
+{
+  "pname": "it_core_news_lg",
+  "version": "2.3.0",
+  "sha256": "192rdmqnwl3ajxzhnw4r1cqv5bkziv0yc2bbzckmzqss64wk7k70",
+  "license": "cc-by-nc-sa-30"
+},
+{
+  "pname": "it_core_news_md",
+  "version": "2.3.0",
+  "sha256": "019ih4vwq1w6j38j0wc8pyyg1an6yy37wxq2w4amwppynmmcnd5w",
+  "license": "cc-by-nc-sa-30"
+},
+{
+  "pname": "it_core_news_sm",
+  "version": "2.3.0",
+  "sha256": "1c3ywqa8li0j7cyvd1xqbb096y61978hd6qv7rc6cxxjdhmkrrds",
+  "license": "cc-by-nc-sa-40"
+},
+{
+  "pname": "lt_core_news_lg",
+  "version": "2.3.0",
+  "sha256": "0hn5w8n7mgv33i6gvnaxl1j44n9gz4j86gg1a9jjlgdw5z98n0p2",
+  "license": "cc-by-sa-40"
+},
+{
+  "pname": "lt_core_news_md",
+  "version": "2.3.0",
+  "sha256": "1xya79cz2xd5vgzg6qg0ww5j2bmv7kppdk3mdjf6zpwrlzwdbk5d",
+  "license": "cc-by-sa-40"
+},
+{
+  "pname": "lt_core_news_sm",
+  "version": "2.3.0",
+  "sha256": "0r3rbqgz4897wyhz5jli30lryb45039f4rlvn4q0364cg1pm92g9",
+  "license": "cc-by-sa-40"
+},
+{
+  "pname": "nb_core_news_lg",
+  "version": "2.3.0",
+  "sha256": "18mblypw3c82004qz5w1p3262iqwn99wl9b781dq7aqwxskr02d6",
+  "license": "mit"
+},
+{
+  "pname": "nb_core_news_md",
+  "version": "2.3.0",
+  "sha256": "0iw97k9glxbar8mrpvnmmcb1nffgdhb83akn99p53pwmqbzxy9p3",
+  "license": "mit"
+},
+{
+  "pname": "nb_core_news_sm",
+  "version": "2.3.0",
+  "sha256": "07b7xri2q3m7fvn9a2gjc1044a3f14231vr32hrw96h7k6vg95h7",
+  "license": "mit"
+},
+{
+  "pname": "nl_core_news_lg",
+  "version": "2.3.0",
+  "sha256": "016166kzpgi0p3m0x3k308a0r60a28yz7npagjvmpl1dfm9lzhnv",
+  "license": "cc-by-sa-40"
+},
+{
+  "pname": "nl_core_news_md",
+  "version": "2.3.0",
+  "sha256": "1anfhig531k9k14s0cbgsvmvifp3h50qi1h8dhx894kjmq10k2lg",
+  "license": "cc-by-sa-40"
+},
+{
+  "pname": "nl_core_news_sm",
+  "version": "2.3.0",
+  "sha256": "0alvz7pn7cj0yax8h5gp71vrdblh3mcsmyhzgiddsd44ry35nxnj",
+  "license": "cc-by-sa-40"
+},
+{
+  "pname": "pl_core_news_lg",
+  "version": "2.3.0",
+  "sha256": "1acchp8pv1h4c6cwvxz07lh4ychn6aw809zfg3mbbsxgsgd2ahjr",
+  "license": "gpl3"
+},
+{
+  "pname": "pl_core_news_md",
+  "version": "2.3.0",
+  "sha256": "19jjjjvbys3ayibkm3cx497b4bh63ll39hfq04wx116rj4ajpwwg",
+  "license": "gpl3"
+},
+{
+  "pname": "pl_core_news_sm",
+  "version": "2.3.0",
+  "sha256": "166mqlfkgiszcc6hwg2mr6sir9y88y22nd81a1nidq0fiif5lfji",
+  "license": "gpl3"
+},
+{
+  "pname": "pt_core_news_lg",
+  "version": "2.3.0",
+  "sha256": "18gvdmfwyy2sbq6206imglhghyagd6a4gb6wcfkwhm7lzbnq714d",
+  "license": "cc-by-sa-40"
+},
+{
+  "pname": "pt_core_news_md",
+  "version": "2.3.0",
+  "sha256": "1yxnpwby2aq6ydvd35lylc4fs141fisfnzlx8pl88pp2b2gxijvl",
+  "license": "cc-by-sa-40"
+},
+{
+  "pname": "pt_core_news_sm",
+  "version": "2.3.0",
+  "sha256": "1vcvzdg9f93x0vaafkk9l9xhpmaavfj0cf0l3p06c5kx2d76f9ph",
+  "license": "cc-by-sa-40"
+},
+{
+  "pname": "ro_core_news_sm",
+  "version": "2.3.0",
+  "sha256": "0lsmbdwsaczv37y5sa1vvgwszy2hs8jp24a0nvc5qm8vb71rxj8w",
+  "license": "cc-by-sa-40"
+},
+{
+  "pname": "ro_core_news_md",
+  "version": "2.3.0",
+  "sha256": "1igwkz3yd1117gi2g78yilh9ln8n5yrdimas4prfxjgzwid3q8bc",
+  "license": "cc-by-sa-40"
+},
+{
+  "pname": "ro_core_news_lg",
+  "version": "2.3.0",
+  "sha256": "0id1y32kjfans7llh1i55rgr4n2x6xn208y4qf6yl3pbc17i0n9z",
+  "license": "cc-by-sa-40"
+},
+{
+  "pname": "xx_ent_wiki_sm",
+  "version": "2.3.0",
+  "sha256": "0x3zmmybl5kh4dn5prkfmr4q5j9bh13p40qc3rhdfi0i3jxc11pn",
+  "license": "mit"
+},
+{
+  "pname": "zh_core_web_lg",
+  "version": "2.3.1",
+  "sha256": "17zxk7cz47k07yb3qaigc3sx4dj4zwilr1lsn2jq6w7jc8k2h1ll",
+  "license": "mit"
+},
+{
+  "pname": "zh_core_web_md",
+  "version": "2.3.1",
+  "sha256": "1n4iwxyam4ykn0f9jdzwkhczack8r9c3kkbyga3c4h6iwqsflzcj",
+  "license": "mit"
+},
+{
+  "pname": "zh_core_web_sm",
+  "version": "2.3.1",
+  "sha256": "1lj5nwhx38cpwnvajwxlfkf84dr1xx2h6wwbg3scycsh459i9fpc",
+  "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..8c57d2e0d262
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/spacy/models.nix
@@ -0,0 +1,31 @@
+{ lib, buildPythonPackage, fetchurl, jieba, pkuseg, spacy }:
+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 pkuseg ];
+
+    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/spambayes/default.nix b/nixpkgs/pkgs/development/python-modules/spambayes/default.nix
new file mode 100644
index 000000000000..f33748379d1e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/spambayes/default.nix
@@ -0,0 +1,20 @@
+{ buildPythonPackage, isPy3k, fetchPypi, bsddb3, pydns, lockfile }:
+
+buildPythonPackage rec {
+  pname = "spambayes";
+  version = "1.1b3";
+
+  disabled = isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "016r3g43ja73rls1nh1dl82d75lgsjdl4cv2r5s7zcihm47nb38q";
+  };
+
+  propagatedBuildInputs = [ bsddb3 pydns lockfile ];
+
+  meta = {
+    description = "Statistical anti-spam filter, initially based on the work of Paul Graham";
+    homepage = "http://spambayes.sourceforge.net/";
+  };
+}
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..ba927431f2c0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/spark_parser/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv
+, 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/sparqlwrapper/default.nix b/nixpkgs/pkgs/development/python-modules/sparqlwrapper/default.nix
new file mode 100644
index 000000000000..b97cbee2a5fe
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sparqlwrapper/default.nix
@@ -0,0 +1,35 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, six
+, isodate
+, pyparsing
+, html5lib
+, keepalive
+}:
+
+buildPythonPackage rec {
+  pname = "SPARQLWrapper";
+  version = "1.8.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d6a66b5b8cda141660e07aeb00472db077a98d22cb588c973209c7336850fb3c";
+  };
+
+  # break circular dependency loop
+  patchPhase = ''
+    sed -i '/rdflib/d' requirements.txt
+  '';
+
+  # Doesn't actually run tests
+  doCheck = false;
+
+  propagatedBuildInputs = [ six isodate pyparsing html5lib 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..93ffa89c76c4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sparse/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+, dask
+, numpy
+, scipy
+, numba
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "sparse";
+  version = "0.11.2";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "bc5c35dbc81242237feb7a8e1f7d9c5e9dd9bb0910f6ec55f50dcc379082864f";
+  };
+
+  checkInputs = [ pytest dask ];
+  propagatedBuildInputs = [
+    numpy
+    scipy
+    numba
+  ];
+
+  checkPhase = ''
+    pytest sparse
+  '';
+
+  meta = with lib; {
+    description = "Sparse n-dimensional arrays computations";
+    homepage = "https://github.com/pydata/sparse/";
+    license = licenses.bsd3;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..efb0908dc5fc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/speaklater/default.nix
@@ -0,0 +1,22 @@
+{ lib, stdenv
+, 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/spectral-cube/default.nix b/nixpkgs/pkgs/development/python-modules/spectral-cube/default.nix
new file mode 100644
index 000000000000..d2f79c183480
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/spectral-cube/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, aplpy
+, joblib
+, astropy
+, radio_beam
+, pytest
+, pytest-astropy
+, astropy-helpers
+}:
+
+buildPythonPackage rec {
+  pname = "spectral-cube";
+  version = "0.5.0";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "17zisr26syfb8kn89xj17lrdycm0hsmy5yp5zrn236wgd8rjriki";
+  };
+
+  nativeBuildInputs = [ astropy-helpers ];
+  propagatedBuildInputs = [ astropy radio_beam joblib ];
+  checkInputs = [ aplpy pytest pytest-astropy ];
+
+  checkPhase = ''
+    pytest spectral_cube
+  '';
+
+  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..7476a54a98bd
--- /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.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0m1fpsb318mrpliw026a7nhx8iky306rmfi565734k7r49i3h7fg";
+  };
+
+  # 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..08bbb34156bf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/spglib/default.nix
@@ -0,0 +1,23 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, fetchpatch, numpy, nose, pyyaml }:
+
+buildPythonPackage rec {
+  pname = "spglib";
+  version = "1.16.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "94d056e48e7e6fe2e6fe4161471e774ac03221a6225fd83d551d3184220c1edf";
+  };
+
+  propagatedBuildInputs = [ numpy ];
+
+  checkInputs = [ nose pyyaml ];
+
+  meta = with lib; {
+    description = "Python bindings for C library for finding and handling crystal symmetries";
+    homepage = "https://atztogo.github.io/spglib";
+    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..3f1a80c3c97b
--- /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.2.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "05wc8f5hb3jsg2vh2jf7jsyan8d4i09ifrz2c8fp6f7x1zw9iav0";
+  };
+
+  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-jinja/default.nix b/nixpkgs/pkgs/development/python-modules/sphinx-jinja/default.nix
new file mode 100644
index 000000000000..060d7f14a336
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinx-jinja/default.nix
@@ -0,0 +1,30 @@
+{ lib, buildPythonPackage, fetchPypi, isPy27, pbr, sphinx, sphinx-testing, nose, glibcLocales }:
+
+buildPythonPackage rec {
+  pname = "sphinx-jinja";
+  version = "1.1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0hz13vc65zi4zmay40nz8wzxickv1q9zzl6x03qc7rvvapz0c91p";
+  };
+
+  buildInputs = [ pbr ];
+  propagatedBuildInputs = [ sphinx ];
+
+  checkInputs = [ sphinx-testing nose glibcLocales ];
+
+  checkPhase = lib.optionalString (!isPy27) ''
+    # prevent python from loading locally and breaking namespace
+    mv sphinxcontrib .sphinxcontrib
+  '' + ''
+    # Zip (epub) does not support files with epoch timestamp
+    LC_ALL="en_US.UTF-8" nosetests -e test_build_epub
+  '';
+
+  meta = with lib; {
+    description = "Sphinx extension to include jinja templates in documentation";
+    maintainers = with maintainers; [ nand0p ];
+    license = licenses.mit;
+  };
+}
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..02e5711e888f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinx-navtree/default.nix
@@ -0,0 +1,18 @@
+{ 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;
+  };
+}
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/2.nix b/nixpkgs/pkgs/development/python-modules/sphinx/2.nix
new file mode 100644
index 000000000000..5cf2cecd97f2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinx/2.nix
@@ -0,0 +1,82 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest
+, simplejson
+, mock
+, glibcLocales
+, html5lib
+, pythonOlder
+, enum34
+, python
+, docutils
+, jinja2
+, pygments
+, alabaster
+, Babel
+, snowballstemmer
+, six
+, sqlalchemy
+, whoosh
+, imagesize
+, requests
+, typing
+, sphinxcontrib-websupport
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "sphinx";
+  version = "1.8.5";
+  src = fetchPypi {
+    pname = "Sphinx";
+    inherit version;
+    sha256 = "c7658aab75c920288a8cf6f09f244c6cfdae30d82d803ac1634d9f223a80ca08";
+  };
+  LC_ALL = "en_US.UTF-8";
+
+  checkInputs = [ pytest ];
+  buildInputs = [ simplejson mock glibcLocales html5lib ] ++ lib.optional (pythonOlder "3.4") enum34;
+  # Disable two tests that require network access.
+  checkPhase = ''
+    cd tests; ${python.interpreter} run.py --ignore py35 -k 'not test_defaults and not test_anchors_ignored'
+  '';
+  propagatedBuildInputs = [
+    docutils
+    jinja2
+    pygments
+    alabaster
+    Babel
+    setuptools
+    snowballstemmer
+    six
+    sphinxcontrib-websupport
+    sqlalchemy
+    whoosh
+    imagesize
+    requests
+  ] ++ lib.optional (pythonOlder "3.5") typing;
+
+  # Lots of tests. Needs network as well at some point.
+  doCheck = false;
+
+  patches = [
+    # Since pygments 2.5, PythonLexer refers to python3. If we want to use
+    # python2, we need to explicitly specify Python2Lexer.
+    # Not upstreamed since there doesn't seem to be any upstream maintenance
+    # branch for 1.8 (and this patch doesn't make any sense for 2.x).
+    ./python2-lexer.patch
+  ];
+  # https://github.com/NixOS/nixpkgs/issues/22501
+  # Do not run `python sphinx-build arguments` but `sphinx-build arguments`.
+  postPatch = ''
+    substituteInPlace sphinx/make_mode.py --replace "sys.executable, " ""
+  '';
+
+  meta = {
+    description = "A tool that makes it easy to create intelligent and beautiful documentation for Python projects";
+    homepage = "http://sphinx.pocoo.org/";
+    license = lib.licenses.bsd3;
+    maintainers = with lib.maintainers; [ nand0p ];
+  };
+}
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..e4a3c94711fa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinx/default.nix
@@ -0,0 +1,79 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest
+, simplejson
+, mock
+, glibcLocales
+, html5lib
+, pythonOlder
+, enum34
+, python
+, docutils
+, jinja2
+, pygments
+, alabaster
+, Babel
+, snowballstemmer
+, six
+, whoosh
+, imagesize
+, requests
+, sphinxcontrib-applehelp
+, sphinxcontrib-devhelp
+, sphinxcontrib-htmlhelp
+, sphinxcontrib-jsmath
+, sphinxcontrib-qthelp
+, sphinxcontrib-serializinghtml
+, sphinxcontrib-websupport
+, typing
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "sphinx";
+  version = "3.3.1";
+  src = fetchPypi {
+    pname = "Sphinx";
+    inherit version;
+    sha256 = "1e8d592225447104d1172be415bc2972bd1357e3e12fdc76edf2261105db4300";
+  };
+  LC_ALL = "en_US.UTF-8";
+
+  checkInputs = [ pytest ];
+  buildInputs = [ simplejson mock glibcLocales html5lib ] ++ lib.optional (pythonOlder "3.4") enum34;
+  # Disable two tests that require network access.
+  checkPhase = ''
+    cd tests; ${python.interpreter} run.py --ignore py35 -k 'not test_defaults and not test_anchors_ignored'
+  '';
+  propagatedBuildInputs = [
+    docutils
+    jinja2
+    pygments
+    alabaster
+    Babel
+    setuptools
+    snowballstemmer
+    six
+    whoosh
+    imagesize
+    requests
+    sphinxcontrib-applehelp
+    sphinxcontrib-devhelp
+    sphinxcontrib-htmlhelp
+    sphinxcontrib-jsmath
+    sphinxcontrib-qthelp
+    sphinxcontrib-serializinghtml
+    sphinxcontrib-websupport
+  ] ++ lib.optional (pythonOlder "3.5") typing;
+
+  # Lots of tests. Needs network as well at some point.
+  doCheck = false;
+
+  meta = {
+    description = "A tool that makes it easy to create intelligent and beautiful documentation for Python projects";
+    homepage = "http://sphinx.pocoo.org/";
+    license = lib.licenses.bsd3;
+    maintainers = with lib.maintainers; [ nand0p ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sphinx/python2-lexer.patch b/nixpkgs/pkgs/development/python-modules/sphinx/python2-lexer.patch
new file mode 100644
index 000000000000..cf4a243315a2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinx/python2-lexer.patch
@@ -0,0 +1,22 @@
+diff --git a/sphinx/highlighting.py b/sphinx/highlighting.py
+index ac2bd1b06..63ca52de2 100644
+--- a/sphinx/highlighting.py
++++ b/sphinx/highlighting.py
+@@ -16,7 +16,7 @@ from pygments.filters import ErrorToken
+ from pygments.formatters import HtmlFormatter, LatexFormatter
+ from pygments.lexer import Lexer  # NOQA
+ from pygments.lexers import get_lexer_by_name, guess_lexer
+-from pygments.lexers import PythonLexer, Python3Lexer, PythonConsoleLexer, \
++from pygments.lexers import Python2Lexer, Python3Lexer, PythonConsoleLexer, \
+     CLexer, TextLexer, RstLexer
+ from pygments.styles import get_style_by_name
+ from pygments.util import ClassNotFound
+@@ -40,7 +40,7 @@ logger = logging.getLogger(__name__)
+ 
+ lexers = dict(
+     none = TextLexer(stripnl=False),
+-    python = PythonLexer(stripnl=False),
++    python = Python2Lexer(stripnl=False),
+     python3 = Python3Lexer(stripnl=False),
+     pycon = PythonConsoleLexer(stripnl=False),
+     pycon3 = PythonConsoleLexer(python3=True, stripnl=False),
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..77f283795db5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinx_pypi_upload/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv
+, 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/sphinx_rtd_theme/default.nix b/nixpkgs/pkgs/development/python-modules/sphinx_rtd_theme/default.nix
new file mode 100644
index 000000000000..11e3c2a87e93
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinx_rtd_theme/default.nix
@@ -0,0 +1,33 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, sphinx
+, readthedocs-sphinx-ext
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "sphinx_rtd_theme";
+  version = "0.4.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "728607e34d60456d736cc7991fd236afb828b21b82f956c5ea75f94c8414040a";
+  };
+
+  propagatedBuildInputs = [ sphinx ];
+
+  checkInputs = [ readthedocs-sphinx-ext pytest ];
+
+  checkPhase = ''
+    py.test
+  '';
+
+  meta = with lib; {
+    description = "ReadTheDocs.org theme for Sphinx";
+    homepage = "https://github.com/snide/sphinx_rtd_theme/";
+    license = licenses.bsd3;
+    platforms = platforms.unix;
+  };
+
+}
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..e2bfc5bdaa55
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-applehelp/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv
+, 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 = "http://sphinx-doc.org/";
+    license = licenses.bsd0;
+  };
+
+}
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..6822c0f153d3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-autoapi/default.nix
@@ -0,0 +1,43 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, astroid
+, jinja2
+, sphinx
+, pyyaml
+, unidecode
+, mock
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "sphinx-autoapi";
+  version = "1.5.1";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "19m9yvlqwaw3b05lbb1vcla38irn4riw2ij0vjmnc2xq4f1qfl2d";
+  };
+
+  propagatedBuildInputs = [ astroid jinja2 pyyaml sphinx unidecode ];
+
+  checkInputs = [
+    mock
+    pytest
+  ];
+
+  checkPhase = ''
+    pytest
+  '';
+
+  meta = with lib; {
+    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-bibtex/default.nix b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-bibtex/default.nix
new file mode 100644
index 000000000000..b429522f9d3c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-bibtex/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+, oset
+, pybtex
+, pybtex-docutils
+, sphinx
+}:
+
+buildPythonPackage rec {
+  version = "1.0.0";
+  pname = "sphinxcontrib-bibtex";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "629612b001f86784669d65e662377a482052decfd9a0a17c46860878eef7b9e0";
+  };
+
+  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..a2603b876e5e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-blockdiag/default.nix
@@ -0,0 +1,36 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, python
+, mock
+, sphinx-testing
+, sphinx
+, blockdiag
+}:
+
+buildPythonPackage rec {
+  pname = "sphinxcontrib-blockdiag";
+  version = "2.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "91fd35b64f1f25db59d80b8a5196ed4ffadf57a81f63ee207e34d53ec36d8f97";
+  };
+
+  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; [ nand0p ];
+    license = licenses.bsd2;
+  };
+
+}
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..7398cbc433ff
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-devhelp/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv
+, 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 = "http://sphinx-doc.org/";
+    license = licenses.bsd0;
+  };
+
+}
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..150840f19b40
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-htmlhelp/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPy27
+}:
+
+buildPythonPackage rec {
+  pname = "sphinxcontrib-htmlhelp";
+  version = "1.0.3";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "e8f5bb7e31b2dbb25b9cc435c8ab7a79787ebf7f906155729338f3156d93659b";
+  };
+
+
+  # Check is disabled due to circular dependency of sphinx
+  doCheck = false;
+
+  meta = with lib; {
+    description = "sphinxcontrib-htmlhelp is a sphinx extension which ...";
+    homepage = "http://sphinx-doc.org/";
+    license = licenses.bsd0;
+  };
+
+}
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..609799f18647
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-jsmath/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv
+, 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 = "http://sphinx-doc.org/";
+    license = licenses.bsd0;
+  };
+
+}
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..6fcafd438ba0
--- /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.7.1";
+
+  # 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 = "fa80aba8af9d78f70a0a255815d44e33e8aca8e806ca6101e0eb18b2b7243246";
+  };
+
+  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-openapi/default.nix b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-openapi/default.nix
new file mode 100644
index 000000000000..6375bdab3c24
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-openapi/default.nix
@@ -0,0 +1,33 @@
+{ lib, stdenv
+, 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-qthelp/default.nix b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-qthelp/default.nix
new file mode 100644
index 000000000000..adf02860d127
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-qthelp/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv
+, 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 = "http://sphinx-doc.org/";
+    license = licenses.bsd0;
+  };
+
+}
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..52ebe15c1b62
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-serializinghtml/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPy27
+}:
+
+buildPythonPackage rec {
+  pname = "sphinxcontrib-serializinghtml";
+  version = "1.1.4";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "eaa0eccc86e982a9b939b2b82d12cc5d013385ba5eadcc7e4fed23f4405f77bc";
+  };
+
+
+  # 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 = "http://sphinx-doc.org/";
+    license = licenses.bsd0;
+  };
+
+}
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..a3054f341450
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-spelling/default.nix
@@ -0,0 +1,34 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, importlib-metadata
+, sphinx
+, pyenchant
+, pbr
+}:
+
+buildPythonPackage rec {
+  pname = "sphinxcontrib-spelling";
+  version = "7.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "5b4240808a6d21eab9c49e69ad5ac0cb3efb03fe2e94763d23c860f85ec6a799";
+  };
+
+  propagatedBuildInputs = [ sphinx pyenchant pbr ]
+    ++ lib.optionals (pythonOlder "3.8") [ importlib-metadata ];
+
+  # No tests included
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Sphinx spelling extension";
+    homepage = "https://bitbucket.org/dhellmann/sphinxcontrib-spelling";
+    maintainers = with maintainers; [ nand0p ];
+    license = licenses.bsd2;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sphinxcontrib-tikz/binary-paths.patch b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-tikz/binary-paths.patch
new file mode 100644
index 000000000000..847a6e076918
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-tikz/binary-paths.patch
@@ -0,0 +1,22 @@
+diff --git a/sphinxcontrib/tikz.py b/sphinxcontrib/tikz.py
+index ee21113..a4f4589 100644
+--- a/sphinxcontrib/tikz.py
++++ b/sphinxcontrib/tikz.py
+@@ -242,7 +242,7 @@ def render_tikz(self, node, libs='', stringsubst=False):
+         tf.write(latex)
+         tf.close()
+ 
+-        system([self.builder.config.latex_engine, '--interaction=nonstopmode',
++        system(['@texLive@/bin/pdflatex', '--interaction=nonstopmode',
+                 'tikz-%s.tex' % shasum],
+                self.builder)
+ 
+@@ -281,7 +281,7 @@ def render_tikz(self, node, libs='', stringsubst=False):
+                     '-sOutputFile=%s' % outfn, '-r' + resolution + 'x' + resolution,
+                     '-f', 'tikz-%s.pdf' % shasum], self.builder)
+         elif self.builder.config.tikz_proc_suite == "pdf2svg":
+-            system(['pdf2svg', 'tikz-%s.pdf' % shasum, outfn], self.builder)
++            system(['@pdf2svg@/bin/pdf2svg', 'tikz-%s.pdf' % shasum, outfn], self.builder)
+         else:
+             self.builder._tikz_warned = True
+             raise TikzExtError('Error (tikz extension): Invalid configuration '
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..6b03c245ebb7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-tikz/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, substituteAll
+, buildPythonPackage
+, fetchPypi
+, sphinx
+, pdf2svg
+, texLive
+}:
+
+buildPythonPackage rec {
+  pname = "sphinxcontrib-tikz";
+  version = "0.4.9";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "054429a04ed253256a676ecc29f0bae2c644d5bd1150cd95d658990a07ebc8fe";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./binary-paths.patch;
+      inherit texLive pdf2svg;
+    })
+  ];
+
+  propagatedBuildInputs = [ sphinx ];
+
+  # no tests in package
+  doCheck = false;
+
+  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/1_1.nix b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-websupport/1_1.nix
new file mode 100644
index 000000000000..b1bdf6a0dff6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-websupport/1_1.nix
@@ -0,0 +1,25 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "sphinxcontrib-websupport";
+  version = "1.1.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1501befb0fdf1d1c29a800fdbf4ef5dc5369377300ddbdd16d2cd40e54c6eefc";
+  };
+
+  propagatedBuildInputs = [ six ];
+
+  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-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..ee652b42d8a1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinxcontrib_httpdomain/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, sphinx
+}:
+
+buildPythonPackage rec {
+  pname = "sphinxcontrib-httpdomain";
+  version = "1.7.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ac40b4fba58c76b073b03931c7b8ead611066a6aebccafb34dc19694f4eb6335";
+  };
+
+  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..2d56b57df9be
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinxcontrib_newsfeed/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv
+, 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/sphinxcontrib_plantuml/default.nix b/nixpkgs/pkgs/development/python-modules/sphinxcontrib_plantuml/default.nix
new file mode 100644
index 000000000000..db8997dfd216
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinxcontrib_plantuml/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, sphinx
+, plantuml
+}:
+
+buildPythonPackage rec {
+  pname = "sphinxcontrib-plantuml";
+  version = "0.19";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "98b9f02282907b0c5b7a93a446c4649909aaf5785d2da0dd263c8ad68e00e288";
+  };
+
+  # 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/";
+    license = with licenses; [ bsd2 ];
+  };
+
+}
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..0d0fd582363e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/spidev/default.nix
@@ -0,0 +1,24 @@
+{ 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 ];
+  };
+
+}
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..fde5733a864a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/splinter/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, selenium
+, flask
+, coverage
+}:
+
+buildPythonPackage rec {
+  pname = "splinter";
+  version = "0.14.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "459e39e7a9f7572db6f1cdb5fdc5ccfc6404f021dccb969ee6287be2386a40db";
+  };
+
+  propagatedBuildInputs = [ selenium ];
+
+  checkInputs = [ flask coverage ];
+
+  # No tests included
+  doCheck = false;
+
+  meta = {
+    description = "Browser abstraction for web acceptance testing";
+    homepage = "https://github.com/cobrateam/splinter";
+    license = lib.licenses.bsd3;
+  };
+}
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..63ec4abcac42
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/spotipy/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, requests
+, six }:
+
+buildPythonPackage rec {
+  pname = "spotipy";
+  version = "2.16.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1f50xczv8kgly6wz6zrvqzwdj6nvhdlgx8wnrhmbipjrb6qacr25";
+  };
+
+  propagatedBuildInputs = [ 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/spyder-kernels/0.x.nix b/nixpkgs/pkgs/development/python-modules/spyder-kernels/0.x.nix
new file mode 100644
index 000000000000..a760033c915a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/spyder-kernels/0.x.nix
@@ -0,0 +1,71 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, cloudpickle
+, ipykernel
+, wurlitzer
+, jupyter_client
+, pyzmq
+, numpy
+, pandas
+, scipy
+, matplotlib
+, xarray
+, pytestCheckHook
+, flaky
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "spyder-kernels";
+  version = "0.5.2";
+
+  src = fetchFromGitHub {
+    owner = "spyder-ide";
+    repo = "spyder-kernels";
+    rev = "v${version}";
+    sha256 = "1yan589g0470y61bcyjy3wj13i94ndyffckqdyrg97vw2qhfrisb";
+  };
+
+  # requirement xarray not available on Py2k
+  disabled = !isPy3k;
+
+  propagatedBuildInputs = [
+    cloudpickle
+    ipykernel
+    wurlitzer
+    jupyter_client
+    pyzmq
+  ];
+
+  checkInputs = [
+    numpy
+    pandas
+    scipy
+    matplotlib
+    xarray
+    pytestCheckHook
+    flaky
+  ];
+
+  preCheck = ''
+    export JUPYTER_RUNTIME_DIR=$(mktemp -d)
+  '';
+
+  # skipped tests:
+  # turtle requires graphics
+  # cython test fails, I don't think this can ever access cython?
+  # umr pathlist test assumes standard directories, not compatible with nix
+  disabledTests = [
+    "test_turtle_launc"
+    "test_umr_skip_cython"
+    "test_umr_pathlist"
+  ];
+
+  meta = with lib; {
+    description = "Jupyter kernels for Spyder's console";
+    homepage = "https://github.com/spyder-ide/spyder-kernels";
+    license = licenses.mit;
+    maintainers = with maintainers; [ gebner marcus7070 ];
+  };
+}
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..e0a8d6b9c18a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/spyder-kernels/default.nix
@@ -0,0 +1,32 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, cloudpickle, ipykernel, wurlitzer,
+  jupyter_client, pyzmq }:
+
+buildPythonPackage rec {
+  pname = "spyder-kernels";
+  version = "1.10.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "588602b9f44961f4011a9ec83fe85f5d621126eee64835e407a7d41c54dccc74";
+  };
+
+  propagatedBuildInputs = [
+    cloudpickle
+    ipykernel
+    wurlitzer
+    jupyter_client
+    pyzmq
+  ];
+
+  # 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/3.nix b/nixpkgs/pkgs/development/python-modules/spyder/3.nix
new file mode 100644
index 000000000000..34d59d0eb227
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/spyder/3.nix
@@ -0,0 +1,46 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub, jedi, pycodestyle,
+  psutil, pyflakes, rope, pylint, keyring, numpydoc,
+  qtconsole, qtawesome, nbconvert, mccabe, pyopengl, cloudpickle, pygments,
+  spyder-kernels_0_5, qtpy, pyzmq, chardet, pyqtwebengine
+}:
+
+buildPythonPackage rec {
+  pname = "spyder";
+  version = "3.3.6";
+
+  src = fetchFromGitHub {
+    owner = "spyder-ide";
+    repo = "spyder";
+    rev = "v3.3.6";
+    sha256 = "1sk9xajhzpklk5bcbdhpfhx3gxhyrahsmj9bv2m6kvbqxdlx6bq6";
+  };
+
+  propagatedBuildInputs = [
+    jedi pycodestyle psutil pyflakes rope pylint keyring numpydoc
+    qtconsole qtawesome nbconvert mccabe pyopengl cloudpickle spyder-kernels_0_5
+    pygments qtpy pyzmq chardet pyqtwebengine
+  ];
+
+  # tests fail with a segfault
+  doCheck = false;
+
+  postPatch = ''
+    # remove dependency on pyqtwebengine
+    # this is still part of the pyqt 5.13 version we have in nixpkgs
+    sed -i /pyqtwebengine/d setup.py
+    substituteInPlace setup.py --replace "pyqt5<5.13" "pyqt5"
+  '';
+
+  meta = with lib; {
+    description = "Library providing a 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://github.com/spyder-ide/spyder/";
+    license = licenses.mit;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ gebner marcus7070 ];
+  };
+}
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..26013e71158d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/spyder/default.nix
@@ -0,0 +1,81 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, isPy27, makeDesktopItem, intervaltree, jedi, pycodestyle,
+  psutil, pyflakes, rope, numpy, scipy, matplotlib, pylint, keyring, numpydoc,
+  qtconsole, qtawesome, nbconvert, mccabe, pyopengl, cloudpickle, pygments,
+  spyder-kernels, qtpy, pyzmq, chardet, qdarkstyle, watchdog, python-language-server
+, pyqtwebengine, atomicwrites, pyxdg, diff-match-patch, three-merge, pyls-black, pyls-spyder
+}:
+
+buildPythonPackage rec {
+  pname = "spyder";
+  version = "4.2.0";
+
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "44f51473b81c1bfde76097bfb957ec14f580a262b229ae8e90d18f5b82104c95";
+  };
+
+  nativeBuildInputs = [ pyqtwebengine.wrapQtAppsHook ];
+
+  propagatedBuildInputs = [
+    intervaltree jedi pycodestyle psutil pyflakes rope numpy scipy matplotlib pylint keyring
+    numpydoc qtconsole qtawesome nbconvert mccabe pyopengl cloudpickle spyder-kernels
+    pygments qtpy pyzmq chardet pyqtwebengine qdarkstyle watchdog python-language-server
+    atomicwrites pyxdg diff-match-patch three-merge pyls-black pyls-spyder
+  ];
+
+  # 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 "pyqt5<5.13" "pyqt5" \
+      --replace "parso==0.7.0" "parso"
+  '';
+
+  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/sqlalchemy-citext/default.nix b/nixpkgs/pkgs/development/python-modules/sqlalchemy-citext/default.nix
new file mode 100644
index 000000000000..bf8a9d3bbdbd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sqlalchemy-citext/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, sqlalchemy
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "sqlalchemy-citext";
+  version = "1.7.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "69ba00f5505f92a1455a94eefc6d3fcf72dda3691ab5398a0b4d0d8d85bd6aab";
+  };
+
+  propagatedBuildInputs = [
+    sqlalchemy
+  ];
+
+  # 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..4050adc29f55
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sqlalchemy-continuum/default.nix
@@ -0,0 +1,46 @@
+{ stdenv
+, lib
+, fetchPypi
+, buildPythonPackage
+, flask
+, flask_login
+, flask_sqlalchemy
+, flexmock
+, pytestCheckHook
+, sqlalchemy
+, sqlalchemy-utils
+, sqlalchemy-i18n
+}:
+
+buildPythonPackage rec {
+  pname = "SQLAlchemy-Continuum";
+  version = "1.3.11";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1c9yd9s98crqgs39rc2ld2r0nchgyjrfbjdlqb99y4hhc6lv04xw";
+  };
+
+  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..4ef0adefe3e7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sqlalchemy-i18n/default.nix
@@ -0,0 +1,32 @@
+{ stdenv
+, lib
+, fetchPypi
+, buildPythonPackage
+, sqlalchemy
+, sqlalchemy-utils
+, psycopg2
+}:
+
+buildPythonPackage rec {
+  pname = "SQLAlchemy-i18n";
+  version = "1.0.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "15xah8643p29kciz365ixs9pbsflj92pzr2d9anbdh2biyf4cka8";
+  };
+
+  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-imageattach/default.nix b/nixpkgs/pkgs/development/python-modules/sqlalchemy-imageattach/default.nix
new file mode 100644
index 000000000000..6a8c910cfce6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sqlalchemy-imageattach/default.nix
@@ -0,0 +1,41 @@
+{ lib, stdenv
+, buildPythonPackage
+, pytest
+, Wand
+, webob
+, sqlalchemy
+, isPyPy
+, pkgs
+}:
+
+buildPythonPackage rec {
+  pname = "SQLAlchemy-ImageAttach";
+  version = "1.0.0";
+
+  src = pkgs.fetchFromGitHub {
+    repo = "sqlalchemy-imageattach";
+    owner = "dahlia";
+    rev = version;
+    sha256 = "0ba97pn5dh00qvxyjbr0mr3pilxqw5kb3a6jd4wwbsfcv6nngqig";
+  };
+
+  checkInputs = [ pytest Wand.imagemagick webob ];
+  propagatedBuildInputs = [ sqlalchemy Wand ];
+
+  checkPhase = ''
+    cd tests
+    export MAGICK_HOME="${pkgs.imagemagick.dev}"
+    export PYTHONPATH=$PYTHONPATH:../
+    py.test
+    cd ..
+  '';
+
+  doCheck = !isPyPy;  # failures due to sqla version mismatch
+
+  meta = with lib; {
+    homepage = "https://github.com/dahlia/sqlalchemy-imageattach";
+    description = "SQLAlchemy extension for attaching images to entity objects";
+    license = licenses.mit;
+  };
+
+}
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..bb757ab45b0a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sqlalchemy-migrate/default.nix
@@ -0,0 +1,49 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, fetchpatch, python
+, unittest2, scripttest, pytz, mock
+, testtools, 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";
+  }) ];
+
+  checkInputs = [ unittest2 scripttest pytz mock testtools testrepository ];
+  propagatedBuildInputs = [ pbr tempita decorator sqlalchemy six sqlparse ];
+
+  doCheck = !stdenv.isDarwin;
+
+  prePatch = ''
+    sed -i -e /tempest-lib/d \
+           -e /testtools/d \
+      test-requirements.txt
+  '';
+  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://github.com/openstack/sqlalchemy-migrate";
+    description = "Schema migration tools for SQLAlchemy";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ makefu ];
+  };
+}
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..657ec7ac0721
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sqlalchemy-utils/default.nix
@@ -0,0 +1,50 @@
+{ lib, fetchPypi, buildPythonPackage
+, six, sqlalchemy
+, mock, pytz, isort, flake8, jinja2, pg8000, pyodbc, pytest, pymysql, dateutil
+, docutils, flexmock, psycopg2, pygments }:
+
+buildPythonPackage rec {
+  pname = "sqlalchemy-utils";
+  version = "0.36.6";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "SQLAlchemy-Utils";
+    sha256 = "0srs5w486wp5zydjs70igi5ypgxhm6h73grb85jz03fqpqaanzvs";
+  };
+
+  propagatedBuildInputs = [
+    six
+    sqlalchemy
+  ];
+
+  # Attempts to access localhost and there's also no database access
+  doCheck = false;
+  checkInputs = [
+    mock
+    pytz
+    isort
+    flake8
+    jinja2
+    pg8000
+    pyodbc
+    pytest
+    pymysql
+    dateutil
+    docutils
+    flexmock
+    psycopg2
+    pygments
+  ];
+
+  checkPhase = ''
+    pytest tests
+  '';
+
+  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/default.nix b/nixpkgs/pkgs/development/python-modules/sqlalchemy/default.nix
new file mode 100644
index 000000000000..83fd3e7b10b3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sqlalchemy/default.nix
@@ -0,0 +1,36 @@
+{ stdenv, lib, fetchPypi, buildPythonPackage, isPy3k, isPy35
+, mock
+, pysqlite
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "SQLAlchemy";
+  version = "1.3.20";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d2f25c7f410338d31666d7ddedfa67570900e248b940d186b48461bd4e5569a1";
+  };
+
+  checkInputs = [
+    pytestCheckHook
+    mock
+  ] ++ lib.optional (!isPy3k) pysqlite;
+
+  postInstall = ''
+    sed -e 's:--max-worker-restart=5::g' -i setup.cfg
+  '';
+
+  dontUseSetuptoolsCheck = true;
+
+  # disable mem-usage tests on mac, has trouble serializing pickle files
+  disabledTests = lib.optionals isPy35 [ "exception_persistent_flush_py3k "]
+    ++ 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..2bb700f67557
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sqlite-utils/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, click
+, click-default-group
+, sqlite-fts4
+, tabulate
+, pytestCheckHook
+, pytestrunner
+, black
+, hypothesis
+, sqlite
+}:
+
+buildPythonPackage rec {
+  pname = "sqlite-utils";
+  version = "3.3";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1linla3za1gb3w0n0k6h3q8in62qhipizff259p14gzmyr95rjjv";
+  };
+
+  propagatedBuildInputs = [
+    click
+    click-default-group
+    sqlite-fts4
+    tabulate
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    pytestrunner
+    black
+    hypothesis
+  ];
+
+  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 ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sqlite3dbm/default.nix b/nixpkgs/pkgs/development/python-modules/sqlite3dbm/default.nix
new file mode 100644
index 000000000000..1d0b3f15c3fc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sqlite3dbm/default.nix
@@ -0,0 +1,23 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "sqlite3dbm";
+  version = "0.1.4";
+  disabled = isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "4721607e0b817b89efdba7e79cab881a03164b94777f4cf796ad5dd59a7612c5";
+  };
+
+  meta = with lib; {
+    description = "sqlite-backed dictionary";
+    homepage = "https://github.com/Yelp/sqlite3dbm";
+    license = licenses.asl20;
+  };
+
+}
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..1c28d6a0976d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sqlitedict/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, fetchFromGitHub, pytest }:
+
+buildPythonPackage rec {
+  pname = "sqlitedict";
+  version = "1.6.0";
+
+  src = fetchFromGitHub {
+    owner = "RaRe-Technologies";
+    repo = "sqlitedict";
+    rev = version;
+    sha256 = "1yq94lgpny9qcfbsl39npjvrsjfggi3lj2kpzcsxcfdfgxag6m2m";
+  };
+
+  checkInputs = [ pytest ];
+
+  checkPhase = ''
+    pytest tests
+  '';
+
+  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..940dbdab9894
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sqlmap/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, stdenv
+, file
+}:
+
+buildPythonPackage rec {
+  pname = "sqlmap";
+  version = "1.4.12";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "166adazdrv92azx4p0qng0cm3va6i301vfsr4yyf0azj3sdg0waj";
+  };
+
+  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; {
+    homepage = "http://sqlmap.org";
+    license = licenses.gpl2;
+    description = "Automatic SQL injection and database takeover tool";
+    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..ccbc6659fe3d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sqlobject/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, pytest
+, FormEncode
+, PasteDeploy
+, paste
+, pydispatcher
+}:
+
+buildPythonPackage rec {
+  pname = "SQLObject";
+  version = "3.8.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "620657105ab5720658222d10ad13c52281fe524137b59ab166eee4427ee2f548";
+  };
+
+  checkInputs = [ pytest ];
+  propagatedBuildInputs = [ FormEncode PasteDeploy paste pydispatcher ];
+
+  meta = with lib; {
+    description = "Object Relational Manager for providing an object interface to your database";
+    homepage = "http://www.sqlobject.org/";
+    license = licenses.lgpl21;
+  };
+
+}
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..3ee59c391f88
--- /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.1";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0f91fd2e829c44362cbcfab3e9ae12e22badaa8a29ad5ff599f9ec109f0454e8";
+  };
+
+  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..a6ffd3227cd4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sqlsoup/default.nix
@@ -0,0 +1,21 @@
+{ 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://bitbucket.org/zzzeek/sqlsoup";
+    license = licenses.mit;
+    maintainers = [ maintainers.globin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/squaremap/default.nix b/nixpkgs/pkgs/development/python-modules/squaremap/default.nix
new file mode 100644
index 000000000000..c17a88435dd6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/squaremap/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv
+, buildPythonPackage
+, isPy3k
+, fetchPypi
+, six
+, wxPython
+}:
+
+buildPythonPackage rec {
+  pname = "squaremap";
+  version = "1.0.5";
+  disabled = isPy3k;
+
+  src = fetchPypi {
+    pname = "SquareMap";
+    inherit version;
+    sha256 = "1a79jm7mp0pvi3a19za5c3idavnj7hlral01hhr3x9mz1jayav5i";
+  };
+
+  propagatedBuildInputs = [ six wxPython ];
+
+  meta = with lib; {
+    description = "Hierarchic visualization control for wxPython";
+    homepage = "https://launchpad.net/squaremap";
+    license = licenses.bsd3;
+    broken = true; # wxPython doesn't seem to be able to be detected by pip
+  };
+
+}
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..2afbb22d64e5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/srp/default.nix
@@ -0,0 +1,26 @@
+{ stdenv, buildPythonPackage, fetchPypi, six, lib }:
+
+buildPythonPackage rec {
+  pname = "srp";
+  version = "1.0.16";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "c943b7181322a2bdd50d20e1244536c404916e546131dc1fae10a7cb99a013e9";
+  };
+
+  propagatedBuildInputs = [ six ];
+
+  # Tests ends up with libssl.so cannot load shared
+  doCheck = false;
+
+  meta = with lib; {
+    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/srptools/default.nix b/nixpkgs/pkgs/development/python-modules/srptools/default.nix
new file mode 100644
index 000000000000..f130009d30d6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/srptools/default.nix
@@ -0,0 +1,22 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, six, pytest, pytestrunner }:
+
+buildPythonPackage rec {
+  pname = "srptools";
+  version = "1.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "7fa4337256a1542e8f5bb4bed19e1d9aea98fe5ff9baf76693342a1dd6ac7c96";
+  };
+
+  propagatedBuildInputs = [ six ];
+
+  checkInputs = [ pytest pytestrunner ];
+
+  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; [ elseym ];
+  };
+}
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..42320e50fa8d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/srsly/default.nix
@@ -0,0 +1,46 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, cython
+, mock
+, numpy
+, pathlib
+, pytest
+, pytz
+}:
+
+buildPythonPackage rec {
+  pname = "srsly";
+  version = "2.3.2";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f78eaef8d982e98921ce026d4205e652a9333137259f0b621f5c7b579e746e9d";
+  };
+
+  nativeBuildInputs = [ cython ];
+
+  checkInputs = [
+    mock
+    numpy
+    pytest
+    pytz
+  ];
+
+  # TypeError: cannot serialize '_io.BufferedRandom' object
+  # Possibly because of sandbox restrictions.
+  doCheck = false;
+
+  pythonImportsCheck = [ "srsly" ];
+
+  meta = with lib; {
+    description = "Modern high-performance serialization utilities for Python";
+    homepage = "https://github.com/explosion/srsly";
+    license = licenses.mit;
+    maintainers = with maintainers; [ danieldk ];
+  };
+}
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..c399ee760fd6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/srvlookup/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv, fetchPypi, buildPythonPackage
+, dnspython
+, mock, nose
+}:
+
+buildPythonPackage rec {
+  pname = "srvlookup";
+  version = "2.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1zf1v04zd5phabyqh0nhplr5a8vxskzfrzdh4akljnz1yk2n2a0b";
+  };
+
+  propagatedBuildInputs = [ dnspython ];
+  checkInputs = [ mock nose ];
+
+  meta = with lib; {
+    homepage = "https://github.com/gmr/srvlookup";
+    license = [ licenses.bsd3 ];
+    description = "A small wrapper for dnspython to return SRV records for a given host, protocol, and domain name as a list of namedtuples.";
+    maintainers = [ 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..8300c3ec2f65
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ssdeep/default.nix
@@ -0,0 +1,33 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, pkgs
+, cffi
+, six
+, pytest
+, pytestrunner
+}:
+
+buildPythonPackage rec {
+  pname = "ssdeep";
+  version = "3.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0px8k4fjbkjb717bg2v7rjhm4iclrxzq7sh0hfqs55f4ddqi0m8v";
+  };
+
+  buildInputs = [ pkgs.ssdeep pytestrunner ];
+  checkInputs = [ pytest ];
+  propagatedBuildInputs = [ cffi six ];
+
+  # tests repository does not include required files
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/DinoTools/python-ssdeep";
+    description = "Python wrapper for the ssdeep library";
+    license = licenses.lgpl3;
+  };
+
+}
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..82ea4b066a3c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ssdp/default.nix
@@ -0,0 +1,31 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, pbr
+, pytest
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "ssdp";
+  version = "1.0.1";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0yhjqs9jyvwmba8fi72xfi9k8pxy11wkz4iywayrg71ka3la49bk";
+  };
+
+  buildInputs = [ pbr ];
+  checkInputs = [ pytest ];
+
+  # test suite uses new async primitives
+  doCheck = !isPy27;
+
+  meta = with lib; {
+    homepage = "https://github.com/codingjoe/ssdp";
+    description = "Python asyncio library for Simple Service Discovery Protocol (SSDP).";
+    license = licenses.mit;
+  };
+}
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..05c3fc807465
--- /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";
+
+  src = fetchFromGitHub {
+    owner = "mpetazzoni";
+    repo = "sseclient";
+    rev = "sseclient-py-${version}";
+    sha256 = "0iar4w8gryhjzqwy5k95q9gsv6xpmnwxkpz33418nw8hxlp86wfl";
+  };
+
+  # 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..9d944e112fe2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sseclient/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, isPy27
+, requests, six
+, backports_unittest-mock, pytestCheckHook, pytestrunner }:
+
+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 pytestrunner ];
+
+  # 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/sshpubkeys/default.nix b/nixpkgs/pkgs/development/python-modules/sshpubkeys/default.nix
new file mode 100644
index 000000000000..6e250cf85f2f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sshpubkeys/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, fetchFromGitHub
+, cryptography
+, ecdsa
+}:
+
+buildPythonPackage rec {
+  version = "3.1.0";
+  pname = "sshpubkeys";
+
+  src = fetchFromGitHub {
+    owner = "ojarva";
+    repo = "python-${pname}";
+    rev = "v${version}";
+    sha256 = "1h4gwmcfn84kkqh83km1vfz8sc5kr2g4gzgzmr8gz704jmqiv7nq";
+  };
+
+  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..5254b5c4dcca
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sshtunnel/default.nix
@@ -0,0 +1,31 @@
+{ lib, buildPythonPackage, fetchPypi
+, paramiko
+, pytest
+, mock
+}:
+
+buildPythonPackage rec {
+  version = "0.3.1";
+  pname = "sshtunnel";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "e0cac8a6a154c7a9651b42038e3f6cf35bb88c8ee4b94822b28a5b2fe7140f95";
+  };
+
+  propagatedBuildInputs = [ paramiko ];
+
+  checkInputs = [ pytest mock ];
+
+  # disable impure tests
+  checkPhase = ''
+    pytest -k 'not connect_via_proxy and not 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..026ac8a30b75
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sslib/default.nix
@@ -0,0 +1,22 @@
+{ lib, stdenv, 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/sslyze/default.nix b/nixpkgs/pkgs/development/python-modules/sslyze/default.nix
new file mode 100644
index 000000000000..991f85c900ec
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sslyze/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, nassl
+, cryptography
+, typing-extensions
+, faker
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "sslyze";
+  version = "3.1.0";
+
+  src = fetchFromGitHub {
+    owner = "nabla-c0d3";
+    repo = pname;
+    rev = version;
+    sha256 = "02p0lgpkfq88dys0dqw0z8bpg9g8pds2lvs9awd9f2w5cb1pwr83";
+  };
+
+  patchPhase = ''
+    substituteInPlace setup.py \
+      --replace "cryptography>=2.6,<3.3" "cryptography>=2.6,<4.0"
+  '';
+
+  checkInputs = [ pytestCheckHook ];
+
+  checkPhase = ''
+    # Most of the tests are online; hence, applicable tests are listed
+    # explicitly here
+    pytest \
+      tests/test_main.py \
+      tests/test_scanner.py \
+      tests/cli_tests/test_console_output.py \
+      tests/cli_tests/test_json_output.py \
+      tests/cli_tests/test_server_string_parser.py \
+      tests/plugins_tests/test_scan_commands.py \
+      tests/plugins_tests/certificate_info/test_certificate_utils.py \
+      -k "not (TestScanner and test_client_certificate_missing)"
+  '';
+  pythonImportsCheck = [ "sslyze" ];
+
+  propagatedBuildInputs = [ nassl cryptography typing-extensions faker ];
+
+  meta = with lib; {
+    homepage = "https://github.com/nabla-c0d3/sslyze";
+    description = "Fast and powerful SSL/TLS scanning library";
+    platforms = platforms.linux ++ platforms.darwin;
+    license = licenses.agpl3;
+    maintainers = with maintainers; [ veehaitch ];
+  };
+}
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..71f114e3528b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/stack-data/default.nix
@@ -0,0 +1,54 @@
+{ asttokens
+, buildPythonPackage
+, executing
+, fetchFromGitHub
+, git
+, lib
+, littleutils
+, pure-eval
+, pygments
+, pytestCheckHook
+, setuptools_scm
+, toml
+, typeguard
+}:
+
+buildPythonPackage rec {
+  pname = "stack_data";
+  version = "0.0.7";
+
+  src = fetchFromGitHub {
+    owner = "alexmojaki";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "148lhxihak8jm5dvryhsiykmn3s4mrlba8ki4dy1nbd8jnz06a4w";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    git
+    setuptools_scm
+    toml
+  ];
+
+  propagatedBuildInputs = [
+    asttokens
+    executing
+    pure-eval
+  ];
+
+  checkInputs = [
+    littleutils
+    pygments
+    pytestCheckHook
+    typeguard
+  ];
+
+  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/starkbank-ecdsa/default.nix b/nixpkgs/pkgs/development/python-modules/starkbank-ecdsa/default.nix
new file mode 100644
index 000000000000..70b66b9a4683
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/starkbank-ecdsa/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "starkbank-ecdsa";
+  version = "1.1.0";
+
+  src = fetchFromGitHub {
+    owner = "starkbank";
+    repo = "ecdsa-python";
+    rev = "v${version}";
+    sha256 = "03smk33zhmv1j1svgjnykak0jnw8yl0yv03i1gsasx71f33zmfwi";
+  };
+
+  checkInputs = [ pytestCheckHook ];
+  pytestFlagsArray = [ "-v tests/*.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..d802a2300035
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/starlette/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, isPy27
+, aiofiles
+, graphene
+, itsdangerous
+, jinja2
+, python-multipart
+, pyyaml
+, requests
+, ujson
+, aiosqlite
+, databases
+, pytestCheckHook
+, pytest-asyncio
+, pytestcov
+, typing-extensions
+, ApplicationServices
+}:
+
+buildPythonPackage rec {
+  pname = "starlette";
+  version = "0.13.8";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "encode";
+    repo = pname;
+    rev = version;
+    sha256 = "11i0yd8cqwscixajl734g11vf8pghki11c81chzfh8ifmj6mf9jk";
+  };
+
+  propagatedBuildInputs = [
+    aiofiles
+    graphene
+    itsdangerous
+    jinja2
+    python-multipart
+    pyyaml
+    requests
+    ujson
+  ] ++ lib.optional stdenv.isDarwin [ ApplicationServices ];
+
+  checkInputs = [
+    aiosqlite
+    databases
+    pytestCheckHook
+    typing-extensions
+  ];
+
+  pytestFlagsArray = [ "--ignore=tests/test_graphql.py" ];
+
+  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/staticjinja/default.nix b/nixpkgs/pkgs/development/python-modules/staticjinja/default.nix
new file mode 100644
index 000000000000..d49bae2eab91
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/staticjinja/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, isPy27
+, docopt
+, easywatch
+, jinja2
+, pytestCheckHook
+, markdown
+}:
+
+buildPythonPackage rec {
+  pname = "staticjinja";
+  version = "0.4.0";
+
+  disabled = isPy27; # 0.4.0 drops python2 support
+
+  # For some reason, in pypi the tests get disabled when using
+  # PY_IGNORE_IMPORTMISMATCH, so we just fetch from GitHub
+  src = fetchFromGitHub {
+    owner = "staticjinja";
+    repo = pname;
+    rev = version;
+    sha256 = "0pysk8pzmcg1nfxz8m4i6bvww71w2zg6xp33zgg5vrf8yd2dfx9i";
+  };
+
+  propagatedBuildInputs = [
+    jinja2
+    docopt
+    easywatch
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    markdown
+  ];
+
+  # Import paths differ by a "build/lib" subdirectory, but the files are
+  # the same, so we ignore import mismatches.
+  preCheck = ''
+    export PY_IGNORE_IMPORTMISMATCH=1
+  '';
+
+  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/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/statsd/default.nix b/nixpkgs/pkgs/development/python-modules/statsd/default.nix
new file mode 100644
index 000000000000..447fed3263c3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/statsd/default.nix
@@ -0,0 +1,33 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, nose
+, mock
+}:
+
+buildPythonPackage rec {
+  pname = "statsd";
+  version = "3.3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "07yxnlalvcglgwa9pjs1clwrmwx7a4575jai7q05jz3g4i6dprp3";
+  };
+
+  buildInputs = [ 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..f538cdf0c04b
--- /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.12.1";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a271b4ccec190148dccda25f0cbdcbf871f408fc1394a10a7dc1af4a62b91c8e";
+  };
+
+  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..8ef59074fc00
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/stdiomask/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+}:
+
+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/stem/default.nix b/nixpkgs/pkgs/development/python-modules/stem/default.nix
new file mode 100644
index 000000000000..32e4bab5afcc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/stem/default.nix
@@ -0,0 +1,30 @@
+{ 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
+  '';
+
+  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; [ phreedom ];
+  };
+}
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..06d614feaacf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/stevedore/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, importlib-metadata
+, pbr
+, setuptools
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "stevedore";
+  version = "3.2.2";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f845868b3a3a77a2489d226568abe7328b5c2d4f6a011cc759dfa99144a521f0";
+  };
+
+  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://pypi.python.org/pypi/stevedore";
+    license = licenses.asl20;
+  };
+}
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/stompclient/default.nix b/nixpkgs/pkgs/development/python-modules/stompclient/default.nix
new file mode 100644
index 000000000000..17bafbad282e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/stompclient/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+, mock
+, nose
+}:
+
+buildPythonPackage rec {
+  pname = "stompclient";
+  version = "0.3.2";
+  disabled = isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "95a4e98dd0bba348714439ea11a25ee8a74acb8953f95a683924b5bf2a527e4e";
+  };
+
+  buildInputs = [ mock nose ];
+
+  # XXX: Ran 0 tests in 0.217s
+
+  meta = with lib; {
+    description = "Lightweight and extensible STOMP messaging client";
+    homepage = "https://bitbucket.org/hozn/stompclient";
+    license = licenses.asl20;
+  };
+
+}
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..1615f57d5e59
--- /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.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "76db248b24cbd6c51cf93b475d8a8df04ec4b6c6287dca244e47f37a433276d7";
+  };
+
+  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/streamz/default.nix b/nixpkgs/pkgs/development/python-modules/streamz/default.nix
new file mode 100644
index 000000000000..d17aed6ae43a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/streamz/default.nix
@@ -0,0 +1,58 @@
+{ lib, buildPythonPackage, fetchPypi, fetchpatch
+, confluent-kafka
+, distributed
+, flaky
+, graphviz
+, networkx
+, pytest
+, requests
+, six
+, toolz
+, tornado
+, zict
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "streamz";
+  version = "0.6.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "215703456479d24f524cdcd0365006250d4502d242f57e2f5db18e8638bc8694";
+  };
+
+  propagatedBuildInputs = [
+    networkx
+    tornado
+    toolz
+    zict
+    six
+  ];
+
+  checkInputs = [
+    confluent-kafka
+    distributed
+    flaky
+    graphviz
+    pytest
+    requests
+  ];
+
+  disabled = pythonOlder "3.6";
+
+  # Disable test_tcp_async because fails on sandbox build
+  # disable kafka tests
+  checkPhase = ''
+    pytest --deselect=streamz/tests/test_sources.py::test_tcp_async \
+      --deselect=streamz/tests/test_sources.py::test_tcp \
+      --ignore=streamz/tests/test_kafka.py
+  '';
+
+  meta = with lib; {
+    description = "Pipelines to manage continuous streams of data";
+    homepage = "https://github.com/python-streamz/streamz";
+    license = licenses.bsd3;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..53701999b021
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/strict-rfc3339/default.nix
@@ -0,0 +1,20 @@
+{ lib, stdenv, 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..8f383b60b175
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/strictyaml/default.nix
@@ -0,0 +1,32 @@
+{ buildPythonPackage
+, lib
+, fetchPypi
+, isPy27
+, ruamel_yaml
+, python-dateutil
+}:
+
+buildPythonPackage rec {
+  version = "1.3.0";
+  pname = "strictyaml";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f640ae4e6fe761c3ae7138092c3dcb9b5050ec56e9cbac45d8a6b549d7ec973c";
+  };
+
+  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..10afb5113931
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/stringcase/default.nix
@@ -0,0 +1,22 @@
+{ buildPythonPackage, fetchPypi, lib, stdenv
+}:
+
+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/stringtemplate/default.nix b/nixpkgs/pkgs/development/python-modules/stringtemplate/default.nix
new file mode 100644
index 000000000000..8bdb69a3074e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/stringtemplate/default.nix
@@ -0,0 +1,24 @@
+{ lib, fetchurl, buildPythonPackage, antlr, isPy3k }:
+
+buildPythonPackage rec {
+  pname = "PyStringTemplate";
+  version = "3.2b1";
+
+  src = fetchurl {
+    url = "https://www.stringtemplate.org/download/${pname}-${version}.tar.gz";
+    sha256 = "0lbib0l8c1q7i1j610rwcdagymr1idahrql4dkgnm5rzyg2vk3ml";
+  };
+
+  propagatedBuildInputs = [ antlr ];
+
+  disabled = isPy3k;
+
+  # No tests included in archive
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://www.stringtemplate.org/";
+    description = "Text Templating Library";
+    platforms = platforms.linux;
+  };
+}
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..b205f48cb6f9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/stripe/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, fetchPypi, requests, pytest, pytestcov, pytest-mock, pytest_xdist }:
+
+buildPythonPackage rec {
+  pname = "stripe";
+  version = "2.55.0";
+
+  # Tests require network connectivity and there's no easy way to disable
+  # them. ~ C.
+  doCheck = false;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "2eebf023595e8aa9d65d8b46ccc3c716185bb9625d0e39d3956282fd7525848d";
+  };
+
+  propagatedBuildInputs = [ requests ];
+
+  checkInputs = [ pytest pytestcov pytest-mock pytest_xdist ];
+
+  meta = with lib; {
+    description = "Stripe Python bindings";
+    homepage = "https://github.com/stripe/stripe-python";
+    license = licenses.mit;
+  };
+}
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..8f7e73a454a4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/structlog/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest
+, pytest-asyncio
+, python-rapidjson
+, pretend
+, freezegun
+, twisted
+, simplejson
+, six
+, pythonAtLeast
+}:
+
+buildPythonPackage rec {
+  pname = "structlog";
+  version = "20.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "7a48375db6274ed1d0ae6123c486472aa1d0890b08d314d2b016f3aa7f35990b";
+  };
+
+  checkInputs = [ pytest pytest-asyncio pretend freezegun simplejson twisted ]
+    ++ lib.optionals (pythonAtLeast "3.6") [ python-rapidjson ];
+  propagatedBuildInputs = [ six ];
+
+  checkPhase = ''
+    # rm tests/test_twisted.py*
+    py.test
+  '';
+
+  meta = {
+    description = "Painless structural logging";
+    homepage = "http://www.structlog.org/";
+    license = lib.licenses.asl20;
+  };
+}
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..3ace2e925cbb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/stumpy/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, numpy
+, scipy
+, numba
+, pandas
+, dask
+, distributed
+, coverage
+, flake8
+, black
+, pytest
+, codecov
+}:
+
+buildPythonPackage rec {
+  pname = "stumpy";
+  version = "1.4";
+
+  src = fetchFromGitHub {
+    owner = "TDAmeritrade";
+    repo = "stumpy";
+    rev = "v${version}";
+    sha256 = "0s2s3y855jjwdb7p55zx8lknplz58ghpw547yzmqisacr968b67w";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+    scipy
+    numba
+  ];
+
+  checkInputs = [
+    pandas
+    dask
+    distributed
+    coverage
+    flake8
+    black
+    pytest
+    codecov
+  ];
+
+  # ignore changed numpy operations
+  checkPhase = ''
+    pytest -k 'not allc'
+  '';
+
+  meta = with lib; {
+    description = "A powerful and scalable library that can be used for a variety of time series data mining tasks";
+    homepage = "https://github.com/TDAmeritrade/stumpy";
+    license = licenses.bsd3;
+    maintainers = [ 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..35aaf45ed1a2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/stups-cli-support/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, clickclick
+, dnspython
+, requests
+, pytest
+, pytestcov
+, 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
+    pytestcov
+  ];
+
+  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..5f51112324aa
--- /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
+, pytestcov
+, 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
+    pytestcov
+  ];
+
+  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..aaa049916411
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/stups-pierone/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, requests
+, stups-cli-support
+, stups-zign
+, pytest
+, pytestcov
+, hypothesis
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "stups-pierone";
+  version = "1.1.45";
+  disabled = !isPy3k;
+
+  src = fetchFromGitHub {
+    owner = "zalando-stups";
+    repo = "pierone-cli";
+    rev = version;
+    sha256 = "1ggfizw27wpcagbbk15xpfrhq6b250cx4278b5d7y8s438g128cs";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    stups-cli-support
+    stups-zign
+  ];
+
+  preCheck = "
+    export HOME=$TEMPDIR
+  ";
+
+  checkInputs = [
+    pytest
+    pytestcov
+    hypothesis
+  ];
+
+  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 = [ 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..3e785d8febbe
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/stups-tokens/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, requests
+, mock
+, pytest
+, pytestcov
+, 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
+    pytestcov
+  ];
+
+  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..6b80f55636a9
--- /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
+, pytestcov
+, 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
+    pytestcov
+  ];
+
+  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..88adbe4f7d94
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/stytra/default.nix
@@ -0,0 +1,81 @@
+{ lib, pkgs, buildPythonPackage, fetchPypi, isPy3k, callPackage
+, opencv3
+, pyqt5
+, pyqtgraph
+, numpy
+, scipy
+, numba
+, pandas
+, tables
+, git
+, ffmpeg_3
+, scikitimage
+, matplotlib
+, qdarkstyle
+, GitPython
+, anytree
+, pims
+, imageio
+, imageio-ffmpeg
+, av
+, nose
+, pytest
+, pyserial
+, arrayqueues
+, colorspacious
+, qimage2ndarray
+, flammkuchen
+, lightparam
+}:
+
+buildPythonPackage rec {
+  pname = "stytra";
+  version = "0.8.34";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "aab9d07575ef599a9c0ae505656e3c03ec753462df3c15742f1f768f2b578f0a";
+  };
+  doCheck = false;
+  checkInputs = [
+    nose
+    pytest
+    pyserial
+  ];
+
+
+  propagatedBuildInputs = [
+    opencv3
+    pyqt5
+    pyqtgraph
+    numpy
+    scipy
+    numba
+    pandas
+    tables
+    git
+    ffmpeg_3
+    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.gpl3;
+    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..5b6362b76a14
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/subarulink/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, aiohttp
+, asynctest
+, stdiomask
+, cryptography
+, pytestcov
+, pytest-asyncio
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "subarulink";
+  version = "0.3.11";
+
+  src = fetchFromGitHub {
+    owner = "G-Two";
+    repo = pname;
+    rev = "subaru-v${version}";
+    sha256 = "1ink9bhph6blidnfsqwq01grhp7ghacmkd4vzgb9hnhl9l52s1jq";
+  };
+
+  propagatedBuildInputs = [ aiohttp stdiomask ];
+
+  checkInputs = [
+    asynctest
+    cryptography
+    pytest-asyncio
+    pytestcov
+    pytestCheckHook
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  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..2dac94ac15d2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/subdownloader/default.nix
@@ -0,0 +1,66 @@
+{ lib, stdenv
+, 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..77ddb125a94b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/subliminal/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, isPy3k
+, guessit
+, babelfish
+, enzyme
+, beautifulsoup4
+, requests
+, click
+, dogpile_cache
+, stevedore
+, chardet
+, pysrt
+, six
+, appdirs
+, rarfile
+, pytz
+, futures
+, sympy
+, vcrpy
+, pytest
+, pytest-flakes
+, pytestcov
+, pytestrunner
+}:
+
+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
+  ] ++ lib.optional (!isPy3k) futures;
+
+  checkInputs = [
+    sympy vcrpy pytest pytest-flakes
+    pytestcov pytestrunner
+  ];
+
+  # https://github.com/Diaoul/subliminal/pull/963
+  doCheck = false;
+
+  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/subprocess32/default.nix b/nixpkgs/pkgs/development/python-modules/subprocess32/default.nix
new file mode 100644
index 000000000000..3fc4378fc34d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/subprocess32/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+, isPyPy
+, bash
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "subprocess32";
+  version = "3.5.4";
+  disabled = isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "eb2937c80497978d181efa1b839ec2d9622cf9600a039a79d0e108d1f9aec79d";
+  };
+
+  buildInputs = [ bash ];
+
+  preConfigure = ''
+    substituteInPlace test_subprocess32.py \
+      --replace '/usr/' '${bash}/'
+  '';
+
+  doCheck = !isPyPy;
+  checkPhase = ''
+    ${python.interpreter} test_subprocess32.py
+  '';
+
+  meta = {
+    homepage = "https://pypi.python.org/pypi/subprocess32";
+    description = "Backport of the subprocess module from Python 3.2.5 for use on 2.x";
+    maintainers = with lib.maintainers; [ ];
+  };
+}
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..f46226891877
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/subunit/default.nix
@@ -0,0 +1,33 @@
+{ buildPythonPackage
+# pkgs dependencies
+, check
+, cppunit
+, pkg-config
+, subunit
+
+# python dependencies
+, fixtures
+, hypothesis
+, pytest
+, testscenarios
+, testtools
+}:
+
+buildPythonPackage {
+  inherit (subunit) name src meta;
+
+  nativeBuildInputs = [ pkg-config ];
+  buildInputs = [ check cppunit ];
+  propagatedBuildInputs = [ testtools ];
+
+  checkInputs = [ testscenarios hypothesis fixtures pytest ];
+  # 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
+  '';
+
+  patchPhase = ''
+    sed -i 's/version=VERSION/version="${subunit.version}"/' setup.py
+  '';
+}
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..4bf74fe00b4e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/suds-jurko/default.nix
@@ -0,0 +1,32 @@
+{ lib, stdenv
+, 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;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/suds/default.nix b/nixpkgs/pkgs/development/python-modules/suds/default.nix
new file mode 100644
index 000000000000..24425fef95f1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/suds/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "suds";
+  version = "0.4";
+  disabled = isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1w4s9051iv90c0gs73k80c3d51y2wbx1xgfdgg2hk7mv4gjlllnm";
+  };
+
+  patches = [ ./suds-0.4-CVE-2013-2217.patch ];
+
+  meta = with lib; {
+    # Broken for security issues:
+    # - https://github.com/NixOS/nixpkgs/issues/19678
+    # - https://lwn.net/Vulnerabilities/559200/
+    broken = true;
+    description = "Lightweight SOAP client";
+    homepage = "https://fedorahosted.org/suds";
+    license = licenses.lgpl3Plus;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/suds/suds-0.4-CVE-2013-2217.patch b/nixpkgs/pkgs/development/python-modules/suds/suds-0.4-CVE-2013-2217.patch
new file mode 100644
index 000000000000..235fc1f928c0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/suds/suds-0.4-CVE-2013-2217.patch
@@ -0,0 +1,19 @@
+--- suds.orig/suds/cache.py	2013-06-29 16:26:16.930326017 +0200
++++ suds.orig/suds/cache.py	2013-06-29 16:02:15.000000000 +0200
+@@ -19,6 +19,7 @@ 
+ """
+ 
+ import os
++import tempfile
+ import suds
+ from tempfile import gettempdir as tmp
+ from suds.transport import *
+@@ -138,7 +139,7 @@ 
+         @type duration: {unit:value}
+         """
+         if location is None:
+-            location = os.path.join(tmp(), 'suds')
++            location = tempfile.mkdtemp()
+         self.location = location
+         self.duration = (None, 0)
+         self.setduration(**duration)
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..e647cd4a9d27
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sumo/default.nix
@@ -0,0 +1,42 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub, isPy27
+, h5py
+, matplotlib
+, numpy
+, phonopy
+, pymatgen
+, pytest
+, scipy
+, seekpath
+, spglib
+}:
+
+buildPythonPackage rec {
+  pname = "sumo";
+  version = "1.0.9";
+
+  # No tests in Pypi tarball
+  src = fetchFromGitHub {
+    owner = "SMTG-UCL";
+    repo = "sumo";
+    rev = "v${version}";
+    sha256 = "1zw86qp9ycw2k0anw6pzvwgd3zds0z2cwy0s663zhiv9mnb5hx1n";
+  };
+
+  propagatedBuildInputs = [ numpy scipy spglib pymatgen h5py matplotlib seekpath phonopy ];
+
+  checkInputs = [ pytest ];
+
+  checkPhase = ''
+    pytest .
+  '';
+
+  # tests have type annotations, can only run on 3.5+
+  doCheck = (!isPy27);
+
+  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..4a3a22f2780c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sumtypes/default.nix
@@ -0,0 +1,23 @@
+{ lib, buildPythonPackage, fetchFromGitHub, attrs, pytestCheckHook }:
+
+buildPythonPackage rec {
+  pname = "sumtypes";
+  version = "0.1a5";
+
+  src = fetchFromGitHub {
+    owner = "radix";
+    repo = "sumtypes";
+    rev = version;
+    sha256 = "0wcw1624xxx2h6lliv13b59blg60j8sgf5v2ni3cwx3j4wld4csr";
+  };
+
+  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..6a455ce49ebe
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sunpy/default.nix
@@ -0,0 +1,84 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, asdf
+, astropy
+, astropy-helpers
+, astropy-extension-helpers
+, beautifulsoup4
+, drms
+, glymur
+, hypothesis
+, matplotlib
+, numpy
+, pandas
+, parfive
+, pytest-astropy
+, pytest-mock
+, pytestcov
+, python-dateutil
+, scikitimage
+, scipy
+, sqlalchemy
+, towncrier
+, tqdm
+, zeep
+}:
+
+buildPythonPackage rec {
+  pname = "sunpy";
+  version = "2.0.6";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "109flghca42yhsm2w5xicqhyx1mc8c3vlwvadbn65fz3lhysqj67";
+  };
+
+  nativeBuildInputs = [
+    astropy-extension-helpers
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    scipy
+    matplotlib
+    pandas
+    astropy
+    astropy-helpers
+    parfive
+    sqlalchemy
+    scikitimage
+    towncrier
+    glymur
+    beautifulsoup4
+    drms
+    python-dateutil
+    zeep
+    tqdm
+    asdf
+  ];
+
+  checkInputs = [
+    hypothesis
+    pytest-astropy
+    pytestcov
+    pytest-mock
+  ];
+
+  # darwin has write permission issues
+  doCheck = stdenv.isLinux;
+  # ignore documentation tests
+  checkPhase = ''
+    PY_IGNORE_IMPORTMISMATCH=1 HOME=$(mktemp -d) pytest sunpy -k 'not rst'
+  '';
+
+  meta = with lib; {
+    description = "SunPy: Python for Solar Physics";
+    homepage = "https://sunpy.org";
+    license = licenses.bsd2;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..10c8f28e4463
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/supervisor/default.nix
@@ -0,0 +1,33 @@
+{ stdenv, lib, buildPythonPackage, isPy3k, fetchPypi
+, mock
+, meld3
+, pytest
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "supervisor";
+  version = "4.2.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "c479c875853e9c013d1fa73e529fd2165ff1ecaecc7e82810ba57e7362ae984d";
+  };
+
+  # 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 = [ meld3 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..efff79f679f4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sure/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, rednose
+, six
+, mock
+, isPyPy
+}:
+
+buildPythonPackage rec {
+  pname = "sure";
+  version = "1.4.11";
+  disabled = isPyPy;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "3c8d5271fb18e2c69e2613af1ad400d8df090f1456081635bd3171847303cdaa";
+  };
+
+  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/survey/default.nix b/nixpkgs/pkgs/development/python-modules/survey/default.nix
new file mode 100644
index 000000000000..f9bec0451ff4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/survey/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, wrapio
+}:
+
+buildPythonPackage rec {
+  pname = "survey";
+  version = "3.1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-R/PfXW/CnqYiOWbCxPAYwneg6j6CLvdIpITZ2eIXn+M=";
+  };
+
+  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..1c36f45090b8
--- /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
+, 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 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..585dbf64b3c3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/svg-path/default.nix
@@ -0,0 +1,17 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi }:
+buildPythonPackage rec {
+  pname = "svg.path";
+  version = "4.0.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "4bd627ec6526cd5da14f3c6a51205d930187db2d8992aed626825492c033b195";
+  };
+
+  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..fb0475ef3b97
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/svg2tikz/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchgit
+, lxml
+, isPy27
+}:
+
+buildPythonPackage {
+  pname = "svg2tikz";
+  version = "1.0.0";
+  disabled = ! isPy27;
+
+  propagatedBuildInputs = [ lxml ];
+
+  src = fetchgit {
+    url = "https://github.com/kjellmf/svg2tikz";
+    sha256 = "429428ec435e53672b85cdfbb89bb8af0ff9f8238f5d05970729e5177d252d5f";
+    rev = "ad36f2c3818da13c4136d70a0fd8153acf8daef4";
+  };
+
+  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..acd8fcb7816e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/svglib/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+, cssselect2
+, lxml
+, pillow
+, pytest
+, reportlab
+, tinycss2
+}:
+
+buildPythonPackage rec {
+  pname = "svglib";
+  version = "1.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ff01593e8c07ea462d3742e1f4141bfa261cbd4400ceb25dfb8fec3508ad0e50";
+  };
+
+  disabled = !isPy3k;
+
+  propagatedBuildInputs = [
+    cssselect2
+    lxml
+    pillow
+    reportlab
+    tinycss2
+  ];
+
+  checkInputs = [
+    pytest
+  ];
+
+  # Ignore tests that require network access (TestWikipediaFlags and TestW3CSVG), and tests that
+  # require files missing in the 1.0.0 PyPI release (TestOtherFiles).
+  checkPhase = ''
+    py.test svglib tests -k 'not TestWikipediaFlags and not TestW3CSVG and not TestOtherFiles'
+  '';
+
+  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..7799583f8dcf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/svgwrite/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, isPy3k
+, pythonOlder
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "svgwrite";
+  version = "1.4";
+
+  src = fetchFromGitHub {
+    owner = "mozman";
+    repo = "svgwrite";
+    rev = "v${version}";
+    sha256 = "15xjz5b4dw1sg3a5k4wmzky4h5v1n937id8vl6hha1a2xj42z2s5";
+  };
+
+  # 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..bdb78096aef2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/swagger-spec-validator/default.nix
@@ -0,0 +1,37 @@
+{ lib, buildPythonPackage, fetchFromGitHub, pyyaml, jsonschema, six, pytest, mock, isPy3k }:
+
+buildPythonPackage rec {
+  pname = "swagger-spec-validator";
+  version = "2.5.0";
+
+  src = fetchFromGitHub {
+    owner = "Yelp";
+    repo = "swagger_spec_validator";
+    rev = "v" + version;
+    sha256 = "0qlkiyncdh7cdyjvnwjpv9i7y75ghwnpyqkkpfaa8hg698na13pw";
+  };
+
+  checkInputs = [
+    pytest
+    mock
+  ];
+
+  checkPhase = ''
+    pytest tests
+  '';
+
+  propagatedBuildInputs = [
+    pyyaml
+    jsonschema
+    six
+  ];
+
+  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..613de201b2d1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/swagger-ui-bundle/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, jinja2, flake8 }:
+
+buildPythonPackage rec {
+  pname = "swagger-ui-bundle";
+  version = "0.0.6";
+
+  src = fetchPypi {
+    pname = "swagger_ui_bundle";
+    inherit version;
+    sha256 = "1lqxz7q9l2iwf7w11nhw5lnglsh1lgcvq8ydvhabkcc76il3ndy5";
+  };
+
+  # 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/swisshydrodata/default.nix b/nixpkgs/pkgs/development/python-modules/swisshydrodata/default.nix
new file mode 100644
index 000000000000..f4f191d2b423
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/swisshydrodata/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "swisshydrodata";
+  version = "0.0.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1adpy6k2bknffzl5rckqpvaqyrvc00d6a4a4541438dqasx61npl";
+  };
+
+  propagatedBuildInputs = [ requests ];
+
+  # Tests are not releases at the moment
+  doCheck = false;
+  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..321a48e72b6f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/swspotify/default.nix
@@ -0,0 +1,40 @@
+{ stdenv, lib, buildPythonPackage, fetchFromGitHub, requests, flask-cors, dbus-python, pytestCheckHook, mock, isPy27 }:
+
+buildPythonPackage rec {
+  pname = "SwSpotify";
+  version = "1.2.1";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "SwagLyrics";
+    repo = "SwSpotify";
+    rev = "v${version}";
+    sha256 = "0jxcvy8lw8kpjbl4q6mi11164pvi0w9m9p76bxj2m7i7s5p4dxd4";
+  };
+
+  propagatedBuildInputs = [
+    requests flask-cors dbus-python
+  ];
+
+  preConfigure = ''
+    substituteInPlace setup.py \
+      --replace 'requests>=2.24.0' 'requests~=2.23' \
+      --replace 'flask-cors==3.0.8' 'flask-cors'
+  '';
+
+  checkPhase = ''
+    pytest tests/test_spotify.py::LinuxTests
+  '';
+
+  checkInputs = [ pytestCheckHook mock ];
+
+  pythonImportsCheck = [ "SwSpotify" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/SwagLyrics/SwSpotify";
+    description = "Library to get the currently playing song and artist from Spotify";
+    license = licenses.mit;
+    maintainers = with maintainers; [ siraben ];
+    platforms = lib.platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sybase/default.nix b/nixpkgs/pkgs/development/python-modules/sybase/default.nix
new file mode 100644
index 000000000000..20c2a158a3b2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sybase/default.nix
@@ -0,0 +1,30 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchurl
+, isPy3k
+, freetds
+}:
+
+buildPythonPackage rec {
+  pname = "python-sybase";
+  version = "0.40pre2";
+  disabled = isPy3k;
+
+  src = fetchurl {
+    url = "https://sourceforge.net/projects/python-sybase/files/python-sybase/${pname}-${version}/${pname}-${version}.tar.gz";
+    sha256 = "0pm88hyn18dy7ljam4mdx9qqgmgraf2zy2wl02g5vsjl4ncvq90j";
+  };
+
+  propagatedBuildInputs = [ freetds ];
+
+  SYBASE = freetds;
+  setupPyBuildFlags = [ "-DHAVE_FREETDS" "-UWANT_BULKCOPY" ];
+
+  meta = with lib; {
+    description = "The Sybase module provides a Python interface to the Sybase relational database system";
+    homepage    = "http://python-sybase.sourceforge.net";
+    license     = licenses.bsd3;
+    maintainers = with maintainers; [ veprbl ];
+    platforms   = platforms.unix;
+  };
+}
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..3bf6ed95ced1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sybil/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonApplication
+, fetchPypi
+, pytest
+, nose
+}:
+
+buildPythonApplication rec {
+  pname = "sybil";
+  version = "2.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "3e098ae96c4d3668cd5fb04c160334a4bc3ade9d29177e0206846b75f5ff3e91";
+  };
+
+  checkInputs = [ pytest nose ];
+
+  checkPhase = ''
+    py.test tests
+  '';
+
+  meta = with lib; {
+    description = "Automated testing for the examples in your documentation";
+    homepage = "https://github.com/cjw296/sybil";
+    license = licenses.mit;
+  };
+}
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..f225dd431e58
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/symengine/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, cython
+, cmake
+, symengine
+, pytest
+, sympy
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "symengine";
+  version = "0.6.1";
+
+  src = fetchFromGitHub {
+    owner = "symengine";
+    repo = "symengine.py";
+    rev = "v${version}";
+    sha256 = "13fy25qxn4xwzlr2w35v6jhlpd70lv9r6srv4dizc4brj63hnw50";
+  };
+
+  postConfigure = ''
+    substituteInPlace setup.py \
+      --replace "\"cmake\"" "\"${cmake}/bin/cmake\""
+
+    substituteInPlace cmake/FindCython.cmake \
+      --replace "SET(CYTHON_BIN cython" "SET(CYTHON_BIN ${cython}/bin/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/1_5.nix b/nixpkgs/pkgs/development/python-modules/sympy/1_5.nix
new file mode 100644
index 000000000000..00125f43bfc3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sympy/1_5.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, glibcLocales
+, mpmath
+}:
+
+buildPythonPackage rec {
+  pname = "sympy";
+  version = "1.5.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d77901d748287d15281f5ffe5b0fef62dd38f357c2b827c44ff07f35695f4e7e";
+  };
+
+  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/sympy/default.nix b/nixpkgs/pkgs/development/python-modules/sympy/default.nix
new file mode 100644
index 000000000000..c935176e0d51
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sympy/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, glibcLocales
+, mpmath
+}:
+
+buildPythonPackage rec {
+  pname = "sympy";
+  version = "1.7.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-o96SYel1Nbg7uGB7DaLH0DEmZQ+v6isniWV7Ipwkay4=";
+  };
+
+  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/systemd/default.nix b/nixpkgs/pkgs/development/python-modules/systemd/default.nix
new file mode 100644
index 000000000000..2035ce8b26ba
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/systemd/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub, systemd, pkg-config }:
+
+buildPythonPackage rec {
+  pname = "systemd";
+  version = "234";
+
+  src = fetchFromGitHub {
+    owner = "systemd";
+    repo = "python-systemd";
+    rev = "v${version}";
+    sha256 = "1fakw7qln44mfd6pj4kqsgyrhkc6cyr653id34kv0rdnb1bvysrz";
+  };
+
+  buildInputs = [ systemd ];
+  nativeBuildInputs = [ pkg-config ];
+
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Python module for native access to the systemd facilities";
+    homepage = "http://www.freedesktop.org/software/systemd/python-systemd/";
+    license = licenses.lgpl21;
+  };
+}
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..87a81e4fb17d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sysv_ipc/default.nix
@@ -0,0 +1,22 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "sysv_ipc";
+  version = "1.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1p5lx3yz4p40rfb453m80a4hh8341yp4dki2nhhxz7bq2zfi1zwf";
+  };
+
+  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..5260a678e8c7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tableaudocumentapi/default.nix
@@ -0,0 +1,24 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "tableaudocumentapi";
+  version = "0.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "fc6d44b62cf6ea29916c073686e2f9f35c9902eccd57b8493f8d44a59a2f60d9";
+  };
+
+  # 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/3.5.nix b/nixpkgs/pkgs/development/python-modules/tables/3.5.nix
new file mode 100644
index 000000000000..efc47a1ad3f4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tables/3.5.nix
@@ -0,0 +1,56 @@
+{ lib, fetchPypi, python, buildPythonPackage
+, cython, bzip2, lzo, numpy, numexpr, hdf5, six, c-blosc, mock }:
+
+buildPythonPackage rec {
+  version = "3.5.2";
+  pname = "tables";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1hikrki0hx94ass31pn0jyz9iy0zhnkjacfk86m21cxsc8if685j";
+  };
+
+  buildInputs = [ hdf5 cython bzip2 lzo c-blosc ];
+  propagatedBuildInputs = [ numpy numexpr six mock ];
+
+  # The setup script complains about missing run-paths, but they are
+  # actually set.
+  setupPyBuildFlags = [
+    "--hdf5=${lib.getDev hdf5}"
+    "--lzo=${lib.getDev lzo}"
+    "--bzip2=${lib.getDev bzip2}"
+    "--blosc=${lib.getDev c-blosc}"
+  ];
+  # Run the test suite.
+  # It requires the build path to be in the python search path.
+  # These tests take quite some time.
+  # If the hdf5 library is built with zlib then there is only one
+  # test-failure. That is the same failure as described in the following
+  # github issue:
+  #     https://github.com/PyTables/PyTables/issues/269
+  checkPhase = ''
+    ${python.interpreter} <<EOF
+    import sysconfig
+    import sys
+    import os
+    f = "lib.{platform}-{version[0]}.{version[1]}"
+    lib = f.format(platform=sysconfig.get_platform(),
+                   version=sys.version_info)
+    build = os.path.join(os.getcwd(), 'build', lib)
+    sys.path.insert(0, build)
+    import tables
+    r = tables.test()
+    if not r.wasSuccessful():
+        sys.exit(1)
+    EOF
+  '';
+
+  # Disable tests until the failure described above is fixed.
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Hierarchical datasets for Python";
+    homepage = "http://www.pytables.org/";
+    license = licenses.bsd2;
+  };
+}
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..fe49ab4d9ed6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tables/default.nix
@@ -0,0 +1,68 @@
+{ lib, fetchPypi, python, buildPythonPackage, isPy38
+, cython, bzip2, lzo, numpy, numexpr, hdf5, six, c-blosc, mock }:
+
+buildPythonPackage rec {
+  version = "3.6.1";
+  pname = "tables";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0j8vnxh2m5n0cyk9z3ndcj5n1zj5rdxgc1gb78bqlyn2lyw75aa9";
+  };
+
+  nativeBuildInputs = [ cython ];
+
+  buildInputs = [ hdf5 bzip2 lzo c-blosc ];
+  propagatedBuildInputs = [ numpy numexpr six mock ];
+
+  # When doing `make distclean`, ignore docs
+  postPatch = ''
+    substituteInPlace Makefile --replace "src doc" "src"
+  '';
+
+  # Regenerate C code with Cython
+  preBuild = ''
+    make distclean
+  '';
+
+  # The setup script complains about missing run-paths, but they are
+  # actually set.
+  setupPyBuildFlags = [
+    "--hdf5=${lib.getDev hdf5}"
+    "--lzo=${lib.getDev lzo}"
+    "--bzip2=${lib.getDev bzip2}"
+    "--blosc=${lib.getDev c-blosc}"
+  ];
+  # Run the test suite.
+  # It requires the build path to be in the python search path.
+  # These tests take quite some time.
+  # If the hdf5 library is built with zlib then there is only one
+  # test-failure. That is the same failure as described in the following
+  # github issue:
+  #     https://github.com/PyTables/PyTables/issues/269
+  checkPhase = ''
+    ${python.interpreter} <<EOF
+    import sysconfig
+    import sys
+    import os
+    f = "lib.{platform}-{version[0]}.{version[1]}"
+    lib = f.format(platform=sysconfig.get_platform(),
+                   version=sys.version_info)
+    build = os.path.join(os.getcwd(), 'build', lib)
+    sys.path.insert(0, build)
+    import tables
+    r = tables.test()
+    if not r.wasSuccessful():
+        sys.exit(1)
+    EOF
+  '';
+
+  # Disable tests until the failure described above is fixed.
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Hierarchical datasets for Python";
+    homepage = "http://www.pytables.org/";
+    license = licenses.bsd2;
+  };
+}
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..b1427a813312
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tablib/default.nix
@@ -0,0 +1,36 @@
+{ buildPythonPackage, lib, fetchPypi, isPy27
+, odfpy
+, openpyxl
+, pandas
+, pytest
+, pytestcov
+, pyyaml
+, unicodecsv
+, xlrd
+, xlwt
+}:
+
+buildPythonPackage rec {
+  pname = "tablib";
+  version = "2.0.0";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1rvvdchdva7j9b29ay0sg8y33pjhpmzynl38wz2rl89pph8gmhlc";
+  };
+
+  propagatedBuildInputs = [ xlwt openpyxl pyyaml xlrd odfpy ];
+  checkInputs = [ pytest pytestcov unicodecsv pandas ];
+
+  # test_tablib needs MarkupPy, which isn't packaged yet
+  checkPhase = ''
+    pytest --ignore tests/test_tablib.py
+  '';
+
+  meta = with lib; {
+    description = "Format-agnostic tabular dataset library";
+    homepage = "https://python-tablib.org";
+    license = licenses.mit;
+  };
+}
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..4686d02486fc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tabulate/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, nose
+}:
+
+buildPythonPackage rec {
+  version = "0.8.7";
+  pname = "tabulate";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "db2723a20d04bcda8522165c73eea7c300eda74e0ce852d9022e0159d7895007";
+  };
+
+  checkInputs = [ nose ];
+
+  # Tests: cannot import common (relative import).
+  doCheck = false;
+
+  meta = {
+    description = "Pretty-print tabular data";
+    homepage = "https://bitbucket.org/astanin/python-tabulate";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ fridh ];
+  };
+}
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/tarman/default.nix b/nixpkgs/pkgs/development/python-modules/tarman/default.nix
new file mode 100644
index 000000000000..682da22ced8a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tarman/default.nix
@@ -0,0 +1,34 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+, unittest2
+, nose
+, mock
+, libarchive
+}:
+
+buildPythonPackage rec {
+  version = "0.1.3";
+  pname = "tarman";
+
+  disabled = isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0ri6gj883k042xaxa2d5ymmhbw2bfcxdzhh4bz7700ibxwxxj62h";
+  };
+
+  buildInputs = [ unittest2 nose mock ];
+  propagatedBuildInputs = [ libarchive ];
+
+  # tests are still failing
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/matejc/tarman";
+    description = "Archive manager with curses interface";
+    license = licenses.bsd0;
+  };
+
+}
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..591f4cdabe96
--- /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.3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "7fe8676acb4559129c4e958be7704c12dccdbae302fff47c5398bc0dd1c9e563";
+  };
+
+  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..5a1358947130
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/taskw/default.nix
@@ -0,0 +1,41 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, nose
+, tox
+, six
+, dateutil
+, kitchen
+, pytz
+, pkgs
+}:
+
+buildPythonPackage rec {
+  version = "1.2.0";
+  pname = "taskw";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "fadd8afc12df026c3c2d39b633c55d3337f7dca95602fce2239455a048bc85fe";
+  };
+
+  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 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..cba34a95a7bd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tatsu/default.nix
@@ -0,0 +1,48 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub, pythonOlder
+, colorama, mypy, pyyaml, regex
+, dataclasses, typing
+, pytestrunner, pytest-mypy
+}:
+
+buildPythonPackage rec {
+  pname = "TatSu";
+  version = "5.0.0";
+
+  src = fetchFromGitHub {
+    owner = "neogeny";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1c16fcxf0xjkh5py9bnj6ljb9krhrj57mkwayl1w1dvzwl5lkgj3";
+  };
+
+  # Since version 5.0.0 only >=3.8 is officially supported, but ics is not
+  # compatible with Python 3.8 due to aiohttp:
+  disabled = pythonOlder "3.7";
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "python_requires='>=3.8'," "python_requires='>=3.7',"
+  '';
+
+  nativeBuildInputs = [ pytestrunner ];
+  propagatedBuildInputs = [ colorama mypy pyyaml regex ]
+    ++ lib.optionals (pythonOlder "3.7") [ dataclasses ]
+    ++ lib.optionals (pythonOlder "3.5") [ typing ];
+  checkInputs = [ pytest-mypy ];
+
+  checkPhase = ''
+    pytest test/
+  '';
+
+  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; [ primeos ];
+  };
+
+}
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..7e704e0b2c60
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tblib/default.nix
@@ -0,0 +1,18 @@
+{ lib, stdenv, 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/telegram/default.nix b/nixpkgs/pkgs/development/python-modules/telegram/default.nix
new file mode 100644
index 000000000000..95293d095fd5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/telegram/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv
+, 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..dbf0f26c3a3f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/telethon/default.nix
@@ -0,0 +1,34 @@
+{ lib, buildPythonPackage, fetchPypi, openssl, async_generator, rsa, pyaes, pythonOlder }:
+
+buildPythonPackage rec {
+  pname = "telethon";
+  version = "1.17.5";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "Telethon";
+    sha256 = "1v1rgr030z8s1ldv5lm1811znyd568c22pmlrzzf3ls972xk514m";
+  };
+
+  patchPhase = ''
+    substituteInPlace telethon/crypto/libssl.py --replace \
+      "ctypes.util.find_library('ssl')" "'${openssl.out}/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/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..0536b0f2ccd4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tempora/default.nix
@@ -0,0 +1,36 @@
+{ lib, buildPythonPackage, fetchPypi
+, setuptools_scm, pytest, pytest-freezegun, freezegun, backports_unittest-mock
+, six, pytz, jaraco_functools, pythonOlder
+, pytest-flake8, pytestcov, pytest-black, pytest-mypy
+}:
+
+buildPythonPackage rec {
+  pname = "tempora";
+  version = "4.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "9af06854fafb26d3d40d3dd6402e8baefaf57f90e48fdc9a94f6b22827a60fb3";
+  };
+
+  disabled = pythonOlder "3.2";
+
+  nativeBuildInputs = [ setuptools_scm ];
+
+  propagatedBuildInputs = [ six pytz jaraco_functools ];
+
+  checkInputs = [
+    pytest-freezegun pytest freezegun backports_unittest-mock
+    pytest-flake8 pytestcov pytest-black pytest-mypy
+  ];
+
+  checkPhase = ''
+    pytest
+  '';
+
+  meta = with lib; {
+    description = "Objects and routines pertaining to date and time";
+    homepage = "https://github.com/jaraco/tempora";
+    license = licenses.mit;
+  };
+}
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..51f055d06607
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tenacity/default.nix
@@ -0,0 +1,33 @@
+{ lib, buildPythonPackage, fetchPypi, isPy27, isPy3k
+, pbr, six, futures, monotonic, typing, setuptools_scm
+, pytest, sphinx, tornado, typeguard
+}:
+
+buildPythonPackage rec {
+  pname = "tenacity";
+  version = "6.3.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0zsdajdpcjd7inrl7r9pwiyh7qpgh9jk7g2bj1iva2d3n0gijkg1";
+  };
+
+  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-plugin-profile/default.nix b/nixpkgs/pkgs/development/python-modules/tensorboard-plugin-profile/default.nix
new file mode 100644
index 000000000000..1ae1aa471be5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tensorboard-plugin-profile/default.nix
@@ -0,0 +1,31 @@
+{ lib, fetchPypi, buildPythonPackage
+, gviz-api
+, protobuf
+, werkzeug
+}:
+
+buildPythonPackage rec {
+  pname = "tensorboard_plugin_profile";
+  version = "2.4.0";
+  format = "wheel";
+
+  src = fetchPypi {
+    inherit pname version;
+    format = "wheel";
+    python = "py3";
+    sha256 = "0z6dcjvkk3pzmmmjxi2ybawnfshz5qa3ga92kqj69ld1g9k3i9bj";
+  };
+
+  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..b0966ca2c7c0
--- /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/tensorboardx/default.nix b/nixpkgs/pkgs/development/python-modules/tensorboardx/default.nix
new file mode 100644
index 000000000000..a95f8e029285
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tensorboardx/default.nix
@@ -0,0 +1,37 @@
+{ boto3, buildPythonPackage, crc32c, fetchFromGitHub, lib, matplotlib, moto
+, numpy, pillow, pytorch, protobuf, six, pytestCheckHook
+, tensorflow-tensorboard, torchvision }:
+
+buildPythonPackage rec {
+  pname = "tensorboardx";
+  version = "2.0";
+
+  src = fetchFromGitHub {
+    owner = "lanpa";
+    repo = "tensorboardX";
+    rev = "v${version}";
+    sha256 = "0qqalq0fhbx0wnd8wdwhyhkkv2brvj9qbk3373vk3wjxbribf5c7";
+  };
+
+  checkInputs = [
+    pytestCheckHook boto3 crc32c matplotlib moto pillow pytorch tensorflow-tensorboard torchvision
+  ];
+
+  propagatedBuildInputs = [ numpy protobuf six ];
+
+  # 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)"
+  '';
+
+
+  disabledTests = [ "test_TorchVis"  "test_onnx_graph" ];
+
+  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-estimator/default.nix b/nixpkgs/pkgs/development/python-modules/tensorflow-estimator/default.nix
new file mode 100644
index 000000000000..bca75224fa3e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tensorflow-estimator/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv, fetchPypi, buildPythonPackage
+, numpy
+, absl-py
+, mock
+}:
+
+buildPythonPackage rec {
+  pname = "tensorflow-estimator";
+  version = "2.4.0";
+  format = "wheel";
+
+  src = fetchPypi {
+    pname = "tensorflow_estimator";
+    inherit version format;
+    sha256 = "1w0pkcslm6934qqd6m5gxyjdlnb4pbl47k6s99wsh6dyvvr7nysv";
+  };
+
+  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-probability/default.nix b/nixpkgs/pkgs/development/python-modules/tensorflow-probability/default.nix
new file mode 100644
index 000000000000..91880562eb3a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tensorflow-probability/default.nix
@@ -0,0 +1,131 @@
+{ lib
+, fetchFromGitHub
+, fetchpatch
+, buildBazelPackage
+, buildPythonPackage
+, python
+, setuptools
+, wheel
+, absl-py
+, tensorflow
+, six
+, numpy
+, decorator
+, cloudpickle
+, gast
+, hypothesis
+, scipy
+, matplotlib
+, mock
+, pytest
+}:
+
+let
+  version = "0.8.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 = version;
+      sha256 = "07cm8zba8n0ihzdm3k4a4rsg5v62xxsfvcw4h0niz91c0parqjqy";
+    };
+
+    patches = [
+      (fetchpatch {
+        name = "gast-0.3.patch";
+        url = "https://github.com/tensorflow/probability/commit/ae7a9d9771771ec1e7755a3588b9325f050a84cc.patch";
+        sha256 = "0kfhx30gshm8f3945na9yjjik71r20qmjzifbigaj4l8dwd9dz1a";
+        excludes = ["testing/*"];
+      })
+      (fetchpatch {
+        name = "cloudpickle-1.2.patch";
+        url = "https://github.com/tensorflow/probability/commit/78ef12b5afe3f567d16c70b74015ed1ddff1b0c8.patch";
+        sha256 = "12ms2xcljvvrnig0j78s3wfv4yf3bm5ps4rgfgv5lg2a8mzpc1ga";
+      })
+    ];
+
+    nativeBuildInputs = [
+      # needed to create the output wheel in installPhase
+      python
+      setuptools
+      wheel
+      absl-py
+      tensorflow
+    ];
+
+    bazelTarget = ":pip_pkg";
+
+    fetchAttrs = {
+      sha256 = "1qw7vkwnxy45z4vm94isq5m96xiz35sigag7vjg1xb2sklbymxh8";
+    };
+
+    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
+  ];
+
+  # Listed here:
+  # https://github.com/tensorflow/probability/blob/f01d27a6f256430f03b14beb14d37def726cb257/testing/run_tests.sh#L58
+  checkInputs = [
+    hypothesis
+    pytest
+    scipy
+    matplotlib
+    mock
+  ];
+
+  # actual checks currently fail because for some reason
+  # tf.enable_eager_execution is called too late. Probably because upstream
+  # intents these tests to be run by bazel, not plain pytest.
+  # checkPhase = ''
+  #   # tests need to import from other test files
+  #   export PYTHONPATH="$PWD/tensorflow-probability:$PYTHONPATH"
+  #   py.test
+  # '';
+
+  # sanity check
+  checkPhase = ''
+    python -c 'import tensorflow_probability'
+  '';
+
+  meta = with lib; {
+    broken = true;  # tf-probability 0.8.0 is not compatible with tensorflow 2.3.2
+    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-tensorboard/1/default.nix b/nixpkgs/pkgs/development/python-modules/tensorflow-tensorboard/1/default.nix
new file mode 100644
index 000000000000..f58b1a207719
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tensorflow-tensorboard/1/default.nix
@@ -0,0 +1,65 @@
+{ lib, fetchPypi, buildPythonPackage, isPy3k
+, numpy
+, wheel
+, werkzeug
+, protobuf
+, grpcio
+, markdown
+, futures
+, absl-py
+}:
+
+# tensorflow/tensorboard is built from a downloaded wheel, because
+# https://github.com/tensorflow/tensorboard/issues/719 blocks
+# buildBazelPackage.
+
+buildPythonPackage rec {
+  pname = "tensorflow-tensorboard";
+  version = "1.15.0";
+  format = "wheel";
+
+  src = fetchPypi ({
+    pname = "tensorboard";
+    inherit version format;
+  } // (if isPy3k then {
+    python = "py3";
+    sha256 = "1g62i3nrgp8q9wfsyqqjkkfnsz7x2k018c26kdh527h1yrjjrbac";
+  } else {
+    python = "py2";
+    sha256 = "0l3zc8j2sh7h1z4qpy8kfvclv3kzndri55p10i42q6xahs9phav1";
+  }));
+
+  propagatedBuildInputs = [
+    numpy
+    werkzeug
+    protobuf
+    markdown
+    grpcio
+    absl-py
+    # not declared in install_requires, but used at runtime
+    # https://github.com/NixOS/nixpkgs/issues/73840
+    wheel
+  ] ++ lib.optional (!isPy3k) futures;
+
+  # 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 = "http://tensorflow.org";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ abbradar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tensorflow-tensorboard/default.nix b/nixpkgs/pkgs/development/python-modules/tensorflow-tensorboard/default.nix
new file mode 100644
index 000000000000..031254205066
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tensorflow-tensorboard/default.nix
@@ -0,0 +1,67 @@
+{ lib, fetchPypi, buildPythonPackage, isPy3k
+, numpy
+, wheel
+, werkzeug
+, protobuf
+, grpcio
+, markdown
+, absl-py
+, google-auth-oauthlib
+, 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 = "tensorflow-tensorboard";
+  version = "2.4.0";
+  format = "wheel";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    pname = "tensorboard";
+    inherit version format;
+    python = "py3";
+    sha256 = "0f17h6i398n8maam0r3rssqvdqnqbwjyf96nnhf482anm1iwdq6d";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+    werkzeug
+    protobuf
+    markdown
+    grpcio
+    absl-py
+    google-auth-oauthlib
+    tensorboard-plugin-profile
+    tensorboard-plugin-wit
+    # 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 = "http://tensorflow.org";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ abbradar ];
+  };
+}
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..ef6d4f45ef9b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tensorflow/bin.nix
@@ -0,0 +1,187 @@
+{ stdenv
+, lib
+, fetchurl
+, buildPythonPackage
+, isPy3k, pythonOlder, pythonAtLeast, isPy38
+, astor
+, gast
+, google-pasta
+, wrapt
+, numpy
+, six
+, termcolor
+, protobuf
+, absl-py
+, grpcio
+, mock
+, scipy
+, wheel
+, opt-einsum
+, backports_weakref
+, tensorflow-estimator_2
+, tensorflow-tensorboard_2
+, cudaSupport ? false
+, cudatoolkit ? null
+, cudnn ? null
+, nvidia_x11 ? null
+, zlib
+, python
+, symlinkJoin
+, keras-applications
+, keras-preprocessing
+, addOpenGLRunpath
+}:
+
+# 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
+
+assert cudaSupport -> cudatoolkit != null
+                   && cudnn != null
+                   && nvidia_x11 != null;
+
+# unsupported combination
+assert ! (stdenv.isDarwin && cudaSupport);
+
+let
+  packages = import ./binary-hashes.nix;
+
+  variant = if cudaSupport then "-gpu" else "";
+  pname = "tensorflow${variant}";
+
+in buildPythonPackage {
+  inherit pname;
+  inherit (packages) version;
+  format = "wheel";
+
+  disabled = pythonAtLeast "3.8";
+
+  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 = [
+    protobuf
+    numpy
+    scipy
+    termcolor
+    grpcio
+    six
+    astor
+    absl-py
+    gast
+    opt-einsum
+    google-pasta
+    wrapt
+    tensorflow-estimator_2
+    tensorflow-tensorboard_2
+    keras-applications
+    keras-preprocessing
+  ] ++ lib.optional (!isPy3k) mock
+    ++ lib.optionals (pythonOlder "3.4") [ backports_weakref ];
+
+  nativeBuildInputs = [ wheel ] ++ lib.optional cudaSupport addOpenGLRunpath;
+
+  preConfigure = ''
+    unset SOURCE_DATE_EPOCH
+
+    # Make sure that dist and the wheel file are writable.
+    chmod u+rwx -R ./dist
+
+    pushd dist
+
+    # Unpack the wheel file.
+    wheel unpack --dest unpacked ./*.whl
+
+    # Tensorflow has a hard dependency on gast==0.2.2, but we relax it to
+    # gast==0.3.2.
+    substituteInPlace ./unpacked/tensorflow*/tensorflow_core/tools/pip_package/setup.py --replace "gast == 0.2.2" "gast == 0.3.2"
+    substituteInPlace ./unpacked/tensorflow*/tensorflow_*.dist-info/METADATA --replace "gast (==0.2.2)" "gast (==0.3.2)"
+
+    # Pack the wheel file back up.
+    wheel pack ./unpacked/tensorflow*
+
+    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
+        nvidia_x11
+      ];
+
+      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_core/"
+        "$out/${python.sitePackages}/tensorflow_core/compiler/tf2tensorrt/"
+        "$out/${python.sitePackages}/tensorflow_core/compiler/tf2xla/ops/"
+        "$out/${python.sitePackages}/tensorflow_core/lite/experimental/microfrontend/python/ops/"
+        "$out/${python.sitePackages}/tensorflow_core/lite/python/interpreter_wrapper/"
+        "$out/${python.sitePackages}/tensorflow_core/lite/python/optimize/"
+        "$out/${python.sitePackages}/tensorflow_core/python/"
+        "$out/${python.sitePackages}/tensorflow_core/python/framework/"
+        "${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 tensorflow-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.keras"
+    "tensorflow.python"
+    "tensorflow.python.framework"
+  ];
+
+  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 cdepillabout ];
+    platforms = [ "x86_64-linux" "x86_64-darwin" ];
+    # Python 2.7 build uses different string encoding.
+    # See https://github.com/NixOS/nixpkgs/pull/37044#issuecomment-373452253
+    broken = stdenv.isDarwin && !isPy3k;
+  };
+}
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..90848e93273f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tensorflow/binary-hashes.nix
@@ -0,0 +1,51 @@
+{
+version = "2.1.0";
+linux_py_27_gpu = {
+  url = "https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow_gpu-2.1.0-cp27-cp27mu-manylinux2010_x86_64.whl";
+  sha256 = "17lnhr7vdrls68c79n3sah5rpd0q1x2v5m84azvlyxxh2wpypfmb";
+};
+linux_py_27_cpu = {
+  url = "https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow_cpu-2.1.0-cp27-cp27mu-manylinux2010_x86_64.whl";
+  sha256 = "10lz3i4pcpgqrcbjmxm0n7k1gsqlpna3kdid902j2fy060cpi93z";
+};
+linux_py_35_gpu = {
+  url = "https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow_gpu-2.1.0-cp35-cp35m-manylinux2010_x86_64.whl";
+  sha256 = "09s081n08dpmflwgir3zwzfijfpmahbh2gy5fn5bv5ll86g1szsy";
+};
+linux_py_35_cpu = {
+  url = "https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow_cpu-2.1.0-cp35-cp35m-manylinux2010_x86_64.whl";
+  sha256 = "1aa7v9fnvx03hqvhl3x3xcn41qy6qxw5xybg54ifjvvicp455c8l";
+};
+linux_py_36_gpu = {
+  url = "https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow_gpu-2.1.0-cp36-cp36m-manylinux2010_x86_64.whl";
+  sha256 = "1dqp080ljbl9v3115vjp63ls0fimiwym6zxyanyhrlk8kwsq20zc";
+};
+linux_py_36_cpu = {
+  url = "https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow_cpu-2.1.0-cp36-cp36m-manylinux2010_x86_64.whl";
+  sha256 = "133z8anx7xm9rr5i9s9dwnp1wf06nr6s7q1lbs4lxpk6kn9nl480";
+};
+linux_py_37_gpu = {
+  url = "https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow_gpu-2.1.0-cp37-cp37m-manylinux2010_x86_64.whl";
+  sha256 = "0yabl3xmcpr67w0zksqs3qc68nl9ax0vcd7w7b35nq8f65xl0ghy";
+};
+linux_py_37_cpu = {
+  url = "https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow_cpu-2.1.0-cp37-cp37m-manylinux2010_x86_64.whl";
+  sha256 = "04gngbngyg7p1gwx1q89my0cl8j7lq4kknqh51s2ynrix71zvsy6";
+};
+mac_py_27_cpu = {
+  url = "https://storage.googleapis.com/tensorflow/mac/cpu/tensorflow-2.1.0-cp27-cp27m-macosx_10_9_x86_64.whl";
+  sha256 = "1mprp72w5kk0lyjm2mh4lf57827xk3wsg28c4gizwm00ydfgacg6";
+};
+mac_py_35_cpu = {
+  url = "https://storage.googleapis.com/tensorflow/mac/cpu/tensorflow-2.1.0-cp35-cp35m-macosx_10_6_intel.whl";
+  sha256 = "1as7brf5ai6r7v1di9646jfrbnirpk2b0d1g29mn3shavb62kw8w";
+};
+mac_py_36_cpu = {
+  url = "https://storage.googleapis.com/tensorflow/mac/cpu/tensorflow-2.1.0-cp36-cp36m-macosx_10_9_x86_64.whl";
+  sha256 = "1v1rw9kjrskhcq1yas4ly2yfnzf2i1pjh6qg6zixfbkpkw7sw3wc";
+};
+mac_py_37_cpu = {
+  url = "https://storage.googleapis.com/tensorflow/mac/cpu/tensorflow-2.1.0-cp37-cp37m-macosx_10_9_x86_64.whl";
+  sha256 = "1hh4n0d97mrq35cmmsrnlmcv9vlswsyjy368lj3pda3y9dvck3rf";
+};
+}
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..9f64a689e2b8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tensorflow/default.nix
@@ -0,0 +1,422 @@
+{ stdenv, bazel_3, buildBazelPackage, isPy3k, lib, fetchFromGitHub, symlinkJoin
+, addOpenGLRunpath
+# Python deps
+, buildPythonPackage, pythonOlder, pythonAtLeast, python
+# Python libraries
+, numpy, tensorflow-tensorboard_2, absl-py
+, future, setuptools, wheel, keras-preprocessing, google-pasta
+, opt-einsum, astunparse, h5py
+, termcolor, grpcio, six, wrapt, protobuf, tensorflow-estimator_2
+, dill, flatbuffers-python, tblib, typing-extensions
+# Common deps
+, git, pybind11, which, binutils, glibcLocales, cython, perl
+# Common libraries
+, jemalloc, mpi, gast, grpc, sqlite, boringssl, jsoncpp
+, curl, snappy, flatbuffers-core, lmdb-core, icu, double-conversion, libpng, libjpeg_turbo, giflib
+# Upsteam 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, cudatoolkit ? null, cudnn ? null, nccl ? null
+, 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
+}:
+
+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.4.0";
+  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
+      protobuf
+      setuptools
+      six
+      tblib
+      tensorflow-estimator_2
+      tensorflow-tensorboard_2
+      termcolor
+      typing-extensions
+      wheel
+      wrapt
+  ]);
+
+  bazel-build = buildBazelPackage {
+    name = "${pname}-${version}";
+    bazel = bazel_3;
+
+    src = fetchFromGitHub {
+      owner = "tensorflow";
+      repo = "tensorflow";
+      rev = "v${version}";
+      sha256 = "0yl06aypfxrcs35828xf04mkidz1x0j89v0q5h4d2xps1cb5rv3f";
+    };
+
+    patches = [
+      # Relax too strict Python packages versions dependencies.
+      ./relax-dependencies.patch
+      # Add missing `io_bazel_rules_docker` dependency.
+      ./workspace.patch
+    ];
+
+    # 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
+    ] ++ lib.optional cudaSupport addOpenGLRunpath;
+
+    buildInputs = [
+      jemalloc
+      mpi
+      glibcLocales
+      git
+
+      # libs taken from system through the TF_SYS_LIBS mechanism
+      grpc
+      sqlite
+      boringssl
+      jsoncpp
+      curl
+      pybind11
+      snappy
+      flatbuffers-core
+      icu
+      double-conversion
+      libpng
+      libjpeg_turbo
+      giflib
+      lmdb-core
+    ] ++ lib.optionals cudaSupport [
+      cudatoolkit
+      cudnn
+    ] ++ lib.optionals mklSupport [
+      mkl
+    ] ++ lib.optionals stdenv.isDarwin [
+      Foundation
+      Security
+    ];
+
+    # 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"
+      # Multiple issues with custom protobuf.
+      # First `com_github_googleapis` fails to configure. Can be worked around by disabling `com_github_googleapis`
+      # and related functionality, but then the next error is about "dangling symbolic link", and in general
+      # looks like that's only the beginning: see
+      # https://stackoverflow.com/questions/55578884/how-to-build-tensorflow-1-13-1-with-custom-protobuf
+      # "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"
+    ];
+
+    INCLUDEDIR = "${includes_joined}/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 (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
+        "0vyy1hv0jy5pqwvnc8pxb9isgnbw07c4a4d4wn61db00np114crz"
+      else
+        "0vczv5f9s4dxgwdkmf1y9b9ybh5d3y1nllqhb5q8aj9kq73izyn9";
+    };
+
+    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
+      '';
+    };
+
+    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);
+    };
+  };
+
+in buildPythonPackage {
+  inherit version pname;
+  disabled = !isPy3k;
+
+  src = bazel-build.python;
+
+  # Upstream has a pip hack that results in bin/tensorboard being in both tensorflow
+  # and the propagated input tensorflow-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
+    dill
+    flatbuffers-python
+    gast
+    google-pasta
+    grpcio
+    h5py
+    keras-preprocessing
+    numpy
+    opt-einsum
+    protobuf
+    six
+    tblib
+    tensorflow-estimator_2
+    termcolor
+    typing-extensions
+    wrapt
+  ] ++ lib.optionals withTensorboard [
+    tensorflow-tensorboard_2
+  ];
+
+  nativeBuildInputs = lib.optional cudaSupport addOpenGLRunpath;
+
+  postFixup = lib.optionalString cudaSupport ''
+    find $out -type f \( -name '*.so' -or -name '*.so.*' \) | while read lib; do
+      addOpenGLRunpath "$lib"
+
+      patchelf --set-rpath "${cudatoolkit}/lib:${cudatoolkit.lib}/lib:${cudnn}/lib:${nccl}/lib:$(patchelf --print-rpath "$lib")" "$lib"
+    done
+  '';
+
+  # Actual tests are slow and impure.
+  # TODO try to run them anyway
+  # TODO better test (files in tensorflow/tools/ci_build/builds/*test)
+  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 = {
+    deps = bazel-build.deps;
+    libtensorflow = bazel-build.out;
+  };
+
+  inherit (bazel-build) meta;
+}
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..abb0faac2834
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tensorflow/prefetcher.sh
@@ -0,0 +1,44 @@
+#!/usr/bin/env bash
+
+version=2.1.0
+
+# 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_27_gpu https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow_gpu-${version}-cp27-cp27mu-manylinux2010_x86_64.whl"
+  "linux_py_27_cpu https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow_cpu-${version}-cp27-cp27mu-manylinux2010_x86_64.whl"
+  "linux_py_35_gpu https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow_gpu-${version}-cp35-cp35m-manylinux2010_x86_64.whl"
+  "linux_py_35_cpu https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow_cpu-${version}-cp35-cp35m-manylinux2010_x86_64.whl"
+  "linux_py_36_gpu https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow_gpu-${version}-cp36-cp36m-manylinux2010_x86_64.whl"
+  "linux_py_36_cpu https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow_cpu-${version}-cp36-cp36m-manylinux2010_x86_64.whl"
+  "linux_py_37_gpu https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow_gpu-${version}-cp37-cp37m-manylinux2010_x86_64.whl"
+  "linux_py_37_cpu https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow_cpu-${version}-cp37-cp37m-manylinux2010_x86_64.whl"
+  "mac_py_27_cpu https://storage.googleapis.com/tensorflow/mac/cpu/tensorflow-${version}-cp27-cp27m-macosx_10_9_x86_64.whl"
+  "mac_py_35_cpu https://storage.googleapis.com/tensorflow/mac/cpu/tensorflow-${version}-cp35-cp35m-macosx_10_6_intel.whl"
+  "mac_py_36_cpu https://storage.googleapis.com/tensorflow/mac/cpu/tensorflow-${version}-cp36-cp36m-macosx_10_9_x86_64.whl"
+  "mac_py_37_cpu https://storage.googleapis.com/tensorflow/mac/cpu/tensorflow-${version}-cp37-cp37m-macosx_10_9_x86_64.whl"
+)
+
+hashfile=binary-hashes.nix
+rm -f $hashfile
+echo "{" >> $hashfile
+echo "version = \"$version\";" >> $hashfile
+
+for url_and_key in "${url_and_key_list[@]}"; do
+  key=$(echo "$url_and_key" | cut -d' ' -f1)
+  url=$(echo "$url_and_key" | cut -d' ' -f2)
+
+  echo "prefetching ${url}..."
+  hash=$(nix-prefetch-url $url)
+
+  echo "$key = {" >> $hashfile
+  echo "  url = \"$url\";" >> $hashfile
+  echo "  sha256 = \"$hash\";" >> $hashfile
+  echo "};" >> $hashfile
+
+  echo
+done
+
+echo "}" >> $hashfile
+echo "done."
diff --git a/nixpkgs/pkgs/development/python-modules/tensorflow/relax-dependencies.patch b/nixpkgs/pkgs/development/python-modules/tensorflow/relax-dependencies.patch
new file mode 100644
index 000000000000..b26c1e95a645
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tensorflow/relax-dependencies.patch
@@ -0,0 +1,51 @@
+diff --git a/tensorflow/tools/pip_package/setup.py b/tensorflow/tools/pip_package/setup.py
+index 65133afdafe..8ef6364ff7e 100644
+--- a/tensorflow/tools/pip_package/setup.py
++++ b/tensorflow/tools/pip_package/setup.py
+@@ -75,23 +75,23 @@ if '--project_name' in sys.argv:
+ # comment the versioning scheme.
+ # NOTE: Please add test only packages to `TEST_PACKAGES` below.
+ REQUIRED_PACKAGES = [
+-    'absl-py ~= 0.10',
+-    'astunparse ~= 1.6.3',
+-    'flatbuffers ~= 1.12.0',
+-    'google_pasta ~= 0.2',
+-    'h5py ~= 2.10.0',
+-    'keras_preprocessing ~= 1.1.2',
+-    'numpy ~= 1.19.2',
+-    'opt_einsum ~= 3.3.0',
++    'absl-py >= 0.10',
++    'astunparse >= 1.6.3',
++    'flatbuffers >= 1.12.0',
++    'google_pasta >= 0.2',
++    'h5py >= 2.10.0',
++    'keras_preprocessing >= 1.1.2',
++    'numpy >= 1.19.1',
++    'opt_einsum >= 3.3.0',
+     'protobuf >= 3.9.2',
+-    'six ~= 1.15.0',
+-    'termcolor ~= 1.1.0',
+-    'typing_extensions ~= 3.7.4',
+-    'wheel ~= 0.35',
+-    'wrapt ~= 1.12.1',
++    'six >= 1.15.0',
++    'termcolor >= 1.1.0',
++    'typing_extensions >= 3.7.4',
++    'wheel >= 0.34.2',
++    'wrapt >= 1.12.1',
+     # These packages needs to be pinned exactly as newer versions are
+     # incompatible with the rest of the ecosystem
+-    'gast == 0.3.3',
++    'gast >= 0.3.3',
+     # TensorFlow ecosystem packages that TF exposes API for
+     # These need to be in sync with the existing TF version
+     # They are updated during the release process
+@@ -118,7 +118,7 @@ if 'tf_nightly' in project_name:
+ # BoringSSL support.
+ # See https://github.com/tensorflow/tensorflow/issues/17882.
+ if sys.byteorder == 'little':
+-  REQUIRED_PACKAGES.append('grpcio ~= 1.32.0')
++  REQUIRED_PACKAGES.append('grpcio >= 1.31.0')
+ 
+ 
+ # Packages which are only needed for testing code.
diff --git a/nixpkgs/pkgs/development/python-modules/tensorflow/workspace.patch b/nixpkgs/pkgs/development/python-modules/tensorflow/workspace.patch
new file mode 100644
index 000000000000..15a527815ec3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tensorflow/workspace.patch
@@ -0,0 +1,18 @@
+diff --git a/WORKSPACE b/WORKSPACE
+index 9db1d9b80eb..c46f13f4ca4 100644
+--- a/WORKSPACE
++++ b/WORKSPACE
+@@ -12,6 +12,13 @@ http_archive(
+     ],
+ )
+ 
++http_archive(
++    name = "io_bazel_rules_docker",
++    sha256 = "1698624e878b0607052ae6131aa216d45ebb63871ec497f26c67455b34119c80",
++    strip_prefix = "rules_docker-0.15.0",
++    urls = ["https://github.com/bazelbuild/rules_docker/releases/download/v0.15.0/rules_docker-v0.15.0.tar.gz"],
++)
++
+ # Load tf_repositories() before loading dependencies for other repository so
+ # that dependencies like com_google_protobuf won't be overridden.
+ load("//tensorflow:workspace.bzl", "tf_repositories")
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..54f32d182c0c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tensorly/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytest
+, nose
+, isPy27
+, numpy
+, scipy
+, sparse
+, pytorch
+}:
+
+buildPythonPackage rec {
+  pname = "tensorly";
+  version = "0.4.5";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = version;
+    sha256 = "1ml91yaxwx4msisxbm92yf22qfrscvk58f3z2r1jhi96pw2k4i7x";
+  };
+
+  propagatedBuildInputs = [ numpy scipy sparse ]
+    ++ lib.optionals (!doCheck) [ nose ]; # upstream added nose to install_requires
+
+  checkInputs = [ pytest nose pytorch ];
+  # also has a cupy backend, but the tests are currently broken
+  # (e.g. attempts to access cupy.qr instead of cupy.linalg.qr)
+  # and this backend also adds a non-optional CUDA dependence,
+  # as well as tensorflow and mxnet backends, but the tests don't
+  # seem to exercise these backend by default
+
+  # uses >= 140GB of ram to test
+  doCheck = false;
+  checkPhase = ''
+    runHook preCheck
+    nosetests -e "test_cupy"
+    runHook postCheck
+  '';
+
+  pythonImportsCheck = [ "tensorly" ];
+
+  meta = with lib; {
+    description = "Tensor learning in Python";
+    homepage = "https://tensorly.org/";
+    license = licenses.bsd3;
+    maintainers = [ maintainers.bcdarwin ];
+  };
+}
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..df0f4d6208a3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/termcolor/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv
+, 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..400751529ab6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/terminado/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, ptyprocess
+, tornado
+}:
+
+buildPythonPackage rec {
+  pname = "terminado";
+  version = "0.9.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "3da72a155b807b01c9e8a5babd214e052a0a45a975751da3521a1c3381ce6d76";
+  };
+
+  propagatedBuildInputs = [ ptyprocess tornado ];
+
+  # test_max_terminals fails
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Terminals served by Tornado websockets";
+    homepage = "https://github.com/jupyter/terminado";
+    license = licenses.bsd2;
+  };
+}
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..28e49316ad71
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/terminaltables/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "terminaltables";
+  version = "3.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f3eb0eb92e3833972ac36796293ca0906e998dc3be91fbe1f8615b331b853b81";
+  };
+
+  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/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/teslajsonpy/default.nix b/nixpkgs/pkgs/development/python-modules/teslajsonpy/default.nix
new file mode 100644
index 000000000000..c4520b1c1982
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/teslajsonpy/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, aiohttp
+, backoff
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, wrapt
+}:
+
+buildPythonPackage rec {
+  pname = "teslajsonpy";
+  version = "0.10.4";
+
+  src = fetchFromGitHub {
+    owner = "zabuldon";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "18frynmy47i9c24mdy819y2dnjwmhnmkly5mbmhikpbmm6d0yjf1";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    backoff
+    wrapt
+  ];
+
+  checkInputs = [ pytestCheckHook ];
+
+  # Not all Home Assistant related check pass
+  disabledTests = [ "test_values_on_init" ];
+  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..df1b02283043
--- /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.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0cc7d4r11z26rhcwpmcc42fi9kr3f20nq5pk84jrczr18i0g99mh";
+  };
+
+  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..f0c26292c84b
--- /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
+, tensorflow-tensorboard
+}:
+
+buildPythonPackage rec {
+  pname = "test-tube";
+  version = "0.7.5";
+
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "williamFalcon";
+    repo = pname;
+    rev = version;
+    sha256 = "0zpvlp1ybp2dhgap8jsalpfdyg8ycjhlfi3xrdf5dqffqvh2yhp2";
+  };
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  propagatedBuildInputs = [
+    future
+    imageio
+    numpy
+    pandas
+    pytorch
+    tensorflow-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/testfixtures/default.nix b/nixpkgs/pkgs/development/python-modules/testfixtures/default.nix
new file mode 100644
index 000000000000..b9803b115083
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/testfixtures/default.nix
@@ -0,0 +1,30 @@
+{ lib, buildPythonPackage, fetchPypi, fetchpatch, isPy27
+, mock, pytest, sybil, zope_component, twisted }:
+
+buildPythonPackage rec {
+  pname = "testfixtures";
+  version = "6.15.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "409f77cfbdad822d12a8ce5c4aa8fb4d0bb38073f4a5444fede3702716a2cec2";
+  };
+
+  checkInputs = [ pytest mock sybil zope_component twisted ];
+
+  doCheck = !isPy27;
+  checkPhase = ''
+    # django is too much hasle to setup at the moment
+    pytest -W ignore::DeprecationWarning \
+      --ignore=testfixtures/tests/test_django \
+      -k 'not (log_then_patch or our_wrap_dealing_with_mock_patch or patch_with_dict)' \
+      testfixtures/tests
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/Simplistix/testfixtures";
+    description = "A collection of helpers and mock objects for unit tests and doc tests";
+    license = licenses.mit;
+    maintainers = with maintainers; [ siriobalmelli ];
+  };
+}
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..a5ab52e5cdd5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/testpath/default.nix
@@ -0,0 +1,22 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "testpath";
+  version = "0.4.4";
+  format = "wheel";
+
+  src = fetchPypi {
+    inherit pname version format;
+    sha256 = "bfcf9411ef4bf3db7579063e0546938b1edda3d69f4e1fb8756991f5951f85d4";
+  };
+
+  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..c249ca212b6d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/testrepository/default.nix
@@ -0,0 +1,35 @@
+{ lib, stdenv
+, 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..465384edcb0c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/testscenarios/default.nix
@@ -0,0 +1,30 @@
+{ lib, stdenv
+, 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..8ef3d9c4320f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/testtools/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pbr
+, python_mimeparse
+, extras
+, unittest2
+, traceback2
+, testscenarios
+}:
+
+buildPythonPackage rec {
+  pname = "testtools";
+  version = "2.4.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "64c974a6cca4385d05f4bbfa2deca1c39ce88ede31c3448bee86a7259a9a61c8";
+  };
+
+  propagatedBuildInputs = [ pbr python_mimeparse extras unittest2 ];
+  buildInputs = [ traceback2 ];
+
+  # testscenarios has a circular dependency on testtools
+  doCheck = false;
+  checkInputs = [ testscenarios ];
+
+  # testtools 2.0.0 and up has a circular run-time dependency on futures
+  postPatch = ''
+    substituteInPlace requirements.txt --replace "fixtures>=1.3.0" ""
+  '';
+
+  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..616db71a94f4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/textacy/default.nix
@@ -0,0 +1,59 @@
+{ lib, buildPythonPackage, fetchPypi, isPy27
+, cachetools
+, cytoolz
+, jellyfish
+, matplotlib
+, networkx
+, numpy
+, pyemd
+, pyphen
+, pytest
+, requests
+, scikitlearn
+, scipy
+, spacy
+, srsly
+}:
+
+buildPythonPackage rec {
+  pname = "textacy";
+  version = "0.10.1";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ff72adc6dbb85db6981324e226fff77830da57d7fe7e4adb2cafd9dc2a8bfa7d";
+  };
+
+  propagatedBuildInputs = [
+    cachetools
+    cytoolz
+    jellyfish
+    matplotlib
+    networkx
+    numpy
+    pyemd
+    pyphen
+    requests
+    scikitlearn
+    scipy
+    spacy
+    srsly
+  ];
+
+  checkInputs = [ pytest ];
+  # almost all tests have to deal with downloading a dataset, only test pure tests
+  checkPhase = ''
+    pytest tests/test_text_utils.py \
+      tests/test_utils.py \
+      tests/preprocessing \
+      tests/datasets/test_base_dataset.py
+  '';
+
+  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/textfsm/default.nix b/nixpkgs/pkgs/development/python-modules/textfsm/default.nix
new file mode 100644
index 000000000000..04bc47913d8f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/textfsm/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, six
+, future
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "textfsm";
+  version = "1.1.1";
+
+  src = fetchFromGitHub {
+    owner = "google";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0fq2hphd89hns11nh0yifcp6brg6yy4n4hbvfk6avbjd7s40789a";
+  };
+
+  patches = [
+    (fetchpatch {
+      # remove pytest-runner dependency
+      url = "https://github.com/google/textfsm/commit/212db75fea4a79aca0f8f85a78954ffbc5667096.patch";
+      sha256 = "0n6qh3sz9wy5gdpq9jjxx8firis48ypr20yacs5bqri59sziwjp0";
+    })
+  ];
+
+  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/texttable/default.nix b/nixpkgs/pkgs/development/python-modules/texttable/default.nix
new file mode 100644
index 000000000000..a8c6d9dcfda8
--- /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.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ce0faf21aa77d806bbff22b107cc22cce68dc9438f97a2df32c93e9afa4ce436";
+  };
+
+  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/textwrap3/default.nix b/nixpkgs/pkgs/development/python-modules/textwrap3/default.nix
new file mode 100644
index 000000000000..791479b69e14
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/textwrap3/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, tox
+, pytest
+, coverage
+, pytestcov
+}:
+
+buildPythonPackage rec {
+  pname = "textwrap3";
+  version = "0.9.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "5008eeebdb236f6303dcd68f18b856d355f6197511d952ba74bc75e40e0c3414";
+  };
+
+  checkInputs = [
+    tox
+    pytest
+    coverage
+    pytestcov
+  ];
+
+  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/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/thespian/default.nix b/nixpkgs/pkgs/development/python-modules/thespian/default.nix
new file mode 100644
index 000000000000..74f94aaf2558
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/thespian/default.nix
@@ -0,0 +1,25 @@
+{ fetchPypi, buildPythonPackage, lib }:
+
+buildPythonPackage rec {
+  version = "3.10.1";
+  pname = "thespian";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "e00bba5b0b91f9d7ec3df0ac671136df7a7be0a14dfea38ca3850488bca73d8c";
+  };
+
+  # 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..bd520f2c4bfd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/thinc/default.nix
@@ -0,0 +1,83 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, pytest
+, blis
+, catalogue
+, cymem
+, cython
+, darwin
+, hypothesis
+, mock
+, murmurhash
+, numpy
+, pathlib
+, plac
+, preshed
+, srsly
+, tqdm
+, wasabi
+}:
+
+buildPythonPackage rec {
+  pname = "thinc";
+  version = "7.4.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "5743fde41706252ec6ce4737c68d3505f7e1cc3d4431174a17149838d594f8cb";
+  };
+
+  buildInputs = [ cython ] ++ lib.optionals stdenv.isDarwin (with darwin.apple_sdk.frameworks; [
+    Accelerate
+    CoreFoundation
+    CoreGraphics
+    CoreVideo
+  ]);
+
+  propagatedBuildInputs = [
+    blis
+    catalogue
+    cymem
+    murmurhash
+    numpy
+    plac
+    preshed
+    srsly
+    tqdm
+    wasabi
+  ] ++ lib.optional (pythonOlder "3.4") pathlib;
+
+
+  checkInputs = [
+    hypothesis
+    mock
+    pytest
+  ];
+
+  # Cannot find cython modules.
+  doCheck = false;
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "blis>=0.4.0,<0.8.0" "blis>=0.4.0,<1.0" \
+      --replace "catalogue>=0.0.7,<1.1.0" "catalogue>=0.0.7,<3.0" \
+      --replace "plac>=0.9.6,<1.2.0" "plac>=0.9.6,<2.0" \
+      --replace "srsly>=0.0.6,<1.1.0" "srsly>=0.0.6,<3.0"
+  '';
+
+  checkPhase = ''
+    pytest thinc/tests
+  '';
+
+  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 danieldk sdll ];
+  };
+}
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..7a1696feb665
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/threadpool/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv
+, 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..fb2c6094b37c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/threadpoolctl/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, isPy27
+, fetchFromGitHub
+, flit
+, pytestCheckHook
+, pytestcov
+, numpy
+, scipy
+}:
+
+buildPythonPackage rec {
+  pname = "threadpoolctl";
+  version = "2.1.0";
+
+  disabled = isPy27;
+  format = "flit";
+
+  src = fetchFromGitHub {
+    owner = "joblib";
+    repo = pname;
+    rev = version;
+    sha256 = "0sl6mp3b2gb0dvqkhnkmrp2g3r5c7clyyyxzq44xih6sw1pgx9df";
+  };
+
+  checkInputs = [ pytestCheckHook pytestcov numpy scipy ];
+
+  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/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..c7279b867b10
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/thrift/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "thrift";
+  version = "0.13.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "9af1c86bf73433afc6010ed376a6c6aca2b54099cc0d61895f640870a9ae7d89";
+  };
+
+  propagatedBuildInputs = [ six ];
+
+  # No tests. Breaks when not disabling.
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Python bindings for the Apache Thrift RPC system";
+    homepage = "http://thrift.apache.org/";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ hbunke ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/thumbor/0001-Don-t-use-which-implementation-to-find-required-exec.patch b/nixpkgs/pkgs/development/python-modules/thumbor/0001-Don-t-use-which-implementation-to-find-required-exec.patch
new file mode 100644
index 000000000000..4a2d9df06181
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/thumbor/0001-Don-t-use-which-implementation-to-find-required-exec.patch
@@ -0,0 +1,277 @@
+From bd5a5b58b438ff34d27781e28cd7fab93bfc9f3f Mon Sep 17 00:00:00 2001
+From: Maximilian Bosch <maximilian@mbosch.me>
+Date: Sat, 9 Mar 2019 23:26:30 +0100
+Subject: [PATCH] Don't use `which` implementation to find required executables
+
+Nix specific patch.
+
+Rather than relying on a global state, we set an absolute store path for
+all external dependencies to ensure their functionality.
+---
+ integration_tests/__init__.py       |  4 ++--
+ tests/engines/test_gif.py           |  2 +-
+ tests/handlers/test_base_handler.py | 30 ++++++++++++++---------------
+ tests/optimizers/test_gifv.py       |  2 +-
+ tests/test_server.py                |  4 ++++
+ tests/test_utils.py                 |  3 +++
+ thumbor/server.py                   |  7 +------
+ 7 files changed, 26 insertions(+), 26 deletions(-)
+
+diff --git a/integration_tests/__init__.py b/integration_tests/__init__.py
+index 9bdd0a3..7d9de8f 100644
+--- a/integration_tests/__init__.py
++++ b/integration_tests/__init__.py
+@@ -15,7 +15,7 @@ class EngineCase(AsyncHTTPTestCase):
+     def get_app(self):
+         cfg = Config(SECURITY_KEY='ACME-SEC')
+         server_params = ServerParameters(None, None, None, None, None, None)
+-        server_params.gifsicle_path = which('gifsicle')
++        server_params.gifsicle_path = '@gifsicle@'
+ 
+         cfg.DETECTORS = [
+             'thumbor.detectors.face_detector',
+@@ -28,7 +28,7 @@ class EngineCase(AsyncHTTPTestCase):
+         cfg.FILE_LOADER_ROOT_PATH = os.path.join(os.path.dirname(__file__), 'imgs')
+         cfg.ENGINE = getattr(self, 'engine', None)
+         cfg.USE_GIFSICLE_ENGINE = True
+-        cfg.FFMPEG_PATH = which('ffmpeg')
++        cfg.FFMPEG_PATH = '@ffmpeg@'
+         cfg.ENGINE_THREADPOOL_SIZE = 10
+         cfg.OPTIMIZERS = [
+             'thumbor.optimizers.gifv',
+diff --git a/tests/engines/test_gif.py b/tests/engines/test_gif.py
+index c0c8430..ce0cc51 100644
+--- a/tests/engines/test_gif.py
++++ b/tests/engines/test_gif.py
+@@ -44,7 +44,7 @@ class GitEngineTestCase(TestCase):
+     def get_server(self):
+         server = ServerParameters(8889, 'localhost', 'thumbor.conf', None, 'info', None)
+         server.security_key = 'ACME-SEC'
+-        server.gifsicle_path = which('gifsicle')
++        server.gifsicle_path = '@gifsicle@'
+         return server
+ 
+     def get_context(self, *args, **kwargs):
+diff --git a/tests/handlers/test_base_handler.py b/tests/handlers/test_base_handler.py
+index 69dc110..4493abe 100644
+--- a/tests/handlers/test_base_handler.py
++++ b/tests/handlers/test_base_handler.py
+@@ -557,7 +557,7 @@ class ImageOperationsWithAutoWebPTestCase(BaseImagingTestCase):
+         server = ServerParameters(8889, 'localhost', 'thumbor.conf', None, 'info', None)
+         server.security_key = 'ACME-SEC'
+         ctx = Context(server, cfg, importer)
+-        ctx.server.gifsicle_path = which('gifsicle')
++        ctx.server.gifsicle_path = '@gifsicle@'
+         return ctx
+ 
+     def get_as_webp(self, url):
+@@ -657,7 +657,7 @@ class ImageOperationsWithAutoWebPWithResultStorageTestCase(BaseImagingTestCase):
+         server.security_key = 'ACME-SEC'
+         ctx = Context(server, cfg, importer)
+         ctx.request = self.get_request()
+-        ctx.server.gifsicle_path = which('gifsicle')
++        ctx.server.gifsicle_path = '@gifsicle@'
+         return ctx
+ 
+     @property
+@@ -783,7 +783,7 @@ class ImageOperationsWithGifVTestCase(BaseImagingTestCase):
+         cfg = Config(SECURITY_KEY='ACME-SEC')
+         cfg.LOADER = "thumbor.loaders.file_loader"
+         cfg.FILE_LOADER_ROOT_PATH = self.loader_path
+-        cfg.FFMPEG_PATH = which('ffmpeg')
++        cfg.FFMPEG_PATH = '@ffmpeg@'
+         cfg.OPTIMIZERS = [
+             'thumbor.optimizers.gifv',
+         ]
+@@ -793,7 +793,7 @@ class ImageOperationsWithGifVTestCase(BaseImagingTestCase):
+         server = ServerParameters(8889, 'localhost', 'thumbor.conf', None, 'info', None)
+         server.security_key = 'ACME-SEC'
+         ctx = Context(server, cfg, importer)
+-        ctx.server.gifsicle_path = which('gifsicle')
++        ctx.server.gifsicle_path = '@gifsicle@'
+         return ctx
+ 
+     def test_should_convert_animated_gif_to_mp4_when_filter_without_params(self):
+@@ -828,7 +828,7 @@ class ImageOperationsImageCoverTestCase(BaseImagingTestCase):
+         server = ServerParameters(8889, 'localhost', 'thumbor.conf', None, 'info', None)
+         server.security_key = 'ACME-SEC'
+         ctx = Context(server, cfg, importer)
+-        ctx.server.gifsicle_path = which('gifsicle')
++        ctx.server.gifsicle_path = '@gifsicle@'
+         return ctx
+ 
+     def test_can_get_image_cover(self):
+@@ -849,7 +849,7 @@ class ImageOperationsWithResultStorageTestCase(BaseImagingTestCase):
+         cfg.RESULT_STORAGE_FILE_STORAGE_ROOT_PATH = self.root_path
+ 
+         cfg.USE_GIFSICLE_ENGINE = True
+-        cfg.FFMPEG_PATH = which('ffmpeg')
++        cfg.FFMPEG_PATH = '@ffmpeg@'
+         cfg.AUTO_WEBP = True
+         cfg.OPTIMIZERS = [
+             'thumbor.optimizers.gifv',
+@@ -860,7 +860,7 @@ class ImageOperationsWithResultStorageTestCase(BaseImagingTestCase):
+         server = ServerParameters(8889, 'localhost', 'thumbor.conf', None, 'info', None)
+         server.security_key = 'ACME-SEC'
+         ctx = Context(server, cfg, importer)
+-        ctx.server.gifsicle_path = which('gifsicle')
++        ctx.server.gifsicle_path = '@gifsicle@'
+ 
+         return ctx
+ 
+@@ -891,7 +891,7 @@ class ImageOperationsResultStorageOnlyTestCase(BaseImagingTestCase):
+         cfg.RESULT_STORAGE = 'thumbor.result_storages.file_storage'
+         cfg.RESULT_STORAGE_EXPIRATION_SECONDS = 60
+         cfg.RESULT_STORAGE_FILE_STORAGE_ROOT_PATH = self.root_path
+-        cfg.FFMPEG_PATH = which('ffmpeg')
++        cfg.FFMPEG_PATH = '@ffmpeg@'
+ 
+         cfg.USE_GIFSICLE_ENGINE = True
+         cfg.AUTO_WEBP = True
+@@ -904,7 +904,7 @@ class ImageOperationsResultStorageOnlyTestCase(BaseImagingTestCase):
+         server = ServerParameters(8889, 'localhost', 'thumbor.conf', None, 'info', None)
+         server.security_key = 'ACME-SEC'
+         ctx = Context(server, cfg, importer)
+-        ctx.server.gifsicle_path = which('gifsicle')
++        ctx.server.gifsicle_path = '@gifsicle@'
+ 
+         return ctx
+ 
+@@ -1040,7 +1040,7 @@ class ImageOperationsWithMaxPixels(BaseImagingTestCase):
+         server = ServerParameters(8889, 'localhost', 'thumbor.conf', None, 'info', None)
+         server.security_key = 'ACME-SEC'
+         ctx = Context(server, cfg, importer)
+-        ctx.server.gifsicle_path = which('gifsicle')
++        ctx.server.gifsicle_path = '@gifsicle@'
+         return ctx
+ 
+     def test_should_error(self):
+@@ -1061,7 +1061,7 @@ class ImageOperationsWithRespectOrientation(BaseImagingTestCase):
+         server = ServerParameters(8889, 'localhost', 'thumbor.conf', None, 'info', None)
+         server.security_key = 'ACME-SEC'
+         self.context = Context(server, cfg, importer)
+-        self.context.server.gifsicle_path = which('gifsicle')
++        self.context.server.gifsicle_path = '@gifsicle@'
+         return self.context
+ 
+     def test_should_be_ok_when_orientation_exif(self):
+@@ -1153,7 +1153,7 @@ class ImageOperationsWithJpegtranTestCase(BaseImagingTestCase):
+         cfg = Config(SECURITY_KEY='ACME-SEC')
+         cfg.LOADER = "thumbor.loaders.file_loader"
+         cfg.FILE_LOADER_ROOT_PATH = self.loader_path
+-        cfg.JPEGTRAN_PATH = which('jpegtran')
++        cfg.JPEGTRAN_PATH = '@jpegtran@'
+         cfg.PROGRESSIVE_JPEG = True,
+         cfg.RESULT_STORAGE_STORES_UNSAFE = True,
+         cfg.OPTIMIZERS = [
+@@ -1175,9 +1175,7 @@ class ImageOperationsWithJpegtranTestCase(BaseImagingTestCase):
+         f.write(response.body)
+         f.close()
+ 
+-        exiftool = which('exiftool')
+-        if not exiftool:
+-            raise AssertionError('exiftool was not found. Please install it to run thumbor\'s tests.')
++        exiftool = '@exiftool@'
+ 
+         command = [
+             exiftool,
+@@ -1221,7 +1219,7 @@ class ImageOperationsWithoutStorage(BaseImagingTestCase):
+         server = ServerParameters(8889, 'localhost', 'thumbor.conf', None, 'info', None)
+         server.security_key = 'ACME-SEC'
+         ctx = Context(server, cfg, importer)
+-        ctx.server.gifsicle_path = which('gifsicle')
++        ctx.server.gifsicle_path = '@gifsicle@'
+         return ctx
+ 
+     def test_meta(self):
+diff --git a/tests/optimizers/test_gifv.py b/tests/optimizers/test_gifv.py
+index 229e9cd..066f2d5 100644
+--- a/tests/optimizers/test_gifv.py
++++ b/tests/optimizers/test_gifv.py
+@@ -31,7 +31,7 @@ class GifvOptimizerTest(TestCase):
+     def get_context(self):
+         conf = Config()
+         conf.STATSD_HOST = ''
+-        conf.FFMPEG_PATH = which('ffmpeg')
++        conf.FFMPEG_PATH = '@ffmpeg@'
+         ctx = Context(config=conf)
+         ctx.request = RequestParameters()
+         ctx.request.filters.append('gifv')
+diff --git a/tests/test_server.py b/tests/test_server.py
+index 5b31750..c2a65dc 100644
+--- a/tests/test_server.py
++++ b/tests/test_server.py
+@@ -11,6 +11,8 @@
+ from unittest import TestCase
+ import mock
+ 
++from nose.tools import nottest
++
+ from preggy import expect
+ 
+ from thumbor.app import ThumborServiceApp
+@@ -118,6 +120,7 @@ class ServerTestCase(TestCase):
+         expect(server_parameters.security_key).to_equal('something')
+ 
+     @mock.patch.object(thumbor.server, 'which')
++    @nottest
+     def test_validate_gifsicle_path(self, which_mock):
+         server_parameters = mock.Mock(security_key=None)
+         conf = Config(SECURITY_KEY='test', USE_GIFSICLE_ENGINE=True)
+@@ -128,6 +131,7 @@ class ServerTestCase(TestCase):
+         expect(server_parameters.gifsicle_path).to_equal('/usr/bin/gifsicle')
+ 
+     @mock.patch.object(thumbor.server, 'which')
++    @nottest
+     def test_validate_null_gifsicle_path(self, which_mock):
+         server_parameters = mock.Mock(security_key=None)
+         conf = Config(SECURITY_KEY='test', USE_GIFSICLE_ENGINE=True)
+diff --git a/tests/test_utils.py b/tests/test_utils.py
+index 38cd51b..7dd0b3e 100644
+--- a/tests/test_utils.py
++++ b/tests/test_utils.py
+@@ -10,6 +10,7 @@
+ 
+ from mock import Mock, patch
+ from unittest import TestCase
++from nose.tools import nottest
+ import logging
+ 
+ from preggy import expect
+@@ -112,6 +113,7 @@ class UtilsTestCase(TestCase):
+             test_func()
+             mock_warn.assert_called_once_with('Deprecated function test_func: func2')
+ 
++    @nottest
+     def test_can_which_by_path(self):
+         result = which('/bin/ls')
+         expect(result).to_equal('/bin/ls')
+@@ -119,6 +121,7 @@ class UtilsTestCase(TestCase):
+         result = which('/tmp')
+         expect(result).to_be_null()
+ 
++    @nottest
+     def test_can_which_by_env(self):
+         result = which('ls')
+         expect(result).to_equal('/bin/ls')
+diff --git a/thumbor/server.py b/thumbor/server.py
+index c75a769..821163b 100644
+--- a/thumbor/server.py
++++ b/thumbor/server.py
+@@ -89,12 +89,7 @@ def validate_config(config, server_parameters):
+         warnings.simplefilter('error', Image.DecompressionBombWarning)
+ 
+     if config.USE_GIFSICLE_ENGINE:
+-        server_parameters.gifsicle_path = which('gifsicle')
+-        if server_parameters.gifsicle_path is None:
+-            raise RuntimeError(
+-                'If using USE_GIFSICLE_ENGINE configuration to True, the `gifsicle` binary must be in the PATH '
+-                'and must be an executable.'
+-            )
++        server_parameters.gifsicle_path = '@gifsicle@'
+ 
+ 
+ def get_context(server_parameters, config, importer):
+-- 
+2.18.1
+
diff --git a/nixpkgs/pkgs/development/python-modules/thumbor/default.nix b/nixpkgs/pkgs/development/python-modules/thumbor/default.nix
new file mode 100644
index 000000000000..86a2dd200110
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/thumbor/default.nix
@@ -0,0 +1,90 @@
+{ buildPythonPackage, python, tornado, pycrypto, pycurl, pytz
+, pillow, derpconf, python_magic, libthumbor, webcolors
+, piexif, futures, statsd, thumborPexif, fetchFromGitHub, isPy3k, lib
+, mock, raven, nose, yanc, remotecv, pyssim, cairosvg, preggy, opencv3
+, pkgs, coreutils, substituteAll
+}:
+
+buildPythonPackage rec {
+  pname = "thumbor";
+  version = "6.7.0";
+
+  disabled = isPy3k; # see https://github.com/thumbor/thumbor/issues/1004
+
+  # Tests aren't included in PyPI tarball so use GitHub instead
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = version;
+    sha256 = "1qv02jz7ivn38dsywp7nxrlflly86x9pm2pk3yqi8m8myhc7lipg";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./0001-Don-t-use-which-implementation-to-find-required-exec.patch;
+      gifsicle = "${pkgs.gifsicle}/bin/gifsicle";
+      exiftool = "${pkgs.exiftool}/bin/exiftool";
+      jpegtran = "${pkgs.libjpeg}/bin/jpegtran";
+      ffmpeg = "${pkgs.ffmpeg_3}/bin/ffmpeg";
+    })
+  ];
+
+  postPatch = ''
+    substituteInPlace "setup.py" \
+      --replace '"argparse",' "" ${lib.optionalString isPy3k ''--replace '"futures",' ""''}
+    sed -i setup.py \
+        -e 's/piexif[^"]*/piexif/;s/Pillow[^"]*/Pillow/'
+    substituteInPlace "tests/test_utils.py" \
+      --replace "/bin/ls" "${coreutils}/bin/ls"
+    substituteInPlace "tests/detectors/test_face_detector.py" \
+      --replace "./thumbor" "$out/lib/${python.libPrefix}/site-packages/thumbor"
+    substituteInPlace "tests/detectors/test_glasses_detector.py" \
+      --replace "./thumbor" "$out/lib/${python.libPrefix}/site-packages/thumbor"
+  '';
+
+  checkInputs = [
+    nose
+    pyssim
+    preggy
+    mock
+    yanc
+    remotecv
+    raven
+    pkgs.redis
+    pkgs.glibcLocales
+    pkgs.gifsicle
+  ];
+
+  propagatedBuildInputs = [
+    tornado
+    pycrypto
+    pycurl
+    pytz
+    pillow
+    derpconf
+    python_magic
+    libthumbor
+    opencv3
+    webcolors
+    piexif
+    statsd
+    cairosvg
+  ] ++ lib.optionals (!isPy3k) [ futures thumborPexif ];
+
+  # Remove the source tree before running nosetests because otherwise nosetests
+  # uses that instead of the installed package. Is there some other way to
+  # achieve this?
+  checkPhase = ''
+    redis-server --port 6668 --requirepass hey_you &
+    rm -r thumbor
+    export LC_ALL="en_US.UTF-8"
+    nosetests -v --with-yanc -s tests/ -e test_redeye_applied
+  '';
+
+  meta = with lib; {
+    description = "A smart imaging service";
+    homepage = "https://github.com/thumbor/thumbor/wiki";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
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..abfad4ffaac9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/thumborpexif/default.nix
@@ -0,0 +1,23 @@
+{ lib, stdenv
+, 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..9383cf947c20
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tifffile/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, isPy27
+, isPy3k
+, numpy
+, imagecodecs-lite
+, enum34
+, futures
+, pathlib
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "tifffile";
+  version = "2020.11.26";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "c712df6f201385fbd3500e26e45dc20fabcbb0c6c1fbfb4c1e44538a9d0269a8";
+  };
+
+  patches = lib.optional isPy27 ./python2-regex-compat.patch;
+
+  # Missing dependencies: imagecodecs, czifile, cmapfile, oiffile, lfdfiles
+  # and test data missing from PyPI tarball
+  doCheck = false;
+
+  checkInputs = [
+    pytest
+  ];
+
+  checkPhase = ''
+    pytest
+  '';
+
+  propagatedBuildInputs = [
+    numpy
+  ] ++ lib.optionals isPy3k [
+    imagecodecs-lite
+  ] ++ lib.optionals isPy27 [
+    futures
+    enum34
+    pathlib
+  ];
+
+  meta = with lib; {
+    description = "Read and write image data from and to TIFF files.";
+    homepage = "https://www.lfd.uci.edu/~gohlke/";
+    maintainers = [ maintainers.lebastr ];
+    license = licenses.bsd3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tifffile/python2-regex-compat.patch b/nixpkgs/pkgs/development/python-modules/tifffile/python2-regex-compat.patch
new file mode 100644
index 000000000000..7f4ec5764bb2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tifffile/python2-regex-compat.patch
@@ -0,0 +1,23 @@
+--- a/setup.py	2019-02-20 18:52:12.000000000 +0100
++++ b/setup.py	2019-03-02 13:55:39.014019260 +0100
+@@ -20,12 +20,6 @@
+ 

+ description = re.search(r'"""(.*)\.(?:\r\n|\r|\n)', code).groups()[0]

+ 

+-readme = re.search(r'(?:\r\n|\r|\n){2}"""(.*)"""(?:\r\n|\r|\n){2}from', code,

+-                   re.MULTILINE | re.DOTALL).groups()[0]

+-

+-readme = '\n'.join([description, '=' * len(description)]

+-                   + readme.splitlines()[1:])

+-

+ license = re.search(r'(# Copyright.*?(?:\r\n|\r|\n))(?:\r\n|\r|\n)+""', code,

+                     re.MULTILINE | re.DOTALL).groups()[0]

+ 

+@@ -41,7 +35,6 @@
+     name='tifffile',

+     version=version,

+     description=description,

+-    long_description=readme,

+     author='Christoph Gohlke',

+     author_email='cgohlke@uci.edu',

+     url='https://www.lfd.uci.edu/~gohlke/',

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..d5379b849ade
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tiledb/default.nix
@@ -0,0 +1,86 @@
+{ lib
+, python
+, buildPythonPackage
+, fetchFromGitHub
+, cython
+, pybind11
+, tiledb
+, numpy
+, wheel
+, isPy3k
+, setuptools_scm
+, psutil
+, pandas
+}:
+
+buildPythonPackage rec {
+  pname = "tiledb";
+  version = "0.6.6";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "TileDB-Inc";
+    repo = "TileDB-Py";
+    rev = version;
+    sha256 = "0b2kn1xyf7d994kz29dpqiaf8yzvx0axw4yqi854c54pl22ddgzl";
+  };
+
+  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 ];
+  };
+
+}
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..170360c133ed
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tilestache/default.nix
@@ -0,0 +1,32 @@
+{ lib, stdenv
+, 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/timelib/default.nix b/nixpkgs/pkgs/development/python-modules/timelib/default.nix
new file mode 100644
index 000000000000..65b121ddfafd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/timelib/default.nix
@@ -0,0 +1,22 @@
+{ lib, stdenv
+, 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..b1160cafe309
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/timeout-decorator/default.nix
@@ -0,0 +1,16 @@
+{ lib, stdenv, 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/timezonefinder/default.nix b/nixpkgs/pkgs/development/python-modules/timezonefinder/default.nix
new file mode 100644
index 000000000000..0ba9c4c53d8f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/timezonefinder/default.nix
@@ -0,0 +1,33 @@
+{ buildPythonPackage
+, lib
+, fetchPypi
+, isPy27
+, numba
+, numpy
+, pytestCheckHook
+, pytestcov
+}:
+
+buildPythonPackage rec {
+  pname = "timezonefinder";
+  version = "4.5.0";
+
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "99b0cea5abf304e8738ecf5cceae0c0e5182534843f19638a26a220fa212fbad";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+  ];
+
+  checkInputs = [ numba pytestCheckHook pytestcov ];
+
+  meta = with lib; {
+    description = "fast python package for finding the timezone of any point on earth (coordinates) offline";
+    homepage = "https://github.com/MrMinimal64/timezonefinder";
+    license = licenses.mit;
+  };
+}
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..35c0f76b0843
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tinycss2/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, fetchpatch
+, webencodings
+# Check inputs
+, pytest
+, pytestrunner
+, pytestcov
+, pytest-flake8
+, pytest-isort
+}:
+
+buildPythonPackage rec {
+  pname = "tinycss2";
+  version = "1.0.2";
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1kw84y09lggji4krkc58jyhsfj31w8npwhznr7lf19d0zbix09v4";
+  };
+
+  patches = [
+    (
+      fetchpatch {
+        name = "tinycss2-fix-pytest-flake8-fail.patch";
+        url = "https://github.com/Kozea/tinycss2/commit/6556604fb98c2153412384d6f0f705db2da1aa60.patch";
+        sha256 = "1srvdzg1bak65fawd611rlskcgn5abmwmyjnk8qrrrasr554bc59";
+      }
+    )
+  ];
+
+  propagatedBuildInputs = [ webencodings ];
+
+  checkInputs = [ pytest pytestrunner pytestcov pytest-flake8 pytest-isort ];
+
+  # https://github.com/PyCQA/pycodestyle/issues/598
+  preCheck = ''
+    printf "[flake8]\nignore=W504,E741,E126" >> setup.cfg
+  '';
+
+  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..b267fa82854d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tinydb/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, poetry
+, pytestCheckHook
+, pytestcov
+, pytestrunner
+, pycodestyle
+, pyyaml
+}:
+
+buildPythonPackage rec {
+  pname = "tinydb";
+  version = "4.1.1";
+  disabled = pythonOlder "3.5";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "msiemens";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "09cwdmpj91c6q7jympip1lrcd3idbm9cqblgvmrh0v1vy1iv2ki7";
+  };
+
+  nativeBuildInputs = [ poetry ];
+
+  checkInputs = [
+    pytestCheckHook
+    pytestcov
+    pycodestyle
+    pyyaml
+  ];
+
+  meta = with lib; {
+    description = "A lightweight document oriented database written in pure Python with no external dependencies";
+    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/tiros/default.nix b/nixpkgs/pkgs/development/python-modules/tiros/default.nix
new file mode 100644
index 000000000000..edc4bbdebb13
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tiros/default.nix
@@ -0,0 +1,20 @@
+{ fetchPypi, buildPythonPackage
+, semantic-version, boto3, flask, docutils, requests
+}:
+
+buildPythonPackage rec {
+  pname = "tiros";
+  version = "1.0.44";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d6bf7410967554ec283f9d4eabc0ce6821d6e6d36001afbdb7fe0826423d4f37";
+  };
+
+  patchPhase = ''
+    sed -E -i "s/'([[:alnum:].-_]+)[=><]{2}[[:digit:].]*'/'\\1'/g" setup.py
+    sed -i "s/'datetime',//" setup.py
+  '';
+
+  propagatedBuildInputs = [ semantic-version boto3 flask docutils requests ];
+}
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..fc4316c98fe9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tissue/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv
+, 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..acc8b9c56705
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/titlecase/default.nix
@@ -0,0 +1,21 @@
+{ buildPythonPackage, lib, nose, fetchPypi, regex }:
+
+buildPythonPackage rec {
+  pname = "titlecase";
+  version = "1.1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "16e279edf085293bc9c44a68ce959c7d6cd5c653e6b5669a3a3640015cb63eb6";
+  };
+
+  propagatedBuildInputs = [ regex ];
+
+  checkInputs = [ nose ];
+
+  meta = {
+    homepage = "https://github.com/ppannuto/python-titlecase";
+    description = "Python Port of John Gruber's titlecase.pl";
+    license = lib.licenses.mit;
+  };
+}
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..13f23edaad15
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tld/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, factory_boy
+, faker
+, fetchPypi
+, pytest-cov
+, pytestCheckHook
+, six
+, tox
+}:
+
+buildPythonPackage rec {
+  pname = "tld";
+  version = "0.12.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0d1lbbg2qdw5jjxks0dqlf69bki5885mhj8ysvgylmrni56hjqqv";
+  };
+
+  checkInputs = [
+    factory_boy
+    faker
+    pytest-cov
+    pytestCheckHook
+    tox
+  ];
+
+  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..b91289e50614
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tldextract/default.nix
@@ -0,0 +1,28 @@
+{ lib, fetchPypi, buildPythonPackage, setuptools_scm
+, requests, requests-file, idna, filelock, pytest
+, responses
+}:
+
+buildPythonPackage rec {
+  pname   = "tldextract";
+  version = "3.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "cfae9bc8bda37c3e8c7c8639711ad20e95dc85b207a256b60b0b23d7ff5540ea";
+  };
+
+  propagatedBuildInputs = [ requests requests-file idna filelock ];
+  checkInputs = [ pytest responses ];
+  nativeBuildInputs = [ setuptools_scm ];
+
+  # No tests included
+  doCheck = false;
+  pythonImportsCheck = [ "tldextract" ];
+
+  meta = {
+    homepage = "https://github.com/john-kurkowski/tldextract";
+    description = "Accurately separate the TLD from the registered domain and subdomains of a URL, using the Public Suffix List";
+    license = lib.licenses.bsd3;
+  };
+}
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..5b6bfe6a0e28
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tls-parser/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, isPy27
+, fetchFromGitHub
+, buildPythonPackage
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "tls-parser";
+  version = "1.2.2";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "nabla-c0d3";
+    repo = "tls_parser";
+    rev = version;
+    sha256 = "12qj3vg02r5a51w6gbgb1gcxicqc10lbbsdi57jkkfvbqiindbd0";
+  };
+
+  checkInputs = [ pytestCheckHook ];
+
+  meta = with lib; {
+    homepage = "https://github.com/nabla-c0d3/tls_parser";
+    description = "Small library to parse TLS records";
+    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..302b113364d2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tlsh/default.nix
@@ -0,0 +1,34 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, cmake
+}:
+
+buildPythonPackage {
+  pname = "tlsh";
+  version = "3.4.5";
+
+  src = fetchFromGitHub {
+    owner = "trendmicro";
+    repo = "tlsh";
+    rev = "22fa9a62068b92c63f2b5a87004a7a7ceaac1930";
+    sha256 = "1ydliir308xn4ywy705mmsh7863ldlixdvpqwdhbipzq9vfpmvll";
+  };
+
+  nativeBuildInputs = [ cmake ];
+
+  # no test data
+  doCheck = false;
+
+  postConfigure = ''
+    cd ../py_ext
+  '';
+
+  meta = with lib; {
+    description = "Trend Micro Locality Sensitive Hash";
+    homepage = "https://github.com/trendmicro/tlsh";
+    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..a952c95d93e4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tlslite-ng/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv
+, 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..a1e78c5db76c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tlslite/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv
+, 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..713cf6139285
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tmb/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "tmb";
+  version = "0.1.1";
+
+  src = fetchFromGitHub {
+    owner = "alemuro";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-xwzaJuiQxExUA5W4kW7t1713S6NOvDNagcD3/dwA+DE=";
+  };
+
+  propagatedBuildInputs = [ requests ];
+
+  # Project has no tests
+  doCheck = false;
+  pythonImportsCheck = [ "tmb" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/alemuro/tmb";
+    description = "Python library that interacts with TMB API";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tmdb3/default.nix b/nixpkgs/pkgs/development/python-modules/tmdb3/default.nix
new file mode 100644
index 000000000000..36a88ea22e49
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tmdb3/default.nix
@@ -0,0 +1,23 @@
+{ lib, buildPythonPackage, fetchPypi, isPy3k }:
+
+buildPythonPackage rec {
+  pname = "tmdb3";
+  version = "0.7.2";
+  disabled = isPy3k; # Upstream has not received any updates since 2015, and importing from python3 does not work.
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "9b6e043b8a65d159e7fc8f720badc7ffee5109296e38676c107454e03a895983";
+  };
+
+  # no tests implemented
+  doCheck = false;
+
+  pythonImportsCheck = [ "tmdb3" ];
+
+  meta = with lib; {
+    description = "Python implementation of the v3 API for TheMovieDB.org, allowing access to movie and cast information";
+    homepage = "https://pypi.python.org/pypi/tmdb3";
+    license = licenses.bsd3;
+  };
+}
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..62749d3b02f6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/todoist/default.nix
@@ -0,0 +1,34 @@
+{ lib, fetchPypi, buildPythonPackage
+, requests, fetchpatch, pythonOlder, typing
+}:
+
+buildPythonPackage rec {
+  pname = "todoist-python";
+  version = "8.1.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "750b2d2300e8590cd56414ab7bbbc8dfcaf8c27102b342398955812176499498";
+  };
+
+  patches = [
+    # From https://github.com/Doist/todoist-python/pull/80
+    (fetchpatch {
+      url = "https://github.com/Doist/todoist-python/commit/605443c67a8e2f105071e0da001c9f6f2a89ef19.patch";
+      sha256 = "0ah0s5by783kqlaimsbxz11idz0bhc2428aw9vdjpngmzb7ih1pa";
+    })
+    (fetchpatch {
+      url = "https://github.com/Doist/todoist-python/commit/f2f8e1e5b3ab1674ad9f0dff885702a25d1d18e9.patch";
+      sha256 = "1kp63yk9kj87zvvgfl60m6lxdm5sx3dny4g0s67ap1jbz350wifn";
+    })
+  ];
+
+  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; [ ma27 ];
+  };
+}
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..875e70cee58e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/toggl-cli/default.nix
@@ -0,0 +1,70 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, pythonAtLeast, pythonOlder
+, click
+, click-completion
+, factory_boy
+, faker
+, inquirer
+, notify-py
+, pbr
+, pendulum
+, ptable
+, pytest
+, pytestcov
+, pytest-mock
+, requests
+, twine
+, validate-email
+}:
+
+
+buildPythonPackage rec {
+  pname = "toggl-cli";
+  version = "2.4.1";
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    pname = "togglCli";
+    inherit version;
+    sha256 = "19lry8adcznzmzbvghyid3yl4j05db6931bw38af5vrkkyzyf62i";
+  };
+
+  postPatch = ''
+   substituteInPlace requirements.txt \
+     --replace "inquirer==2.6.3" "inquirer>=2.6.3" \
+     --replace "notify-py==0.2.2" "notify-py>=0.2.2"
+  '';
+
+  nativeBuildInputs = [ pbr twine ];
+  checkInputs = [ pbr pytest pytestcov pytest-mock faker factory_boy ];
+
+  preCheck = ''
+    export TOGGL_API_TOKEN=your_api_token
+    export TOGGL_PASSWORD=toggl_password
+    export TOGGL_USERNAME=user@example.com
+    '';
+
+  checkPhase = ''
+   runHook preCheck
+   pytest -k "not premium and not TestDateTimeType and not TestDateTimeField" tests/unit --maxfail=20
+   runHook postCheck
+  '';
+
+  propagatedBuildInputs = [
+    click
+    click-completion
+    inquirer
+    notify-py
+    pendulum
+    ptable
+    requests
+    pbr
+    validate-email
+  ];
+
+  meta = with lib; {
+    homepage = "https://toggl.uhlir.dev/";
+    description = "Command line tool and set of Python wrapper classes for interacting with toggl's API";
+    license = licenses.mit;
+    maintainers = [ maintainers.mmahut ];
+  };
+}
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..ec435a0ac359
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tokenizers/default.nix
@@ -0,0 +1,126 @@
+{ lib, stdenv
+, rustPlatform
+, fetchFromGitHub
+, fetchurl
+, pipInstallHook
+, setuptools-rust
+, wheel
+, numpy
+, python
+, datasets
+, pytestCheckHook
+, requests
+}:
+
+let
+  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 rustPlatform.buildRustPackage rec {
+  pname = "tokenizers";
+  version = "0.10.0";
+
+  src = fetchFromGitHub {
+    owner = "huggingface";
+    repo = pname;
+    rev = "python-v${version}";
+    hash = "sha256-rQ2hRV52naEf6PvRsWVCTN7B1oXAQGmnpJw4iIdhamw=";
+  };
+
+  cargoSha256 = "sha256-BoHIN/519Top1NUBjpB/oEMqi86Omt3zTQcXFWqrek0=";
+
+  sourceRoot = "source/bindings/python";
+
+  nativeBuildInputs = [
+    pipInstallHook
+    setuptools-rust
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    python
+  ];
+
+  installCheckInputs = [
+    datasets
+    pytestCheckHook
+    requests
+  ];
+
+  doCheck = false;
+  doInstallCheck = true;
+
+  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 )
+  '';
+
+  buildPhase = ''
+    ${python.interpreter} setup.py bdist_wheel
+  '';
+
+  installPhase = ''
+    pipInstallPhase
+  '';
+
+  preCheck = ''
+    HOME=$TMPDIR
+  '';
+
+  disabledTests = [
+    # Downloads data using the datasets module.
+    "TestTrainFromIterators"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/huggingface/tokenizers";
+    description = "Fast State-of-the-Art Tokenizers optimized for Research and Production";
+    license = licenses.asl20;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ danieldk ];
+  };
+}
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..2bed18870166
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tokenlib/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv
+, 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/tokenserver/default.nix b/nixpkgs/pkgs/development/python-modules/tokenserver/default.nix
new file mode 100644
index 000000000000..6d3c7e2be054
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tokenserver/default.nix
@@ -0,0 +1,36 @@
+{ lib, buildPythonPackage, fetchFromGitHub
+, alembic, boto, cornice, hawkauthlib, mozsvc, paste, pybrowserid, pyfxa
+, pymysql, pymysqlsa, sqlalchemy, testfixtures, tokenlib, umemcache
+, mock, nose, unittest2, webtest
+}:
+
+buildPythonPackage rec {
+  pname = "tokenserver";
+  version = "1.3.1";
+
+  src = fetchFromGitHub {
+    owner = "mozilla-services";
+    repo = pname;
+    rev = version;
+    sha256 = "04z0r8xzrmhvh04y8ggdz9gs8qa8lv3qr7kasf6lm63fixsfgrlp";
+  };
+
+  propagatedBuildInputs = [
+    alembic boto cornice hawkauthlib mozsvc paste pybrowserid pyfxa
+    pymysql pymysqlsa sqlalchemy testfixtures tokenlib umemcache
+  ];
+
+  checkInputs = [
+    mock nose unittest2 webtest
+  ];
+
+  # Requires virtualenv, MySQL, ...
+  doCheck = false;
+
+  meta = with lib; {
+    description = "The Mozilla Token Server";
+    homepage = "https://github.com/mozilla-services/tokenserver";
+    license = licenses.mpl20;
+    maintainers = with maintainers; [ nadrieril ];
+  };
+}
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..0d0d87c73d11
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/toml/default.nix
@@ -0,0 +1,23 @@
+{ lib, stdenv, 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/tomlkit/default.nix b/nixpkgs/pkgs/development/python-modules/tomlkit/default.nix
new file mode 100644
index 000000000000..27f952386f12
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tomlkit/default.nix
@@ -0,0 +1,29 @@
+{ lib, buildPythonPackage, fetchPypi, isPy27
+, enum34, functools32, typing
+}:
+
+buildPythonPackage rec {
+  pname = "tomlkit";
+  version = "0.7.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ac57f29693fab3e309ea789252fcce3061e19110085aa31af5446ca749325618";
+  };
+
+  propagatedBuildInputs =
+    lib.optionals isPy27 [ enum34 functools32 ]
+    ++ lib.optional isPy27 typing;
+
+  # 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/tomlkit";
+    description = "Style-preserving TOML library for Python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jakewaksbaum ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/toolz/2.nix b/nixpkgs/pkgs/development/python-modules/toolz/2.nix
new file mode 100644
index 000000000000..8c8a64db3a5e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/toolz/2.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, nose
+}:
+
+buildPythonPackage rec {
+  pname = "toolz";
+  version = "0.10.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "08fdd5ef7c96480ad11c12d472de21acd32359996f69a5259299b540feba4560";
+  };
+
+  checkInputs = [ nose ];
+
+  checkPhase = ''
+    nosetests toolz/tests
+  '';
+
+  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/toolz/default.nix b/nixpkgs/pkgs/development/python-modules/toolz/default.nix
new file mode 100644
index 000000000000..6100d2a7c53d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/toolz/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, nose
+}:
+
+buildPythonPackage rec {
+  pname = "toolz";
+  version = "0.11.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1grz3zvw5ixwqqlbv0n7j11mlcxb66cirh5i9x9zw8kqy0hpk967";
+  };
+
+  checkInputs = [ nose ];
+
+  checkPhase = ''
+    nosetests toolz/tests
+  '';
+
+  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..003670989920
--- /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.0";
+
+  src = fetchFromGitHub {
+    owner = "frenck";
+    repo = "python-toonapi";
+    rev = "v${version}";
+    sha256 = "1d4n615vlcgkvmchrfjw4h3ndav3ljmcfydxr2b41zn83mzizqdf";
+  };
+
+  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..43df3c4e21e9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/toposort/default.nix
@@ -0,0 +1,23 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "toposort";
+  version = "1.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a7428f56ef844f5055bb9e9e44b343983773ae6dce0fe5b101e08e27ffbd50ac";
+  };
+
+  meta = with lib; {
+    description = "A topological sort algorithm";
+    homepage = "https://pypi.python.org/pypi/toposort/1.1";
+    maintainers = with maintainers; [ tstrobel ];
+    platforms = platforms.unix;
+    license = licenses.asl20;
+  };
+
+}
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..6e621ee8b688
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/torchgpipe/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, isPy27
+, pytest
+, pytestrunner
+, 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 pytestrunner pytestCheckHook ];
+  disabledTests = [ "test_inplace_on_requires_grad" ];
+  # seems like a harmless failure:
+  ## AssertionError:
+  ## Pattern 'a leaf Variable that requires grad has been used in an in-place operation.'
+  ## does not match 'a leaf Variable that requires grad is being used in an in-place operation.'
+
+  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/torchvision/default.nix b/nixpkgs/pkgs/development/python-modules/torchvision/default.nix
new file mode 100644
index 000000000000..928616eb4f8a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/torchvision/default.nix
@@ -0,0 +1,50 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, ninja
+, which
+, libjpeg_turbo
+, libpng
+, numpy
+, scipy
+, pillow
+, pytorch
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "torchvision";
+  version = "0.8.2";
+
+  src = fetchFromGitHub {
+    owner = "pytorch";
+    repo = "vision";
+    rev = "v${version}";
+    sha256 = "0yhpbq7linrk2qp5jxsvlgkmwa5bn38s9kcswy4jzvmx1fjbkpq0";
+  };
+
+  nativeBuildInputs = [ libpng ninja which ];
+
+  TORCHVISION_INCLUDE = "${libjpeg_turbo.dev}/include/";
+  TORCHVISION_LIBRARY = "${libjpeg_turbo}/lib/";
+
+  buildInputs = [ libjpeg_turbo libpng ];
+
+  propagatedBuildInputs = [ numpy pillow pytorch scipy ];
+
+  # 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;
+    maintainers = with maintainers; [ ericsagnes SuperSandro2000 ];
+  };
+}
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..6d889a09d25e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tornado/4.nix
@@ -0,0 +1,37 @@
+{ lib
+, python
+, buildPythonPackage
+, fetchPypi
+, backports_abc
+, backports_ssl_match_hostname
+, certifi
+, singledispatch
+, futures
+, isPy27
+}:
+
+buildPythonPackage rec {
+  pname = "tornado";
+  version = "4.5.3";
+
+  propagatedBuildInputs = lib.optionals isPy27 [ backports_abc certifi singledispatch backports_ssl_match_hostname futures ];
+
+  # 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..da270331978d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tornado/5.nix
@@ -0,0 +1,37 @@
+{ lib
+, python
+, buildPythonPackage
+, fetchPypi
+, backports_abc
+, backports_ssl_match_hostname
+, certifi
+, singledispatch
+, futures
+, isPy27
+}:
+
+buildPythonPackage rec {
+  pname = "tornado";
+  version = "5.1.1";
+
+  propagatedBuildInputs = lib.optionals isPy27 [ backports_abc certifi singledispatch backports_ssl_match_hostname futures ];
+
+  # 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..893943cbc720
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tornado/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, python
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "tornado";
+  version = "6.1";
+
+  # 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 = "33c6e81d7bd55b468d2e793517c909b139960b6c790a60b7991b9b6b76fb9791";
+  };
+
+  __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/towncrier/default.nix b/nixpkgs/pkgs/development/python-modules/towncrier/default.nix
new file mode 100644
index 000000000000..a7573e669a8c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/towncrier/default.nix
@@ -0,0 +1,40 @@
+{ lib, buildPythonPackage, fetchPypi, isPy27
+, click
+, click-default-group
+, incremental
+, jinja2
+, pytestCheckHook
+, toml
+, twisted
+, git # shells out to git
+}:
+
+buildPythonPackage rec {
+  pname = "towncrier";
+  version = "19.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "15l1gb0hhi9pf3mhhb9vpc93w6w3hrih2ljmzbkgfb3dwqd1l9a8";
+  };
+
+  propagatedBuildInputs = [
+    click
+    click-default-group
+    incremental
+    jinja2
+    toml
+  ];
+
+  # zope.interface collision
+  doCheck = !isPy27;
+  checkInputs = [ git 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..9dad7d77ff90
--- /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.20.1";
+
+  buildInputs = [ setuptools_scm ];
+  propagatedBuildInputs = [ packaging pluggy py six virtualenv toml filelock ];
+
+  doCheck = false;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "4321052bfe28f9d85082341ca8e233e3ea901fdd14dab8a5d3fbd810269fbaf6";
+  };
+
+  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/tqdm/default.nix b/nixpkgs/pkgs/development/python-modules/tqdm/default.nix
new file mode 100644
index 000000000000..ba40723e7ddd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tqdm/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, nose
+, coverage
+, glibcLocales
+, flake8
+, setuptools_scm
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "tqdm";
+  version = "4.54.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1x9chlh3msikddmq8p8p5s5kgqqs48bclxgzz3vb9ygcwjimidiq";
+  };
+
+  nativeBuildInputs = [
+    setuptools_scm
+  ];
+
+  checkInputs = [ nose coverage glibcLocales flake8 pytestCheckHook ];
+
+  # Remove performance testing.
+  # Too sensitive for on Hydra.
+  PYTEST_ADDOPTS = "-k \"not perf\"";
+
+  LC_ALL="en_US.UTF-8";
+
+  meta = {
+    description = "A Fast, Extensible Progress Meter";
+    homepage = "https://github.com/tqdm/tqdm";
+    license = with lib.licenses; [ mit ];
+    maintainers = with lib.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..5309ae47a02d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/traceback2/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv
+, 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..f4c01f003a9a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tracing/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv
+, 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..ff4c4a767583
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/trackpy/default.nix
@@ -0,0 +1,59 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, numpy
+, scipy
+, six
+, pandas
+, pyyaml
+, matplotlib
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "trackpy";
+  version = "0.4.2";
+
+  src = fetchFromGitHub {
+    owner = "soft-matter";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "16mc22z3104fvygky4gy3gvifjijm42db48v2z1y0fmyf6whi9p6";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+    scipy
+    six
+    pandas
+    pyyaml
+    matplotlib
+  ];
+
+  checkInputs = [
+    pytest
+  ];
+
+  checkPhase = ''
+    ${lib.optionalString (stdenv.isDarwin) ''
+    # specifically needed for darwin
+    export HOME=$(mktemp -d)
+    mkdir -p $HOME/.matplotlib
+    echo "backend: ps" > $HOME/.matplotlib/matplotlibrc
+    ''}
+
+    pytest trackpy --ignore trackpy/tests/test_motion.py \
+                   --ignore trackpy/tests/test_feature_saving.py \
+                   --ignore trackpy/tests/test_feature.py \
+                   --ignore trackpy/tests/test_plots.py \
+                   --ignore trackpy/tests/test_legacy_linking.py
+  '';
+
+  meta = with lib; {
+    description = "Particle-tracking toolkit";
+    homepage = "https://github.com/soft-matter/trackpy";
+    license = licenses.bsd3;
+    maintainers = [ maintainers.costrouc ];
+    broken = true; # not compatible with latest pandas
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/traitlets/4.nix b/nixpkgs/pkgs/development/python-modules/traitlets/4.nix
new file mode 100644
index 000000000000..bffd7c790bea
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/traitlets/4.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, glibcLocales
+, pytest
+, mock
+, ipython_genutils
+, decorator
+, enum34
+, pythonOlder
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "traitlets";
+  version = "4.3.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d023ee369ddd2763310e4c3eae1ff649689440d4ae59d7485eb4cfbbe3e359f7";
+  };
+
+  checkInputs = [ glibcLocales pytest mock ];
+  propagatedBuildInputs = [ ipython_genutils decorator six ] ++ lib.optional (pythonOlder "3.4") enum34;
+
+  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; [ ];
+  };
+}
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..3bc05897af66
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/traitlets/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, glibcLocales
+, pytest
+, mock
+, ipython_genutils
+, decorator
+, enum34
+, pythonOlder
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "traitlets";
+  version = "5.0.5";
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "178f4ce988f69189f7e523337a3e11d91c786ded9360174a3d9ca83e79bc5396";
+  };
+
+  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..e3bc8b43fe4e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/traits/default.nix
@@ -0,0 +1,40 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, python
+, pytest
+, numpy
+}:
+
+buildPythonPackage rec {
+  pname = "traits";
+  version = "6.1.1";
+  disabled = isPy27; # setup.py no longer py3 compat
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "807da52ee0d4fc1241c8f8a04d274a28d4b23d3a5f942152497d19405482d04f";
+  };
+
+  # Use pytest because its easier to discover tests
+  buildInputs = [ pytest ];
+  propagatedBuildInputs = [ numpy ];
+
+  checkPhase = ''
+    py.test $out/${python.sitePackages}
+  '';
+
+  # Test suite is broken for 3.x on latest release
+  # https://github.com/enthought/traits/issues/187
+  # https://github.com/enthought/traits/pull/188
+  # Furthermore, some tests fail due to being in a chroot
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Explicitly typed attributes for Python";
+    homepage = "https://pypi.python.org/pypi/traits";
+    license = "BSD";
+  };
+
+}
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..e76a36bcf4f9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/traitsui/default.nix
@@ -0,0 +1,24 @@
+{ lib, fetchPypi, buildPythonPackage
+, traits, pyface, six
+}:
+
+buildPythonPackage rec {
+  pname = "traitsui";
+  version = "7.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b699aeea588b55723860ddc6b2bd9b5013c4a72e18d1bbf51c6689cc7c6a562a";
+  };
+
+  propagatedBuildInputs = [ traits pyface six ];
+
+  doCheck = false; # Needs X server
+
+  meta = with lib; {
+    description = "Traits-capable windowing framework";
+    homepage = "https://github.com/enthought/traitsui";
+    maintainers = with maintainers; [ knedlsepp ];
+    license = licenses.bsdOriginal;
+  };
+}
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..2c8f6dd80312
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/traittypes/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, isPy27
+, pytest
+, nose
+, numpy
+, scipy
+, 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 pytest ];
+
+  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..def2559a72d0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/transaction/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv
+, fetchPypi
+, buildPythonPackage
+, zope_interface
+, mock
+}:
+
+
+buildPythonPackage rec {
+  pname = "transaction";
+  version = "3.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "3b0ad400cb7fa25f95d1516756c4c4557bb78890510f69393ad0bd15869eaa2d";
+  };
+
+  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..594204754408
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/transformers/default.nix
@@ -0,0 +1,57 @@
+{ buildPythonPackage
+, lib, stdenv
+, fetchFromGitHub
+, pythonOlder
+, cookiecutter
+, filelock
+, importlib-metadata
+, regex
+, requests
+, numpy
+, protobuf
+, sacremoses
+, tokenizers
+, tqdm
+}:
+
+buildPythonPackage rec {
+  pname = "transformers";
+  version = "4.2.2";
+
+  src = fetchFromGitHub {
+    owner = "huggingface";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-sBMCzEgYX6HQbzoEIYnmMdpYecCCsQjTdl2mO1Veu9M=";
+  };
+
+  propagatedBuildInputs = [
+    cookiecutter
+    filelock
+    numpy
+    protobuf
+    regex
+    requests
+    sacremoses
+    tokenizers
+    tqdm
+  ] ++ lib.optionals (pythonOlder "3.8") [ importlib-metadata ];
+
+  # Many tests require internet access.
+  doCheck = false;
+
+  postPatch = ''
+    sed -ri 's/tokenizers==[0-9.]+/tokenizers/g' setup.py
+  '';
+
+  pythonImportsCheck = [ "transformers" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/huggingface/transformers";
+    description = "State-of-the-art 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; [ danieldk 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..e270d5a0662d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/transip/default.nix
@@ -0,0 +1,41 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, isPy27
+, requests
+, cryptography
+, suds-jurko
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "transip-api";
+  version = "2.0.0";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "benkonrath";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "153x8ph7cp432flaqiy2zgp060ddychcqcrssxkcmjvbm86xrz17";
+  };
+
+  checkInputs = [ pytest ];
+
+  # Constructor Tests require network access
+  checkPhase = ''
+    pytest --deselect=tests/service_tests/test_domain.py::TestDomainService::test_constructor \
+           --deselect tests/service_tests/test_vps.py::TestVPSService::testConstructor \
+           --deselect tests/service_tests/test_webhosting.py::TestWebhostingService::testConstructor
+  '';
+
+
+  propagatedBuildInputs = [ requests cryptography suds-jurko ];
+
+  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..2dda33fd9682
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/transitions/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, fetchFromGitHub
+, six, pytestCheckHook, mock, dill, pycodestyle }:
+
+buildPythonPackage rec {
+  pname = "transitions";
+  version = "0.8.6";
+
+  # test_codestyle.py fails in PyPI sdist
+  src = fetchFromGitHub {
+    owner = "pytransitions";
+    repo = "transitions";
+    rev = version;
+    sha256 = "1d913hzzyqhdhhbkbvjw65dqkajrw50a4sxhyxk0jlg8pcs7bs7v";
+  };
+
+  propagatedBuildInputs = [ six ];
+
+  checkInputs = [ pytestCheckHook mock dill pycodestyle ];
+
+  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/translationstring/default.nix b/nixpkgs/pkgs/development/python-modules/translationstring/default.nix
new file mode 100644
index 000000000000..2f39b57b480f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/translationstring/default.nix
@@ -0,0 +1,22 @@
+{ lib, stdenv
+, 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/transmissionrpc/default.nix b/nixpkgs/pkgs/development/python-modules/transmissionrpc/default.nix
new file mode 100644
index 000000000000..a128b150579a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/transmissionrpc/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "transmissionrpc";
+  version = "0.11";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ec43b460f9fde2faedbfa6d663ef495b3fd69df855a135eebe8f8a741c0dde60";
+  };
+
+  propagatedBuildInputs = [ six ];
+
+  meta = with lib; {
+    description = "Python implementation of the Transmission bittorent client RPC protocol";
+    homepage = "https://pypi.python.org/pypi/transmissionrpc/";
+    license = licenses.mit;
+  };
+
+}
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..477223e96186
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/treq/default.nix
@@ -0,0 +1,56 @@
+{ lib, stdenv, fetchPypi, buildPythonPackage, service-identity, requests, six
+, mock, twisted, incremental, pep8, httpbin
+}:
+
+buildPythonPackage rec {
+  pname = "treq";
+  version = "20.9.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "83cd2ca75aef4f1fbdbe144c186426d930c3e8b20385df8cec9e12d442986da2";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    six
+    incremental
+    service-identity
+    twisted
+  ]
+    # twisted [tls] requirements (we should find a way to list "extras")
+    ++ twisted.extras.tls;
+
+  checkInputs = [
+    pep8
+    mock
+    httpbin
+  ];
+
+  postPatch = ''
+    rm -fv src/treq/test/test_treq_integration.py
+  '';
+
+  # XXX tox tries to install coverage despite it is installed
+  #postBuild = ''
+  #  # build documentation and install in $out
+  #  tox -e docs
+  #  mkdir -pv $out/docs
+  #  cp -rv docs/* $out/docs/
+  #'';
+
+  checkPhase = ''
+    pep8 --ignore=E902 treq
+    trial treq
+  '';
+
+  # Failing tests https://github.com/twisted/treq/issues/208
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/twisted/treq";
+    description = "A requests-like API built on top of twisted.web's Agent";
+    license = licenses.mit;
+    maintainers = with maintainers; [ nand0p ];
+  };
+}
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..bb85ca6b6f3c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/trezor/default.nix
@@ -0,0 +1,84 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+, installShellFiles
+, attrs
+, click
+, construct
+, ecdsa
+, hidapi
+, libusb1
+, mnemonic
+, pillow
+, protobuf
+, pyblake2
+, requests
+, rlp
+, shamir-mnemonic
+, typing-extensions
+, trezor-udev-rules
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "trezor";
+  version = "0.12.2";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0r0j0y0ii62ppawc8qqjyaq0fkmmb0zk1xb3f9navxp556w2dljv";
+  };
+
+  nativeBuildInputs = [ installShellFiles ];
+
+  propagatedBuildInputs = [
+    attrs
+    click
+    construct
+    ecdsa
+    hidapi
+    libusb1
+    mnemonic
+    pillow
+    protobuf
+    pyblake2
+    requests
+    rlp
+    shamir-mnemonic
+    typing-extensions
+  ] ++ lib.optionals stdenv.isLinux [
+    trezor-udev-rules
+  ];
+
+  checkInputs = [
+    pytest
+  ];
+
+  # disable test_tx_api.py as it requires being online
+  checkPhase = ''
+    runHook preCheck
+    pytest --pyargs tests --ignore tests/test_tx_api.py
+    runHook postCheck
+  '';
+
+  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 _1000101 ];
+  };
+}
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..537b4db7995a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/trezor_agent/default.nix
@@ -0,0 +1,37 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, trezor
+, libagent
+, ecdsa
+, ed25519
+, mnemonic
+, keepkey
+, semver
+, setuptools
+, wheel
+, pinentry
+}:
+
+buildPythonPackage rec {
+  pname = "trezor_agent";
+  version = "0.11.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "139d917d6495bf290bcc21da457f84ccd2e74c78b4d59a649e0cdde4288cd20c";
+  };
+
+  propagatedBuildInputs = [ setuptools trezor libagent ecdsa ed25519 mnemonic keepkey semver wheel pinentry ];
+
+  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/trimesh/default.nix b/nixpkgs/pkgs/development/python-modules/trimesh/default.nix
new file mode 100644
index 000000000000..b157e32ed876
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/trimesh/default.nix
@@ -0,0 +1,24 @@
+{ lib, buildPythonPackage, fetchPypi, numpy }:
+
+buildPythonPackage rec {
+  pname = "trimesh";
+  version = "3.9.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d19cbdb830a17297aa218ba6ce4955fc11b4b553414289cfd71f58f8144cc91f";
+  };
+
+  propagatedBuildInputs = [ numpy ];
+
+  # tests are not included in pypi distributions and would require lots of
+  # optional dependencies
+  doCheck = false;
+
+  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/default.nix b/nixpkgs/pkgs/development/python-modules/trio/default.nix
new file mode 100644
index 000000000000..94da63cd3ec6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/trio/default.nix
@@ -0,0 +1,57 @@
+{ lib, buildPythonPackage, fetchPypi, pythonOlder
+, attrs
+, sortedcontainers
+, async_generator
+, idna
+, outcome
+, contextvars
+, pytestCheckHook
+, pyopenssl
+, trustme
+, sniffio
+, stdenv
+, jedi
+, pylint
+, astor
+, yapf
+}:
+
+buildPythonPackage rec {
+  pname = "trio";
+  version = "0.17.0";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0zcxirpdvvl54pbfkgw7vz984879xwvdygqfpggnam24is2zjp78";
+  };
+
+  checkInputs = [ astor pytestCheckHook pyopenssl trustme jedi pylint yapf ];
+  # 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"
+  ];
+
+  propagatedBuildInputs = [
+    attrs
+    sortedcontainers
+    async_generator
+    idna
+    outcome
+    sniffio
+  ] ++ lib.optionals (pythonOlder "3.7") [ contextvars ];
+
+  # tests are failing on Darwin
+  doCheck = !stdenv.isDarwin;
+
+  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/trollius/default.nix b/nixpkgs/pkgs/development/python-modules/trollius/default.nix
new file mode 100644
index 000000000000..019326c54217
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/trollius/default.nix
@@ -0,0 +1,52 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, isPy3k, mock, unittest2, six, futures }:
+
+buildPythonPackage rec {
+  pname = "trollius";
+  version = "2.2.post1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "06s44k6pcq35vl5j4i2pgkpb848djal818qypcvx44gyn4azjrqn";
+  };
+
+  checkInputs = [ mock ] ++ lib.optional (!isPy3k) unittest2;
+
+  propagatedBuildInputs = [ six ] ++ lib.optional (!isPy3k) futures;
+
+  patches = [
+    ./tests.patch
+  ];
+
+  disabled = isPy3k;
+
+  postPatch = ''
+    # Overrides PYTHONPATH causing dependencies not to be found
+    sed -i -e "s|test_env_var_debug|skip_test_env_var_debug|g" tests/test_tasks.py
+  '' + lib.optionalString stdenv.isDarwin ''
+    # Some of the tests fail on darwin with `error: AF_UNIX path too long'
+    # because of the *long* path names for sockets
+    sed -i -e "s|test_create_ssl_unix_connection|skip_test_create_ssl_unix_connection|g" tests/test_events.py
+    sed -i -e "s|test_create_unix_connection|skip_test_create_unix_connection|g" tests/test_events.py
+    sed -i -e "s|test_create_unix_server_existing_path_nonsock|skip_test_create_unix_server_existing_path_nonsock|g" tests/test_unix_events.py
+    sed -i -e "s|test_create_unix_server_existing_path_sock|skip_test_create_unix_server_existing_path_sock|g" tests/test_unix_events.py
+    sed -i -e "s|test_create_unix_server_ssl_verified|skip_test_create_unix_server_ssl_verified|g" tests/test_events.py
+    sed -i -e "s|test_create_unix_server_ssl_verify_failed|skip_test_create_unix_server_ssl_verify_failed|g" tests/test_events.py
+    sed -i -e "s|test_create_unix_server_ssl|skip_test_create_unix_server_ssl|g" tests/test_events.py
+    sed -i -e "s|test_create_unix_server|skip_test_create_unix_server|g" tests/test_events.py
+    sed -i -e "s|test_open_unix_connection_error|skip_test_open_unix_connection_error|g" tests/test_streams.py
+    sed -i -e "s|test_open_unix_connection_no_loop_ssl|skip_test_open_unix_connection_no_loop_ssl|g" tests/test_streams.py
+    sed -i -e "s|test_open_unix_connection|skip_test_open_unix_connection|g" tests/test_streams.py
+    sed -i -e "s|test_pause_reading|skip_test_pause_reading|g" tests/test_subprocess.py
+    sed -i -e "s|test_read_pty_output|skip_test_read_pty_output|g" tests/test_events.py
+    sed -i -e "s|test_start_unix_server|skip_test_start_unix_server|g" tests/test_streams.py
+    sed -i -e "s|test_unix_sock_client_ops|skip_test_unix_sock_client_ops|g" tests/test_events.py
+    sed -i -e "s|test_write_pty|skip_test_write_pty|g" tests/test_events.py
+  '';
+
+  meta = with lib; {
+    description = "Port of the asyncio project to Python 2.7";
+    homepage = "https://github.com/vstinner/trollius";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/trollius/tests.patch b/nixpkgs/pkgs/development/python-modules/trollius/tests.patch
new file mode 100644
index 000000000000..4923bded9493
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/trollius/tests.patch
@@ -0,0 +1,13 @@
+diff --git i/tests/test_asyncio.py w/tests/test_asyncio.py
+index 39d9e1a..05b7e6f 100644
+--- i/tests/test_asyncio.py
++++ w/tests/test_asyncio.py
+@@ -69,7 +69,7 @@ class AsyncioTests(test_utils.TestCase):
+             def step_future():
+                 future = asyncio.Future()
+                 self.loop.call_soon(future.set_result, "asyncio.Future")
+-                return (yield from future)
++                return (yield From(future))
+ 
+             # test in release mode
+             trollius.coroutines._DEBUG = False
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..0c3efa404ec6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/trueskill/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv, 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..4c99c8e93770
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/trustme/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+, cryptography
+, futures
+, pytest
+, pyopenssl
+, service-identity
+, idna
+}:
+
+buildPythonPackage rec {
+  pname = "trustme";
+  version = "0.6.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "9dfb18b568729d0219f758cddca1a91bab59f62ca41ee0e8acce5e657ec97b6c";
+  };
+
+  checkInputs = [
+    pytest
+    pyopenssl
+    service-identity
+  ];
+
+  propagatedBuildInputs = [
+    cryptography
+    idna
+  ] ++ lib.optionals (!isPy3k) [
+    futures
+  ];
+
+  checkPhase = ''
+    pytest
+  '';
+
+  # Some of the tests use localhost networking.
+  __darwinAllowLocalNetworking = true;
+
+  meta = {
+    description = "High quality TLS certs while you wait, for the discerning tester";
+    homepage = "https://github.com/python-trio/trustme";
+    license = with lib.licenses; [ mit asl20 ];
+    maintainers = with lib.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..68254d8601ec
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/trytond/default.nix
@@ -0,0 +1,78 @@
+{ lib
+, buildPythonApplication
+, fetchPypi
+, pythonOlder
+, mock
+, lxml
+, relatorio
+, genshi
+, dateutil
+, polib
+, python-sql
+, werkzeug
+, wrapt
+, passlib
+, bcrypt
+, pydot
+, python-Levenshtein
+, simplejson
+, html2text
+, psycopg2
+, withPostgresql ? true
+}:
+
+buildPythonApplication rec {
+  pname = "trytond";
+  version = "5.8.2";
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "dea7d11ec0b4584a438fab7a1acb56864b32cc9e7d6ffa166572f75a2b033dc0";
+  };
+
+  # Tells the tests which database to use
+  DB_NAME = ":memory:";
+
+  buildInputs = [
+    mock
+  ];
+  propagatedBuildInputs = [
+    lxml
+    relatorio
+    genshi
+    dateutil
+    polib
+    python-sql
+    werkzeug
+    wrapt
+    passlib
+
+    # extra dependencies
+    bcrypt
+    pydot
+    python-Levenshtein
+    simplejson
+    html2text
+  ] ++ lib.optional withPostgresql psycopg2;
+
+  # If unset, trytond will try to mkdir /homeless-shelter
+  preCheck = ''
+    export HOME=$(mktemp -d)
+  '';
+
+  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/";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ udono johbo ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ttystatus/default.nix b/nixpkgs/pkgs/development/python-modules/ttystatus/default.nix
new file mode 100644
index 000000000000..24eb10637078
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ttystatus/default.nix
@@ -0,0 +1,30 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchurl
+, sphinx
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "ttystatus";
+  version = "0.23";
+  disabled = isPy3k;
+
+  src = fetchurl {
+    url = "http://code.liw.fi/debian/pool/main/p/python-ttystatus/python-ttystatus_${version}.orig.tar.gz";
+    sha256 = "0ymimviyjyh2iizqilg88g4p26f5vpq1zm3cvg7dr7q4y3gmik8y";
+  };
+
+  buildInputs = [ sphinx ];
+
+  # error: invalid command 'test'
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://liw.fi/ttystatus/";
+    description = "Progress and status updates on terminals for Python";
+    license = licenses.gpl3;
+    maintainers = [];
+  };
+
+}
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..7a4b4454b3b6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tubeup/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, internetarchive
+, fetchPypi
+, youtube-dl
+, docopt
+, isPy27
+}:
+
+buildPythonPackage rec {
+  pname = "tubeup";
+  version = "0.0.21";
+
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "326a499be032bee7f7ed921d85abff4b3b4dcd2c3d6ad694f08ef98dbcef19b6";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py --replace "docopt==0.6.2" "docopt"
+  '';
+
+  propagatedBuildInputs = [ internetarchive docopt youtube-dl ];
+
+  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.gpl3;
+    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..6d953740eb80
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tumpa/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, pyside2
+, johnnycanencrypt
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "tumpa";
+  version = "0.1.1";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "kushaldas";
+    repo = "tumpa";
+    rev = "v${version}";
+    sha256 = "1wvs64s0jxn4p8zr643d2hcczw3a175r6ib3481gdhjx38kgxjbq";
+  };
+
+  propagatedBuildInputs = [
+    setuptools
+    johnnycanencrypt
+    pyside2
+  ];
+
+  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/tvdb_api/default.nix b/nixpkgs/pkgs/development/python-modules/tvdb_api/default.nix
new file mode 100644
index 000000000000..f2cdbe8dc633
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tvdb_api/default.nix
@@ -0,0 +1,31 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, requests-cache
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "tvdb_api";
+  version = "3.0.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "6a0135815cb680da38d78121d4d659d8e54a25f4db2816cd86d62916b92f23b2";
+  };
+
+  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 ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tvnamer/default.nix b/nixpkgs/pkgs/development/python-modules/tvnamer/default.nix
new file mode 100644
index 000000000000..fa155b86f407
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tvnamer/default.nix
@@ -0,0 +1,30 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, pytest
+, tvdb_api
+}:
+
+buildPythonPackage rec {
+  pname = "tvnamer";
+  version = "3.0.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a5ff916e104b2c0b567c2c7f2d8ae15a66a7ac57d67390e7c67207a33b79022f";
+  };
+
+  checkInputs = [ pytest ];
+  propagatedBuildInputs = [ tvdb_api ];
+
+  # a ton of tests fail with: IOError: tvnamer/main.py could not be found in . or ..
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Automatic TV episode file renamer, uses data from thetvdb.com via tvdb_api.";
+    homepage = "https://github.com/dbr/tvnamer";
+    license = licenses.unlicense;
+    maintainers = with maintainers; [ peterhoeg ];
+  };
+
+}
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..1c5535ec079b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tweepy/default.nix
@@ -0,0 +1,21 @@
+{ lib, buildPythonPackage, fetchPypi, requests, six, requests_oauthlib }:
+
+buildPythonPackage rec {
+  pname = "tweepy";
+  version = "3.9.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "bfd19a5c11f35f7f199c795f99d9cbf8a52eb33f0ecfb6c91ee10b601180f604";
+  };
+
+  doCheck = false;
+  propagatedBuildInputs = [ requests six requests_oauthlib ];
+
+  meta = with lib; {
+    homepage = "https://github.com/tweepy/tweepy";
+    description = "Twitter library for python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
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..9647dc8ae67c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/twiggy/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "Twiggy";
+  version = "0.5.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "259ae96cb22e80c49e75c37dc2f7497028c5dc19018958f05fa00ec08fc2569f";
+  };
+
+  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..7931a4ad0ec9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/twilio/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub
+, pyjwt, pysocks, pytz, requests, six, nose, mock }:
+
+buildPythonPackage rec {
+  pname = "twilio";
+  version = "6.43.0";
+  # tests not included in PyPi, so fetch from github instead
+  src = fetchFromGitHub {
+    owner = "twilio";
+    repo = "twilio-python";
+    rev = version;
+    sha256 = "0p2chrzakqx5694g305j0klh9lxlclm5qp0qjm6wqicivyybggzg";
+  };
+
+  buildInputs = [ nose mock ];
+
+  propagatedBuildInputs = [ pyjwt pysocks pytz six requests ];
+
+  meta = with lib; {
+    description = "Twilio API client and TwiML generator";
+    homepage = "https://github.com/twilio/twilio-python/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ flokli ];
+  };
+}
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..a717ab2bc9d2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/twill/default.nix
@@ -0,0 +1,31 @@
+{ lib, buildPythonPackage, fetchPypi, isPy3k, nose
+, lxml
+, requests
+, pyparsing
+}:
+buildPythonPackage rec {
+  pname = "twill";
+  version = "2.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "85bc45bc34e3d4116123e3021c07d3a86b5e67be1ee01bc8062288eb83ae7799";
+  };
+
+  checkInputs = [ nose ];
+
+  propagatedBuildInputs = [
+    lxml
+    requests
+    pyparsing
+  ];
+
+  doCheck = false; # pypi package comes without tests, other homepage does not provide all verisons
+
+  meta = with lib; {
+    homepage = "https://twill-tools.github.io/twill/";
+    description = "A simple scripting language for Web browsing";
+    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..47f9fe1a034e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/twine/default.nix
@@ -0,0 +1,47 @@
+{ lib, buildPythonPackage, fetchPypi, pythonOlder
+, importlib-metadata
+, keyring
+, pkginfo
+, pyblake2
+, readme_renderer
+, requests
+, requests_toolbelt
+, setuptools_scm
+, tqdm
+, colorama
+, rfc3986
+}:
+
+buildPythonPackage rec {
+  pname = "twine";
+  version = "3.2.0";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "34352fd52ec3b9d29837e6072d5a2a7c6fe4290e97bba46bb8d478b5c598f7ab";
+  };
+
+  nativeBuildInputs = [ setuptools_scm ];
+  propagatedBuildInputs = [
+    keyring
+    pkginfo
+    pyblake2
+    readme_renderer
+    requests
+    requests_toolbelt
+    tqdm
+    colorama
+    rfc3986
+  ] ++ lib.optionals (pythonOlder "3.8") [ importlib-metadata ];
+
+  # Requires network
+  doCheck = false;
+
+  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/twisted/default.nix b/nixpkgs/pkgs/development/python-modules/twisted/default.nix
new file mode 100644
index 000000000000..421565725b14
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/twisted/default.nix
@@ -0,0 +1,62 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, python
+, zope_interface
+, incremental
+, automat
+, constantly
+, hyperlink
+, pyhamcrest
+, attrs
+, pyopenssl
+, service-identity
+, setuptools
+, idna
+}:
+buildPythonPackage rec {
+  pname = "Twisted";
+  version = "20.3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "tar.bz2";
+    sha256 = "040yzha6cyshnn6ljgk2birgh6mh2cnra48xp5ina5vfsnsmab6p";
+  };
+
+  propagatedBuildInputs = [ zope_interface incremental automat constantly hyperlink pyhamcrest attrs setuptools ];
+
+  passthru.extras.tls = [ pyopenssl service-identity idna ];
+
+  # Patch t.p._inotify to point to libc. Without this,
+  # twisted.python.runtime.platform.supportsINotify() == False
+  patchPhase = lib.optionalString stdenv.isLinux ''
+    substituteInPlace src/twisted/python/_inotify.py --replace \
+      "ctypes.util.find_library('c')" "'${stdenv.glibc.out}/lib/libc.so.6'"
+  '';
+
+  # 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
+  '';
+
+  checkPhase = ''
+    ${python.interpreter} -m unittest discover -s twisted/test
+  '';
+  # Tests require network
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://twistedmatrix.com/";
+    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 = [ ];
+  };
+}
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..72f30514dc67
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/twitter-common-collections/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv
+, 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..ee5bf9bdbe10
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/twitter-common-confluence/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv
+, 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..14b0bcd0673c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/twitter-common-dirutil/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv
+, 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..4b4a5c0fc2e2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/twitter-common-lang/default.nix
@@ -0,0 +1,22 @@
+{ lib, stdenv
+, 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..8cf99c39dc20
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/twitter-common-log/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv
+, 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..a5505330bc0a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/twitter-common-options/default.nix
@@ -0,0 +1,22 @@
+{ lib, stdenv
+, 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..23d647d93153
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/twitter/default.nix
@@ -0,0 +1,23 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "twitter";
+  version = "1.18.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "acdc85e5beea752967bb64c63bde8b915c49a31a01db1b2fecccf9f2c1d5c44d";
+  };
+
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Twitter API library";
+    license     = licenses.mit;
+    maintainers = with maintainers; [ thoughtpolice ];
+  };
+
+}
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..4d756fa89f3f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/txaio/default.nix
@@ -0,0 +1,30 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, pytest, mock, six, twisted, isPy37, isPy27 }:
+
+buildPythonPackage rec {
+  pname = "txaio";
+  version = "20.4.1";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "17938f2bca4a9cabce61346758e482ca4e600160cbc28e861493eac74a19539d";
+  };
+
+  checkInputs = [ pytest mock ];
+
+  propagatedBuildInputs = [ six twisted ];
+
+  checkPhase = ''
+    py.test -k "not test_sdist"
+  '';
+
+  # Needs some fixing
+  doCheck = false;
+
+  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; [ nand0p ];
+  };
+}
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..f0e3904a8815
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/txamqp/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv
+, 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..461ddeee34b4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/txdbus/default.nix
@@ -0,0 +1,22 @@
+{ lib, stdenv, 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..402e5011ede6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/txgithub/default.nix
@@ -0,0 +1,39 @@
+{ lib, stdenv
+, 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; [ nand0p ];
+  };
+
+}
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..06979e2b9b39
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/txrequests/default.nix
@@ -0,0 +1,35 @@
+{ lib, stdenv
+, 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; [ nand0p ];
+  };
+
+}
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..01a7cd3d87ac
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/txtorcon/default.nix
@@ -0,0 +1,38 @@
+{lib, buildPythonPackage, fetchPypi, isPy3k, incremental, ipaddress, twisted
+, automat, zope_interface, idna, pyopenssl, service-identity, pytest, mock, lsof
+, GeoIP, isPy27}:
+
+buildPythonPackage rec {
+  pname = "txtorcon";
+  version = "20.0.0";
+
+  checkInputs = [ pytest mock lsof GeoIP ];
+  propagatedBuildInputs = [
+    incremental twisted automat zope_interface
+    # extra dependencies required by twisted[tls]
+    idna pyopenssl service-identity
+  ] ++ lib.optionals (!isPy3k) [ ipaddress ];
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0yipb41w2icbj50d3z1j92d8w6xhbqd1rnmd31vzb5k3g20x0b0j";
+  };
+
+  # zope.interface issue
+  doCheck = isPy3k;
+  # Skip a failing test until fixed upstream:
+  # https://github.com/meejah/txtorcon/issues/250
+  checkPhase = ''
+    pytest --ignore=test/test_util.py .
+  '';
+
+  meta = {
+    description = "Twisted-based Tor controller client, with state-tracking and configuration abstractions";
+    homepage = "https://github.com/meejah/txtorcon";
+    maintainers = with lib.maintainers; [ jluttine ];
+    # Currently broken on Python 2.7. See
+    # https://github.com/NixOS/nixpkgs/issues/71826
+    broken = isPy27;
+    license = lib.licenses.mit;
+  };
+}
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..608ce8b65fea
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/typed-ast/default.nix
@@ -0,0 +1,20 @@
+{ buildPythonPackage, fetchFromGitHub, lib, pythonOlder }:
+buildPythonPackage rec {
+  pname = "typed-ast";
+  version = "1.4.1";
+  src = fetchFromGitHub{
+    owner = "python";
+    repo = "typed_ast";
+    rev = version;
+    sha256 = "086r9qhls6mz1w72a6d1ld3m4fbkxklf6mgwbs8wpw0zlxjm7y40";
+  };
+  # Only works with Python 3.3 and newer;
+  disabled = pythonOlder "3.3";
+  # No tests in archive
+  doCheck = false;
+  meta = {
+    homepage = "https://pypi.python.org/pypi/typed-ast";
+    description = "a fork of Python 2 and 3 ast modules with type comment support";
+    license = lib.licenses.asl20;
+  };
+}
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..448e52af7afa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/typeguard/default.nix
@@ -0,0 +1,42 @@
+{ buildPythonPackage
+, fetchPypi
+, pythonOlder
+, lib, stdenv
+, setuptools_scm
+, pytest
+, typing-extensions
+, glibcLocales
+}:
+
+buildPythonPackage rec {
+  pname = "typeguard";
+  version = "2.10.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d830132dcd544d3f8a2a842ea739eaa0d7c099fcebb9dcdf3802f4c9929d8191";
+  };
+
+  buildInputs = [ setuptools_scm ];
+  nativeBuildInputs = [ glibcLocales ];
+
+  LC_ALL="en_US.utf-8";
+
+  postPatch = ''
+    substituteInPlace setup.cfg --replace " --cov" ""
+  '';
+
+  checkInputs = [ pytest typing-extensions ];
+
+  checkPhase = ''
+    py.test .
+  '';
+
+  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..61adcf9254ff
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/typer/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, click
+, pytestCheckHook
+, shellingham
+, pytestcov
+, pytest_xdist
+, pytest-sugar
+, coverage
+, mypy
+, black
+, isort
+}:
+
+buildPythonPackage rec {
+  pname = "typer";
+  version = "0.3.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "00v3h63dq8yxahp9vg3yb9r27l2niwv8gv0dbds9dzrc298dfmal";
+  };
+
+  propagatedBuildInputs = [ click ];
+
+  checkInputs = [
+    pytestCheckHook
+    pytestcov
+    pytest_xdist
+    pytest-sugar
+    shellingham
+    coverage
+    mypy
+    black
+    isort
+  ];
+  pytestFlagsArray = [
+    "--ignore=tests/test_completion/test_completion.py"
+    "--ignore=tests/test_completion/test_completion_install.py"
+  ];
+
+  meta = with lib; {
+    homepage = "https://typer.tiangolo.com/";
+    description = "Typer, build great CLIs. Easy to code. Based on Python type hints.";
+    license = licenses.mit;
+    maintainers = [ maintainers.winpat ];
+  };
+}
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..ef3b1c78c399
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/typesentry/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, colorama
+, pytest
+, pytestcov
+}:
+
+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 pytestcov ];
+  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..e993363769a8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/typesystem/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, isPy27
+, pytestCheckHook
+, pytestcov
+, jinja2
+, pyyaml
+}:
+
+buildPythonPackage rec {
+  pname = "typesystem";
+  version = "0.2.4";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "encode";
+    repo = pname;
+    rev = version;
+    sha256 = "1k0jwcky17zwaz2vx4x2zbsnp270g4mgn7kx5bpl8jgx76qmsnba";
+  };
+
+  propagatedBuildInputs = [
+    jinja2
+    pyyaml
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    pytestcov
+  ];
+
+  disabledTests = [ "test_to_json_schema_complex_regular_expression" ];
+
+  meta = with lib; {
+    description = "A type system library for Python";
+    homepage = "https://github.com/encode/typesystem";
+    license = licenses.bsd3;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..655b3384af17
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/typing-extensions/default.nix
@@ -0,0 +1,31 @@
+{ lib, buildPythonPackage, fetchPypi, pythonOlder, isPy3k, python, typing }:
+let
+  testDir = if isPy3k then "src_py3" else "src_py2";
+
+in buildPythonPackage rec {
+  pname = "typing_extensions";
+  version = "3.7.4.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "99d4073b617d30288f569d3f13d2bd7548c3a7e4c8de87db09a9d29bb3a4a60c";
+  };
+
+  checkInputs = lib.optional (pythonOlder "3.5") typing;
+
+  # Error for Python3.6: ImportError: cannot import name 'ann_module'
+  # See https://github.com/python/typing/pull/280
+  doCheck = pythonOlder "3.6";
+
+  checkPhase = ''
+    cd ${testDir}
+    ${python.interpreter} -m unittest discover
+  '';
+
+  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..569096cb466c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/typing-inspect/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, typing-extensions
+, mypy-extensions
+, isPy39
+}:
+
+buildPythonPackage rec {
+  pname = "typing-inspect";
+  version = "0.6.0";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "typing_inspect";
+    sha256 = "1dzs9a1pr23dhbvmnvms2jv7l7jk26023g5ysf0zvnq8b791s6wg";
+  };
+
+  propagatedBuildInputs = [
+    typing-extensions
+    mypy-extensions
+  ];
+
+  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 ];
+    broken = isPy39;  # see https://github.com/ilevkivskyi/typing_inspect/issues/65
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/typing/default.nix b/nixpkgs/pkgs/development/python-modules/typing/default.nix
new file mode 100644
index 000000000000..0d5c2119921a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/typing/default.nix
@@ -0,0 +1,30 @@
+{ lib, buildPythonPackage, fetchPypi, pythonOlder, isPy3k, isPyPy, python }:
+
+let
+  testDir = if isPy3k then "src" else "python2";
+
+in buildPythonPackage rec {
+  pname = "typing";
+  version = "3.7.4.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1187fb9c82fd670d10aa07bbb6cfcfe4bdda42d6fab8d5134f04e8c4d0b71cc9";
+  };
+
+  # Error for Python3.6: ImportError: cannot import name 'ann_module'
+  # See https://github.com/python/typing/pull/280
+  # Also, don't bother on PyPy: AssertionError: TypeError not raised
+  doCheck = pythonOlder "3.6" && !isPyPy;
+
+  checkPhase = ''
+    cd ${testDir}
+    ${python.interpreter} -m unittest discover
+  '';
+
+  meta = with lib; {
+    description = "Backport of typing module to Python versions older than 3.5";
+    homepage = "https://docs.python.org/3/library/typing.html";
+    license = licenses.psfl;
+  };
+}
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..faa1c8641c05
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/typogrify/default.nix
@@ -0,0 +1,32 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPyPy
+, django
+, smartypants
+, jinja2
+}:
+
+buildPythonPackage rec {
+  pname = "typogrify";
+  version = "2.0.7";
+  disabled = isPyPy;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "8be4668cda434163ce229d87ca273a11922cb1614cb359970b7dc96eed13cb38";
+  };
+
+  propagatedBuildInputs = [ django smartypants jinja2 ];
+
+  # Wants to set up Django
+  doCheck = false;
+
+  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; [ ];
+  };
+
+}
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..df0923833fd5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tzlocal/default.nix
@@ -0,0 +1,23 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi
+, pytz }:
+
+buildPythonPackage rec {
+  pname = "tzlocal";
+  version = "2.1";
+
+  propagatedBuildInputs = [ pytz ];
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "643c97c5294aedc737780a49d9df30889321cbe1204eac2c2ec6134035a92e44";
+  };
+
+  # test fail (timezone test fail)
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Tzinfo object for the local timezone";
+    homepage = "https://github.com/regebro/tzlocal";
+    license = licenses.cddl;
+  };
+}
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..370ed527d193
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ua-parser/default.nix
@@ -0,0 +1,23 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, pyyaml }:
+
+buildPythonPackage rec {
+  pname = "ua-parser";
+  version = "0.10.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0csh307zfz666kkk5idrw3crj1x8q8vsqgwqil0r1n1hs4p7ica7";
+  };
+
+  buildInputs = [ pyyaml ];
+
+  doCheck = false; # requires files from uap-core
+
+  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/uamqp/default.nix b/nixpkgs/pkgs/development/python-modules/uamqp/default.nix
new file mode 100644
index 000000000000..05bc653b0591
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/uamqp/default.nix
@@ -0,0 +1,62 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, isPy3k
+, certifi
+, cmake
+, enum34
+, openssl
+, six
+, CFNetwork
+, CoreFoundation
+, Security
+}:
+
+buildPythonPackage rec {
+  pname = "uamqp";
+  version = "1.2.13";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-zDUFe/yMCThn+qJqDekMrUHEf1glGxBw4pioExLLoqg=";
+  };
+
+  patches = [
+    (fetchpatch {
+      url = "https://github.com/Azure/azure-c-shared-utility/commit/52ab2095649b5951e6af77f68954209473296983.patch";
+      sha256 = "06pxhdpkv94pv3lhj1vy0wlsqsdznz485bvg3zafj67r55g40lhd";
+      stripLen = "2";
+      extraPrefix = "src/vendor/azure-uamqp-c/deps/azure-c-shared-utility/";
+    })
+  ];
+
+  buildInputs = [
+    openssl
+    certifi
+    six
+  ] ++ lib.optionals (!isPy3k) [
+    enum34
+  ] ++ lib.optionals stdenv.isDarwin [
+    CoreFoundation
+    CFNetwork
+    Security
+  ];
+
+  dontUseCmakeConfigure = true;
+
+  nativeBuildInputs = [
+    cmake
+  ];
+
+  # has no tests
+  doCheck = false;
+
+  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..37ba1ab25e2f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/uarray/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, matchpy
+, numpy
+, astunparse
+, typing-extensions
+, black
+, pytest
+, pytestcov
+, numba
+, nbval
+, python
+, isPy37
+}:
+
+buildPythonPackage rec {
+  pname = "uarray";
+  version = "0.6.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "fa63ae7034833a99bc1628d3cd5501d4d00f2e6437b6cbe73f710dcf212a6bea";
+  };
+
+  doCheck = false; # currently has circular dependency module import, remove when bumping to >0.5.1
+  checkInputs = [ pytest nbval pytestcov numba ];
+  propagatedBuildInputs = [ matchpy numpy astunparse typing-extensions black ];
+
+  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/ueberzug/default.nix b/nixpkgs/pkgs/development/python-modules/ueberzug/default.nix
new file mode 100644
index 000000000000..cb46666f21e0
--- /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.8";
+
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "3718db8f824ef5f6a69dc25b3f08e0a45388dd46843c61721476bad2b64345ee";
+  };
+
+  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/ufonormalizer/default.nix b/nixpkgs/pkgs/development/python-modules/ufonormalizer/default.nix
new file mode 100644
index 000000000000..e2790482a3c4
--- /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.5.3";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0ijc697nv9rff9j1nhbf5vnyaryxlndq13msi94px8aq9gzxfrbi";
+    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..b0f5b11ad3a4
--- /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/ujson/2.nix b/nixpkgs/pkgs/development/python-modules/ujson/2.nix
new file mode 100644
index 000000000000..f31b26a1960a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ujson/2.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, setuptools_scm
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "ujson";
+  version = "2.0.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "18z9gb9ggy1r464b9q1gqs078mqgrkj6dys5a47529rqk3yfybdx";
+  };
+
+  nativeBuildInputs = [ setuptools_scm ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    homepage = "https://pypi.python.org/pypi/ujson";
+    description = "Ultra fast JSON encoder and decoder for Python";
+    license = licenses.bsd3;
+  };
+}
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..1c12a092a2f5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ujson/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+, isPyPy
+, setuptools_scm
+}:
+
+buildPythonPackage rec {
+  pname = "ujson";
+  version = "4.0.1";
+  disabled = isPyPy || (!isPy3k);
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "26cf6241b36ff5ce4539ae687b6b02673109c5e3efc96148806a7873eaa229d3";
+  };
+
+  nativeBuildInputs = [ setuptools_scm ];
+
+  meta = with lib; {
+    homepage = "https://pypi.python.org/pypi/ujson";
+    description = "Ultra fast JSON encoder and decoder for Python";
+    license = licenses.bsd3;
+  };
+
+}
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/umalqurra/default.nix b/nixpkgs/pkgs/development/python-modules/umalqurra/default.nix
new file mode 100644
index 000000000000..4411dbac11b8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/umalqurra/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv
+, 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..f471fbef4c8c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/umap-learn/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, nose
+, numpy
+, scikitlearn
+, scipy
+, numba
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "umap-learn";
+  version = "0.4.5";
+
+  src = fetchFromGitHub {
+    owner = "lmcinnes";
+    repo = "umap";
+    rev = version;
+    sha256 = "080by8h4rxr5ijx8vp8kn952chiqz029j26c04k4js4g9s7201bq";
+  };
+
+  checkInputs = [
+    nose
+    pytestCheckHook
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    scikitlearn
+    scipy
+    numba
+  ];
+
+  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"
+  ];
+
+  meta = with lib; {
+    description = "Uniform Manifold Approximation and Projection";
+    homepage = "https://github.com/lmcinnes/umap";
+    license = licenses.bsd3;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/umemcache/default.nix b/nixpkgs/pkgs/development/python-modules/umemcache/default.nix
new file mode 100644
index 000000000000..f852483cda68
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/umemcache/default.nix
@@ -0,0 +1,20 @@
+{ lib, stdenv, buildPythonPackage, isPy3k, fetchurl }:
+
+buildPythonPackage rec {
+  pname = "umemcache";
+  version = "1.6.3";
+  disabled = isPy3k;
+
+  src = fetchurl {
+    url = "mirror://pypi/u/umemcache/${pname}-${version}.zip";
+    sha256 = "211031a03576b7796bf277dbc9c9e3e754ba066bbb7fb601ab5c6291b8ec1918";
+  };
+
+  hardeningDisable = [ "format" ];
+
+  meta = with lib; {
+    description = "Ultra fast memcache client written in highly optimized C++ with Python bindings";
+    homepage = "https://github.com/esnme/ultramemcache";
+    license = licenses.bsdOriginal;
+  };
+}
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..117188198ca8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/uncertainties/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv, fetchPypi, buildPythonPackage
+, nose, numpy, future
+}:
+
+buildPythonPackage rec {
+  pname = "uncertainties";
+  version = "3.1.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "00z9xl40czmqk0vmxjvmjvwb41r893l4dad7nj1nh6blw3kw28li";
+  };
+
+  propagatedBuildInputs = [ future ];
+  checkInputs = [ nose numpy ];
+
+  checkPhase = "python setup.py 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..4f8d461c87e2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/uncompyle6/default.nix
@@ -0,0 +1,39 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, pythonAtLeast
+, spark_parser
+, xdis
+, nose
+, pytest
+, hypothesis
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "uncompyle6";
+  version = "3.7.4";
+  disabled = pythonAtLeast "3.9"; # See: https://github.com/rocky/python-uncompyle6/issues/331
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "af8330861bf940e7a3ae0f06d129b8e645191a36bf73ca15ff51997a837d41f8";
+  };
+
+  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..80ac5151b53f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/unicode-slugify/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, nose
+, six
+, unittest2
+, unidecode
+}:
+
+buildPythonPackage rec {
+  pname = "unicode-slugify";
+  version = "0.1.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0l7nphfdq9rgiczbl8n3mra9gx7pxap0xz540pkyz034zbz3mkrl";
+  };
+
+  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..9393ff58bc27
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/unicodecsv/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv
+, 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..565f0f557208
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/unicodedata2/default.nix
@@ -0,0 +1,23 @@
+{ lib, buildPythonPackage, fetchFromGitHub, pytest }:
+
+buildPythonPackage rec {
+  pname = "unicodedata2";
+  version = "13.0.0-2";
+
+  src = fetchFromGitHub {
+    owner  = "mikekap";
+    repo   = pname;
+    rev    = version;
+    sha256 = "0p9brbiwyg98q52y0gfyps52xv57fwqfpq0mn18p1xc1imip3h2b";
+  };
+
+  checkInputs = [ pytest ];
+  checkPhase = "pytest tests";
+
+  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..484f422adf3e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/unicorn/default.nix
@@ -0,0 +1,23 @@
+{ lib, stdenv, buildPythonPackage, setuptools, unicorn-emu }:
+
+buildPythonPackage rec {
+  pname = "unicorn";
+  version = lib.getVersion unicorn-emu;
+
+  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/
+  '';
+
+  propagatedBuildInputs = [ setuptools ];
+
+  meta = with lib; {
+    description = "Python bindings for Unicorn CPU emulator engine";
+    homepage = "https://www.unicorn-engine.org/";
+    license = [ licenses.gpl2 ];
+    maintainers = with maintainers; [ bennofs ris ];
+  };
+}
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..34de3d713866
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/unidecode/default.nix
@@ -0,0 +1,22 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, glibcLocales }:
+
+buildPythonPackage rec {
+  pname = "Unidecode";
+  version = "1.1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "2b6aab710c2a1647e928e36d69c21e76b453cd455f4e2621000e54b2a9b8cce8";
+  };
+
+  LC_ALL="en_US.UTF-8";
+
+  buildInputs = [ glibcLocales ];
+
+  meta = with lib; {
+    homepage = "https://pypi.python.org/pypi/Unidecode/";
+    description = "ASCII transliterations of Unicode text";
+    license = licenses.gpl2;
+    maintainers = with maintainers; [ domenkozar ];
+  };
+}
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..d1e18111db31
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/unidiff/default.nix
@@ -0,0 +1,21 @@
+{ lib, buildPythonPackage, fetchFromGitHub }:
+
+buildPythonPackage rec {
+  pname = "unidiff";
+  version = "0.6.0";
+
+  # PyPI tarball doesn't ship tests
+  src = fetchFromGitHub {
+    owner = "matiasb";
+    repo = "python-unidiff";
+    rev = "v${version}";
+    sha256 = "0farwkw0nbb5h4369pq3i6pp4047hav0h88ba55rzz5k7mr25rgi";
+  };
+
+  meta = with lib; {
+    description = "Unified diff python parsing/metadata extraction library";
+    homepage = "https://github.com/matiasb/python-unidiff";
+    license = licenses.mit;
+    maintainers = [ maintainers.marsam ];
+  };
+}
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..66ab9ba3972b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/unifi/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv, 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/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..c8d1edc42109
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/unittest-xml-reporting/default.nix
@@ -0,0 +1,23 @@
+{lib, fetchPypi, buildPythonPackage, isPy27, six}:
+
+buildPythonPackage rec {
+  pname = "unittest-xml-reporting";
+  version = "3.0.4";
+  disabled = isPy27;
+
+  propagatedBuildInputs = [six];
+
+  # The tarball from Pypi doesn't actually contain the unit tests
+  doCheck = false;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "984cebba69e889401bfe3adb9088ca376b3a1f923f0590d005126c1bffd1a695";
+  };
+  meta = with lib; {
+    homepage = "https://github.com/xmlrunner/unittest-xml-reporting/tree/master/";
+    description = "A unittest runner that can save test results to XML files";
+    license = lib.licenses.bsd2;
+    maintainers = with lib.maintainers; [ rprospero ];
+  };
+}
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..a7c1252f4b46
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/unittest2/default.nix
@@ -0,0 +1,38 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, six
+, traceback2
+}:
+
+buildPythonPackage rec {
+  version = "1.1.0";
+  pname = "unittest2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0y855kmx7a8rnf81d3lh5lyxai1908xjp0laf4glwa4c8472m212";
+  };
+
+  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.python.org/pypi/unittest2";
+    license = licenses.bsd0;
+  };
+
+}
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..52d2a42b4baf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/unpaddedbase64/default.nix
@@ -0,0 +1,23 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+}:
+
+buildPythonPackage rec {
+  pname = "unpaddedbase64";
+  version = "1.1.0";
+
+  src = fetchFromGitHub {
+    owner = "matrix-org";
+    repo = "python-${pname}";
+    rev = "refs/tags/v${version}";
+    sha256 = "0if3fjfxga0bwdq47v77fs9hrcqpmwdxry2i2a7pdqsp95258nxd";
+  };
+
+  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..49e070b84631
--- /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.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "4149c0729cf96a0bae80360e7d94dc40af1088c8da7f6eb8d10e09b8632e92ad";
+  };
+
+  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..820c96c38c90
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/untangle/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, fetchFromGitHub, python }:
+
+buildPythonPackage rec {
+  pname = "untangle";
+  version = "1.1.1";
+
+  src = fetchFromGitHub {
+    owner = "stchris";
+    repo = "untangle";
+    # 1.1.1 is not tagged on GitHub
+    rev = "61b57cd771a40df7d1621e9ec3c68d9acd733d31";
+    sha256 = "0ffvlfyyl82xi4akz1lls32lrnlrn44ik41v8x8xh9ghy0n0ick7";
+  };
+
+  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/upass/default.nix b/nixpkgs/pkgs/development/python-modules/upass/default.nix
new file mode 100644
index 000000000000..442876d7a975
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/upass/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchurl
+, pyperclip
+, urwid
+}:
+
+buildPythonPackage rec {
+  version = "0.1.4";
+  pname = "upass";
+
+  src = fetchurl {
+    url = "https://github.com/Kwpolska/upass/archive/v${version}.tar.gz";
+    sha256 = "0f2lyi7xhvb60pvzx82dpc13ksdj5k92ww09czclkdz8k0dxa7hb";
+  };
+
+  propagatedBuildInputs = [ pyperclip urwid ];
+
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Console UI for pass";
+    homepage = "https://github.com/Kwpolska/upass";
+    license = licenses.bsd3;
+  };
+
+}
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..ec9dbd947c08
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/update-dotdee/default.nix
@@ -0,0 +1,22 @@
+{ lib, buildPythonPackage, fetchFromGitHub, executor, naturalsort }:
+
+buildPythonPackage rec {
+  pname = "update-dotdee";
+  version = "5.0";
+
+  src = fetchFromGitHub {
+    owner = "xolox";
+    repo = "python-update-dotdee";
+    rev = version;
+    sha256 = "1h3m593nwzx6vwa24k0wizb7la49yhqxwn73ipclxgxxi4dfdj01";
+  };
+
+  propagatedBuildInputs = [ executor naturalsort ];
+
+  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..f9171e8cbc9d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/update_checker/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv, 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/uproot3-methods/default.nix b/nixpkgs/pkgs/development/python-modules/uproot3-methods/default.nix
new file mode 100644
index 000000000000..5164bf854ada
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/uproot3-methods/default.nix
@@ -0,0 +1,30 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, numpy
+, awkward0
+}:
+
+buildPythonPackage rec {
+  version = "0.10.0";
+  pname = "uproot3-methods";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1rk9i1ra3panli96ghz80ddpqk77xb1kpxs3wf8rw0jy5d88pc26";
+  };
+
+  nativeBuildInputs = [ awkward0 ];
+
+  propagatedBuildInputs = [ numpy awkward0 ];
+
+  # No tests on PyPi
+  doCheck = false;
+
+  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..1150c76d2b48
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/uproot3/default.nix
@@ -0,0 +1,44 @@
+{ lib, fetchFromGitHub, buildPythonPackage, isPy27
+, awkward0, backports_lzma, cachetools, lz4, pandas
+, pytestCheckHook, pytestrunner, pkgconfig, mock
+, numpy, requests, uproot3-methods, xxhash, zstandard
+}:
+
+buildPythonPackage rec {
+  pname = "uproot3";
+  version = "3.14.2";
+
+  src = fetchFromGitHub {
+    owner = "scikit-hep";
+    repo = "uproot3";
+    rev = version;
+    sha256 = "sha256-6/e+qMgwyFUo8MRRTAaGp9WLPxE2fqMEK4paq26Epzc=";
+  };
+
+  nativeBuildInputs = [ pytestrunner ];
+
+  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/default.nix b/nixpkgs/pkgs/development/python-modules/uptime/default.nix
new file mode 100644
index 000000000000..8f8c067d36ae
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/uptime/default.nix
@@ -0,0 +1,22 @@
+{ lib, stdenv
+, 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..f5bca2ed0fef
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/uranium/default.nix
@@ -0,0 +1,37 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub, python, cmake
+, pyqt5, numpy, scipy, shapely, libarcus, doxygen, gettext, pythonOlder }:
+
+buildPythonPackage rec {
+  version = "4.7.1";
+  pname = "uranium";
+  format = "other";
+
+  src = fetchFromGitHub {
+    owner = "Ultimaker";
+    repo = "Uranium";
+    rev = version;
+    sha256 = "1h5d3scy3cnbyhh0pbavflpqklhn2lbp7hl193rc5gx8yzr3mqbh";
+  };
+
+  disabled = pythonOlder "3.5.0";
+
+  buildInputs = [ python gettext ];
+  propagatedBuildInputs = [ pyqt5 numpy scipy shapely libarcus ];
+  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/uritemplate/default.nix b/nixpkgs/pkgs/development/python-modules/uritemplate/default.nix
new file mode 100644
index 000000000000..5077267528a5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/uritemplate/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, fetchPypi, simplejson, pytest, glibcLocales }:
+
+buildPythonPackage rec {
+  pname = "uritemplate";
+  version = "3.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "5af8ad10cec94f215e3f48112de2022e1d5a37ed427fbd88652fa908f2ab7cae";
+  };
+
+  propagatedBuildInputs = [ simplejson ];
+
+  checkInputs = [ pytest glibcLocales ];
+
+  checkPhase = ''
+    LC_ALL=en_US.UTF-8 py.test
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/python-hyper/uritemplate";
+    description = "URI template parsing for Humans";
+    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..b06da7c6acc7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/uritools/default.nix
@@ -0,0 +1,18 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, isPy27 }:
+
+buildPythonPackage rec {
+  pname = "uritools";
+  version = "3.0.0";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "405917a31ce58a57c8ccd0e4ea290f38baf2f4823819c3688f5331f1aee4ccb0";
+  };
+
+  meta = with lib; {
+    description = "RFC 3986 compliant, Unicode-aware, scheme-agnostic replacement for urlparse";
+    license = licenses.mit;
+    maintainers = [ 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..ea7825d9ffd2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/url-normalize/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry
+, pytest-cov
+, 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;
+    sha256 = "09nac5nh94x0n4bfazjfxk96b20mfsx6r1fnvqv85gkzs0rwqkaq";
+  };
+
+  nativeBuildInputs = [ poetry ];
+
+  propagatedBuildInputs = [ six ];
+
+  checkInputs = [
+    pytest-cov
+    pytest-flakes
+    pytest-mock
+    pytest-socket
+    pytestCheckHook
+  ];
+
+  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/urlgrabber/default.nix b/nixpkgs/pkgs/development/python-modules/urlgrabber/default.nix
new file mode 100644
index 000000000000..3a7158be73c8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/urlgrabber/default.nix
@@ -0,0 +1,20 @@
+{ lib, stdenv, 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..6cf7ce34d388
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/urllib3/default.nix
@@ -0,0 +1,33 @@
+{ lib, buildPythonPackage, fetchPypi
+, pytest, mock, tornado, pyopenssl, cryptography
+, idna, certifi, ipaddress, pysocks }:
+
+buildPythonPackage rec {
+  pname = "urllib3";
+  version = "1.26.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "19188f96923873c92ccb987120ec4acaa12f0461fa9ce5d3d0772bc965a39e08";
+  };
+
+  NOSE_EXCLUDE = lib.concatStringsSep "," [
+    "test_headers" "test_headerdict" "test_can_validate_ip_san" "test_delayed_body_read_timeout"
+    "test_timeout_errors_cause_retries" "test_select_multiple_interrupts_with_event"
+  ];
+
+  checkPhase = ''
+    nosetests -v --cover-min-percentage 1
+  '';
+
+  doCheck = false;
+
+  checkInputs = [ pytest mock tornado ];
+  propagatedBuildInputs = [ pyopenssl cryptography idna certifi ipaddress pysocks ];
+
+  meta = with lib; {
+    description = "Powerful, sanity-friendly HTTP client for Python";
+    homepage = "https://github.com/shazow/urllib3";
+    license = licenses.mit;
+  };
+}
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..1c5f1c8307ef
--- /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.12";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f7384e03017c3fb07bfba0d829d70287793326d9f6dac145dd09e0d693d7bf9c";
+  };
+
+  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..e3c5311136c2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/urwid/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, isPy3k, isPy27, glibcLocales }:
+
+buildPythonPackage rec {
+  pname = "urwid";
+  version = "2.1.2";
+  disabled = isPy27;
+
+  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 = "http://excess.org/urwid";
+    repositories.git = "git://github.com/wardi/urwid.git";
+    license = licenses.lgpl21;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/urwidtrees/default.nix b/nixpkgs/pkgs/development/python-modules/urwidtrees/default.nix
new file mode 100644
index 000000000000..4c3a3e896f86
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/urwidtrees/default.nix
@@ -0,0 +1,38 @@
+{ lib, stdenv
+, 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..b1f5b301dee4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/usbtmc/default.nix
@@ -0,0 +1,20 @@
+{ lib, stdenv, fetchurl, buildPythonPackage, pyusb }:
+
+buildPythonPackage rec {
+  pname = "usbtmc";
+  version = "0.8";
+
+  src = fetchurl {
+    url = "https://github.com/python-ivi/python-usbtmc/archive/v${version}.tar.gz";
+    sha256 = "14f4j77ljr45crnjwlp1dqbxwa45s20y2fpq5rg59r60w15al4yw";
+  };
+
+  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..7f8470cfbdc8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/user-agents/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv, 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..8366a56158dd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/userpath/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, click
+, distro
+}:
+
+buildPythonPackage rec {
+  pname = "userpath";
+  version = "1.4.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256="0mfjmvx286z1dmnrc7bm65x8gj8qrmkcyagl0vf5ywfq0bm48591";
+  };
+
+  propagatedBuildInputs = [ click distro ];
+
+  # 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; [ yevhenshymotiuk ];
+  };
+}
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..36e8b12929e0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/uvicorn/default.nix
@@ -0,0 +1,72 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchFromGitHub
+, click
+, h11
+, httptools
+, uvloop
+, websockets
+, wsproto
+, pytestCheckHook
+, pytest-mock
+, pyyaml
+, requests
+, trustme
+, typing-extensions
+, isPy27
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "uvicorn";
+  version = "0.13.2";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "encode";
+    repo = pname;
+    rev = version;
+    sha256 = "04zgmp9z46k72ay6cz7plga6d3w3a6x41anabm7ramp7jdqf6na9";
+  };
+
+  propagatedBuildInputs = [
+    click
+    h11
+    httptools
+    uvloop
+    websockets
+    wsproto
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    typing-extensions
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    pytest-mock
+    pyyaml
+    requests
+    trustme
+  ];
+
+  doCheck = !stdenv.isDarwin;
+
+  __darwinAllowLocalNetworking = true;
+
+  pytestFlagsArray = [
+    # watchgod required the watchgod package, which isn't available in nixpkgs
+    "--ignore=tests/supervisors/test_reload.py"
+  ];
+
+  disabledTests = [
+    "test_supported_upgrade_request"
+    "test_invalid_upgrade"
+  ];
+
+  meta = with lib; {
+    homepage = "https://www.uvicorn.org/";
+    description = "The lightning-fast ASGI server";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ wd15 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/uvloop/darwin_sandbox.patch b/nixpkgs/pkgs/development/python-modules/uvloop/darwin_sandbox.patch
new file mode 100644
index 000000000000..bd4e5e48b149
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/uvloop/darwin_sandbox.patch
@@ -0,0 +1,28 @@
+diff --git a/tests/test_pipes.py b/tests/test_pipes.py
+index d883abf..2e74d7a 100644
+--- a/tests/test_pipes.py
++++ b/tests/test_pipes.py
+@@ -2,6 +2,7 @@ import asyncio
+ import io
+ import os
+ import socket
++import unittest
+ 
+ from uvloop import _testbase as tb
+ 
+@@ -96,6 +97,7 @@ class _BasePipeTest:
+         # extra info is available
+         self.assertIsNotNone(proto.transport.get_extra_info('pipe'))
+ 
++    @unittest.skip("darwin sandbox")
+     def test_read_pty_output(self):
+         proto = MyReadPipeProto(loop=self.loop)
+ 
+@@ -198,6 +200,7 @@ class _BasePipeTest:
+         self.loop.run_until_complete(proto.done)
+         self.assertEqual('CLOSED', proto.state)
+ 
++    @unittest.skip("darwin sandbox")
+     def test_write_pty(self):
+         master, slave = os.openpty()
+         os.set_blocking(master, False)
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..a37e6a3675ba
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/uvloop/default.nix
@@ -0,0 +1,77 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, pyopenssl
+, libuv
+, psutil
+, isPy27
+, pythonAtLeast
+, CoreServices
+, ApplicationServices
+# Check Inputs
+, pytestCheckHook
+# , pytest-asyncio
+}:
+
+buildPythonPackage rec {
+  pname = "uvloop";
+  version = "0.14.0";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "07j678z9gf41j98w72ysrnb5sa41pl5yxd7ib17lcwfxqz0cjfhj";
+  };
+
+  patches = lib.optional stdenv.isDarwin ./darwin_sandbox.patch;
+
+  buildInputs = [
+    libuv
+  ] ++ lib.optionals stdenv.isDarwin [ CoreServices ApplicationServices ];
+
+  pythonImportsCheck = [
+    "uvloop"
+    "uvloop.loop"
+  ];
+
+  dontUseSetuptoolsCheck = true;
+  checkInputs = [ pytestCheckHook pyopenssl psutil ];
+
+  pytestFlagsArray = [
+    # from pytest.ini, these are NECESSARY to prevent failures
+    "--capture=no"
+    "--assert=plain"
+    "--tb=native"
+    # ignore code linting tests
+    "--ignore=tests/test_sourcecode.py"
+  ];
+
+  disabledTests = [
+    "test_sock_cancel_add_reader_race"  # asyncio version of test is supposed to be skipped but skip doesn't happen. uvloop version runs fine
+  ] ++ lib.optionals (pythonAtLeast "3.8") [ "test_write_to_closed_transport" ];  # https://github.com/MagicStack/uvloop/issues/355
+
+  # force using installed/compiled uvloop vs source by moving tests to temp dir
+  preCheck = ''
+    export TEST_DIR=$(mktemp -d)
+    cp -r tests $TEST_DIR
+    pushd $TEST_DIR
+  '' + lib.optionalString stdenv.isDarwin ''
+    # Some tests fail on Darwin
+    rm tests/test_[stu]*.py
+  '';
+  postCheck = ''
+    popd
+  '';
+
+  # 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 ];
+    broken = pythonAtLeast "3.9"; # see: https://github.com/MagicStack/uvloop/issues/365
+  };
+}
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..327cfcf3f0d3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/validate-email/default.nix
@@ -0,0 +1,22 @@
+{ lib, stdenv, 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..1bc9b1777ff6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/validators/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, six
+, decorator
+, pytestCheckHook
+, isort
+, flake8
+}:
+
+buildPythonPackage rec {
+  pname = "validators";
+  version = "0.18.1";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1a653b33c0ab091790f65f42b61aa191e354ed5fdedfeb17d24a86d0789966d7";
+  };
+
+  propagatedBuildInputs = [
+    six
+    decorator
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    flake8
+    isort
+  ];
+
+  disabledTests = lib.optionals isPy27 [ "url" ];
+
+  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..e89b3d7bcd23
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/validictory/default.nix
@@ -0,0 +1,23 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "validictory";
+  version = "1.1.2";
+
+  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/variants/default.nix b/nixpkgs/pkgs/development/python-modules/variants/default.nix
new file mode 100644
index 000000000000..11c50646700d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/variants/default.nix
@@ -0,0 +1,35 @@
+{ buildPythonPackage
+, isPy27
+, fetchPypi
+, pytestrunner
+, setuptools_scm
+, singledispatch
+, pytest
+, lib
+}:
+
+buildPythonPackage rec {
+  pname = "variants";
+  version = "0.2.0";
+
+  src = fetchPypi {
+    inherit pname version ;
+    sha256 = "511f75b4cf7483c27e4d86d9accf2b5317267900c166d17636beeed118929b90";
+  };
+
+  nativeBuildInputs = [
+    pytestrunner
+    setuptools_scm
+  ];
+
+  checkInputs = [
+    pytest
+  ] ++ lib.optionals isPy27 [ singledispatch ];
+
+  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..e67bbc59e932
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/vcrpy/default.nix
@@ -0,0 +1,48 @@
+{ buildPythonPackage
+, lib
+, six
+, fetchPypi
+, pyyaml
+, mock
+, contextlib2
+, wrapt
+, pytest
+, pytest-httpbin
+, yarl
+, pythonOlder
+, pythonAtLeast
+}:
+
+buildPythonPackage rec {
+  pname = "vcrpy";
+  version = "4.1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "57095bf22fc0a2d99ee9674cdafebed0f3ba763018582450706f7d3a74fff599";
+  };
+
+  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..a328cb104bc1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/vcver/default.nix
@@ -0,0 +1,31 @@
+{ lib, buildPythonPackage, fetchFromGitHub
+, packaging
+, fetchurl, python }:
+
+buildPythonPackage rec {
+  pname = "vcver";
+  version = "0.2.10";
+
+  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..7d73a6e812dd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/vcversioner/default.nix
@@ -0,0 +1,17 @@
+{ lib, stdenv, 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..9e4e92d21ae7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/vdf/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub
+, pytest, pytestcov, mock }:
+
+buildPythonPackage rec {
+  pname = "vdf";
+  version = "3.3";
+
+  src = fetchFromGitHub {
+    owner = "ValvePython";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0d9bhxdznry7kzyma00cxwjn6rqnd6vw8v5ym68k6qswgfzb569i";
+  };
+
+  checkInputs = [ pytest pytestcov mock ];
+  checkPhase = "make test";
+
+  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; [ metadark ];
+  };
+}
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..bda65ab49076
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/vdirsyncer/default.nix
@@ -0,0 +1,67 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, click
+, click-log
+, click-threading
+, requests_toolbelt
+, requests
+, requests_oauthlib # required for google oauth sync
+, atomicwrites
+, hypothesis
+, pytestCheckHook
+, pytest-localserver
+, pytest-subtesthack
+, setuptools_scm
+}:
+
+buildPythonPackage rec {
+  version = "0.16.8";
+  pname = "vdirsyncer";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "bfdb422f52e1d4d60bd0635d203fb59fa7f613397d079661eb48e79464ba13c5";
+  };
+
+  propagatedBuildInputs = [
+    click click-log click-threading
+    requests_toolbelt
+    requests
+    requests_oauthlib # required for google oauth sync
+    atomicwrites
+  ];
+
+  nativeBuildInputs = [
+    setuptools_scm
+  ];
+
+  checkInputs = [
+    hypothesis
+    pytestCheckHook
+    pytest-localserver
+    pytest-subtesthack
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py --replace "click>=5.0,<6.0" "click"
+  '';
+
+  preCheck = ''
+    export DETERMINISTIC_TESTS=true
+  '';
+
+  disabledTests = [
+    "test_verbosity"
+    "test_create_collections" # Flaky test exceeds deadline on hydra: https://github.com/pimutils/vdirsyncer/issues/837
+  ];
+
+  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..3a36d5de6064
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/vega/default.nix
@@ -0,0 +1,34 @@
+{ lib, stdenv, buildPythonPackage , fetchPypi, pythonOlder
+, pytest, jupyter_core, pandas, ipywidgets, jupyter, altair }:
+
+buildPythonPackage rec {
+  pname = "vega";
+  version = "3.4.0";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f343ceb11add58d24cd320d69e410b111a56c98c9069ebb4ef89c608c4c1950d";
+  };
+
+  buildInputs = [ pytest ];
+  propagatedBuildInputs = [ jupyter jupyter_core pandas ipywidgets ];
+
+  # currently, recommonmark is broken on python3
+  doCheck = false;
+  checkInputs = [ altair ];
+
+  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/venusian/default.nix b/nixpkgs/pkgs/development/python-modules/venusian/default.nix
new file mode 100644
index 000000000000..68d974aabec8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/venusian/default.nix
@@ -0,0 +1,31 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, pytest
+, pytestcov
+}:
+
+buildPythonPackage rec {
+  pname = "venusian";
+  version = "3.0.0";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f6842b7242b1039c0c28f6feef29016e7e7dd3caaeb476a193acf737db31ee38";
+  };
+
+  checkInputs = [ pytest pytestcov ];
+
+  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..99eb80530ef5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/verboselogs/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, fetchFromGitHub, pytest, mock }:
+
+buildPythonPackage rec {
+  pname = "verboselogs";
+  version = "1.7";
+
+  src = fetchFromGitHub {
+    owner = "xolox";
+    repo = "python-verboselogs";
+    rev = version;
+    sha256 = "10jzm8pkl49as4y2zyiidmfqqj5zmqg3p73jvx4lfxi0gmp1vhl5";
+  };
+
+  # do not run pylint plugin test, as astroid is a old unsupported version
+  checkPhase = ''
+    PATH=$PATH:$out/bin pytest . -k "not test_pylint_plugin"
+  '';
+  checkInputs = [ pytest mock ];
+
+  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..fa3329503a36
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/versioneer/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, isPy27 }:
+
+
+buildPythonPackage rec {
+  pname = "versioneer";
+  version = "0.19";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a4fed39bbebcbd2d07f8a86084773f303cb442709491955a0e6754858e47afae";
+  };
+
+  # Couldn't get tests to work because, for instance, they used virtualenv and
+  # pip.
+  doCheck = false;
+
+  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/versiontools/default.nix b/nixpkgs/pkgs/development/python-modules/versiontools/default.nix
new file mode 100644
index 000000000000..45b34d95301d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/versiontools/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv
+, 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..823d2820e1bd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/vertica-python/default.nix
@@ -0,0 +1,27 @@
+{ lib, buildPythonPackage, fetchPypi, future, dateutil, six, pytest, mock, parameterized }:
+
+buildPythonPackage rec {
+  pname = "vertica-python";
+  version = "1.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "94cff37e03f89fc4c5e4b2d4c913c7d5d7450f5a205d14f709b39e0a4202be95";
+  };
+
+  propagatedBuildInputs = [ future dateutil six ];
+
+  checkInputs = [ pytest mock parameterized ];
+
+  # Integration tests require an accessible Vertica db
+  checkPhase = ''
+    pytest --ignore vertica_python/tests/integration_tests
+  '';
+
+  meta = with lib; {
+    description = "Native Python client for Vertica database";
+    homepage = "https://github.com/vertica/vertica-python";
+    license = licenses.asl20;
+    maintainers = [ 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..f2c8cee451d3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/veryprettytable/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv
+, 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/vidstab/default.nix b/nixpkgs/pkgs/development/python-modules/vidstab/default.nix
new file mode 100644
index 000000000000..548105a01778
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/vidstab/default.nix
@@ -0,0 +1,33 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, numpy
+, pandas
+, imutils
+, progress
+, matplotlib
+, pytest
+}:
+
+buildPythonPackage rec {
+  version = "1.7.3";
+  pname = "vidstab";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "649a77a0c1b670d13a1bf411451945d7da439364dc0c33ee3636a23f1d82b456";
+  };
+
+  checkInputs = [ pytest ];
+  propagatedBuildInputs = [ numpy pandas imutils progress matplotlib ];
+
+  # tests not packaged with pypi
+  doCheck = false;
+
+  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/vine/default.nix b/nixpkgs/pkgs/development/python-modules/vine/default.nix
new file mode 100644
index 000000000000..048fa435e0be
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/vine/default.nix
@@ -0,0 +1,22 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi
+, case, pytest, pythonOlder }:
+
+buildPythonPackage rec {
+  pname = "vine";
+  version = "5.0.0";
+
+  disable = pythonOlder "2.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "7d3b1624a953da82ef63462013bbd271d3eb75751489f9807598e8f340bd637e";
+  };
+
+  buildInputs = [ case pytest ];
+
+  meta = with lib; {
+    description = "Python promises";
+    homepage = "https://github.com/celery/vine";
+    license = licenses.bsd3;
+  };
+}
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..072fd25c7f07
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/virtkey/default.nix
@@ -0,0 +1,25 @@
+{ 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; {
+    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..7559ae1ccca5
--- /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 = "2.0";
+
+  propagatedBuildInputs = [ EasyProcess ];
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "3cdacd70970a74d163a2417d8581f43a56bb1ac8d31c71a1a6a4348969062d65";
+  };
+
+  # 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..9b225021cf21
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/virtualenv-clone/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, pytest
+, virtualenv
+}:
+
+buildPythonPackage rec {
+  pname = "virtualenv-clone";
+  version = "0.5.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0absh96fsxk9di7ir76f5djyfm2c214wnyk53avrhjy8akflhpk6";
+  };
+
+  buildInputs = [ pytest ];
+  propagatedBuildInputs = [ virtualenv ];
+
+  # needs tox to run the tests
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/edwardgeorge/virtualenv-clone";
+    description = "Script to clone virtualenvs";
+    license = licenses.mit;
+  };
+
+}
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..233101728f85
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/virtualenv/default.nix
@@ -0,0 +1,56 @@
+{ buildPythonPackage
+, fetchPypi
+, lib
+, stdenv
+, pythonOlder
+, isPy27
+, appdirs
+, contextlib2
+, distlib
+, filelock
+, importlib-metadata
+, importlib-resources
+, pathlib2
+, setuptools_scm
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "virtualenv";
+  version = "20.2.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "e0aac7525e880a429764cefd3aaaff54afb5d9f25c82627563603f5d7de5a6e5";
+  };
+
+  nativeBuildInputs = [
+    setuptools_scm
+  ];
+
+  propagatedBuildInputs = [
+    appdirs
+    distlib
+    filelock
+    six
+  ] ++ lib.optionals isPy27 [
+    contextlib2
+  ] ++ lib.optionals (isPy27 && !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
+  ];
+
+  meta = {
+    description = "A tool to create isolated Python environments";
+    homepage = "http://www.virtualenv.org";
+    license = lib.licenses.mit;
+    maintainers = with lib.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..658f41126fc9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/virtualenvwrapper/default.nix
@@ -0,0 +1,75 @@
+{ lib, stdenv
+, 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..6dd32508befa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/vispy/default.nix
@@ -0,0 +1,40 @@
+{ lib, buildPythonPackage, substituteAll, stdenv,
+  fetchPypi, numpy, cython, freetype-py, fontconfig, libGL,
+  setuptools_scm, setuptools-scm-git-archive
+  }:
+
+buildPythonPackage rec {
+  pname = "vispy";
+  version = "0.6.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "6f3c4d00be9e6761c046d520a86693d78a0925d47eeb2fc095e95dac776f74ee";
+  };
+
+  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
+  ];
+
+  propagatedBuildInputs = [
+    numpy freetype-py fontconfig libGL
+  ];
+
+  doCheck = false;  # otherwise runs OSX code on linux.
+  pythonImportsCheck = [ "vispy" ];
+
+  meta = with lib; {
+    homepage = "http://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/vmprof/default.nix b/nixpkgs/pkgs/development/python-modules/vmprof/default.nix
new file mode 100644
index 000000000000..f8be722ef90f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/vmprof/default.nix
@@ -0,0 +1,32 @@
+{ lib, stdenv
+, 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" ];
+
+  meta = with lib; {
+    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..cb1b1677e1b5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/vncdo/default.nix
@@ -0,0 +1,38 @@
+{ lib, stdenv, 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..1bb87d9d1222
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/vobject/default.nix
@@ -0,0 +1,24 @@
+{ lib, buildPythonPackage, fetchPypi, isPyPy, python, dateutil }:
+
+buildPythonPackage rec {
+  version = "0.9.6.1";
+  pname = "vobject";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "96512aec74b90abb71f6b53898dd7fe47300cc940104c4f79148f0671f790101";
+  };
+
+  disabled = isPyPy;
+
+  propagatedBuildInputs = [ 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..fdd3e1923a39
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/volkszaehler/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, aiohttp
+, async-timeout
+}:
+
+buildPythonPackage rec {
+  pname = "volkszaehler";
+  version = "0.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "087gw1k3f81lm859r0j65cjia8c2dcy4cx8c7s3mb5msb1csdh0x";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    async-timeout
+  ];
+
+  # no tests are present
+  doCheck = false;
+
+  pythonImportsCheck = [ "volkszaehler" ];
+
+  meta = with lib; {
+    description = "Python Wrapper 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..4c31b5f758a4
--- /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.4.0";
+
+  disabled = !isPy3k;
+
+  src = fetchFromGitHub {
+    owner = "home-assistant-libs";
+    repo = pname;
+    rev = version;
+    sha256 = "1km2y1xaagkdvsy3bmi1sc040x5yyfdw6llmwdv9z8nz67m9v1ya";
+  };
+
+  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; [ etu ];
+  };
+}
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..63be8cd4bd05
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/voluptuous/default.nix
@@ -0,0 +1,22 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, nose }:
+
+buildPythonPackage rec {
+  pname = "voluptuous";
+  version = "0.12.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0js4avmhmmys78z376xk1w9305hq5nad8zqrnksgmpc1j90p4db6";
+  };
+
+  checkInputs = [ nose ];
+  checkPhase = ''
+    nosetests
+  '';
+
+  meta = with lib; {
+    description = "Voluptuous is a Python data validation library";
+    homepage = "http://alecthomas.github.io/voluptuous/";
+    license = licenses.bsd3;
+  };
+}
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..da13ad21026d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/vowpalwabbit/default.nix
@@ -0,0 +1,65 @@
+{ stdenv
+, lib
+, fetchPypi
+, buildPythonPackage
+, cmake
+, python
+, zlib
+, ncurses
+, pytest
+, docutils
+, pygments
+, numpy
+, scipy
+, scikitlearn }:
+
+buildPythonPackage rec {
+  pname = "vowpalwabbit";
+  version = "8.9.0";
+
+  src = fetchPypi{
+    inherit pname version;
+    sha256 = "37fb7a400f3a7923a04df9921b3eef1bbe96117424ef083dcfed0e4eea77fa08";
+  };
+
+  nativeBuildInputs = [
+    cmake
+  ];
+
+  buildInputs = [
+    docutils
+    ncurses
+    pygments
+    python.pkgs.boost
+    zlib.dev
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    scikitlearn
+    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/vsts-cd-manager/default.nix b/nixpkgs/pkgs/development/python-modules/vsts-cd-manager/default.nix
new file mode 100644
index 000000000000..5946fec05b75
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/vsts-cd-manager/default.nix
@@ -0,0 +1,28 @@
+{ lib, buildPythonPackage, fetchPypi, isPy27
+, 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..578578a21b17
--- /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.6.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1lsr0wl1dwbzpn68ww348yk6v42bw89nrghz5gjsimrr428zw6qn";
+  };
+
+  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/vultr/default.nix b/nixpkgs/pkgs/development/python-modules/vultr/default.nix
new file mode 100644
index 000000000000..d4349d310be2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/vultr/default.nix
@@ -0,0 +1,30 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, requests
+}:
+
+buildPythonPackage rec {
+  version = "0.1.2";
+  pname = "vultr";
+
+  src = fetchFromGitHub {
+      owner = "spry-group";
+      repo = "python-vultr";
+      rev = version;
+      sha256 = "1qjvvr2v9gfnwskdl0ayazpcmiyw9zlgnijnhgq9mcri5gq9jw5h";
+  };
+
+  propagatedBuildInputs = [ requests ];
+
+  # Tests disabled. They fail because they try to access the network
+  doCheck = false;
+
+  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..7ab5bcbb65bc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/vulture/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, coverage
+, fetchPypi
+, isPy27
+, pytest-cov
+, pytestCheckHook
+, toml
+}:
+
+buildPythonPackage rec {
+  pname = "vulture";
+  version = "2.3";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0ryrmsm72z3fzaanyblz49q40h9d3bbl4pspn2lvkkp9rcmsdm83";
+  };
+
+  propagatedBuildInputs = [ toml ];
+
+  checkInputs = [
+    coverage
+    pytest-cov
+    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..5d9531aa904d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/vxi11/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv, 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..ae404e01cfb9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/w3lib/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, six
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "w3lib";
+  version = "1.22.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1pv02lvvmgz2qb61vz1jkjc04fgm4hpfvaj5zm4i3mjp64hd1mha";
+  };
+
+  buildInputs = [ six pytest ];
+
+  meta = with lib; {
+    description = "A library of web-related functions";
+    homepage = "https://github.com/scrapy/w3lib";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ drewkett ];
+  };
+
+}
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..45b5a4734569
--- /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.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "e995691713d3c795d2b36278de8e212241870f46bec6ecba91794ea3cc5bd67d";
+  };
+
+  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..e76d1f110296
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/waitress-django/default.nix
@@ -0,0 +1,11 @@
+{ buildPythonPackage, django, waitress }:
+
+buildPythonPackage {
+  pname = "waitress-django";
+  version = "0.0.0";
+
+  src = ./.;
+  pythonPath = [ django waitress ];
+  doCheck = false;
+  meta.description = "A waitress WSGI server serving django";
+}
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..07f7b326fdaf
--- /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      = "0.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..09f4f66e0b52
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/waitress/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "waitress";
+  version = "1.4.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1bb436508a7487ac6cb097ae7a7fe5413aefca610550baf58f0940e51ecfb261";
+  };
+
+  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..29c30e7ba6ad
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wakeonlan/default.nix
@@ -0,0 +1,31 @@
+{ lib, stdenv, fetchPypi, buildPythonPackage, setuptools_scm, pytest, mock }:
+
+buildPythonPackage rec {
+  pname = "wakeonlan";
+  version = "1.1.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "5e6013a17004809e676c150689abd94bcc0f12a37ad3fbce1f6270968f95ffa9";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "setuptools-scm ~= 1.15.7" "setuptools-scm"
+  '';
+
+  checkInputs = [ pytest mock ];
+
+  nativeBuildInputs = [ setuptools_scm ];
+
+  checkPhase = ''
+    py.test
+  '';
+
+  meta = with lib; {
+    description = "A small python module for wake on lan";
+    homepage = "https://github.com/remcohaszing/pywakeonlan";
+    license = licenses.wtfpl;
+    maintainers = with maintainers; [ peterhoeg ];
+  };
+}
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/warlock/default.nix b/nixpkgs/pkgs/development/python-modules/warlock/default.nix
new file mode 100644
index 000000000000..80dcabdcb207
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/warlock/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, six
+, jsonpatch
+, jsonschema
+, jsonpointer
+}:
+
+buildPythonPackage rec {
+  pname = "warlock";
+  version = "1.3.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a093c4d04b42b7907f69086e476a766b7639dca50d95edc83aef6aeab9db2090";
+  };
+
+  propagatedBuildInputs = [ six jsonpatch jsonschema jsonpointer ];
+
+  meta = with lib; {
+    homepage = "https://github.com/bcwaldon/warlock";
+    description = "Python object model built on JSON schema and JSON patch";
+    license = licenses.asl20;
+  };
+
+}
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..a4bbee43d012
--- /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..5a0c2ecaa5f5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wasabi/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "wasabi";
+  version = "0.8.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "75fec6db6193c8615d7f398ae4aa2c4ad294e6e3e81c6a6dbbbd3864ee2223c3";
+  };
+
+  checkInputs = [ pytestCheckHook ];
+
+  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; [ danieldk ];
+  };
+}
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..f6c2cc42e387
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wasm/default.nix
@@ -0,0 +1,27 @@
+{ buildPythonPackage
+, fetchPypi
+, lib
+}:
+
+buildPythonPackage rec {
+  pname = "wasm";
+  version = "1.2";
+
+  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..62c8a2a06b71
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wasmer/default.nix
@@ -0,0 +1,71 @@
+{ lib
+, rustPlatform
+, fetchFromGitHub
+, maturin
+, buildPythonPackage
+, isPy38
+, python
+}:
+let
+  pname = "wasmer";
+  version = "1.0.0";
+
+  wheel = rustPlatform.buildRustPackage rec {
+    inherit pname version;
+
+    src = fetchFromGitHub {
+      owner = "wasmerio";
+      repo = "wasmer-python";
+      rev = version;
+      hash = "sha256-I1GfjLaPYMIHKh2m/5IQepUsJNiVUEJg49wyuuzUYtY=";
+    };
+
+    cargoHash = "sha256-txOOia1C4W+nsXuXp4EytEn82CFfSmiOYwRLC4WPImc=";
+
+    nativeBuildInputs = [ maturin python ];
+
+    preBuild = ''
+      cd packages/api
+    '';
+
+    buildPhase = ''
+      runHook preBuild
+      maturin build --release --manylinux off --strip
+      runHook postBuild
+    '';
+
+    postBuild = ''
+      cd ../..
+    '';
+
+    doCheck = false;
+
+    installPhase = ''
+      runHook preInstall
+      install -Dm644 -t $out target/wheels/*.whl
+      runHook postInstall
+    '';
+  };
+
+in
+buildPythonPackage rec {
+  inherit pname version;
+
+  format = "wheel";
+  src = wheel;
+
+  unpackPhase = ''
+    mkdir -p dist
+    cp $src/*.whl dist
+  '';
+
+  pythonImportsCheck = [ "wasmer" ];
+
+  meta = with lib; {
+    description = "Python extension to run WebAssembly binaries";
+    homepage = "https://github.com/wasmerio/wasmer-python";
+    license = licenses.mit;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
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..5cb8929b9dbe
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/watchdog/default.nix
@@ -0,0 +1,32 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, argh
+, pathtools
+, pyyaml
+, pkgs
+}:
+
+buildPythonPackage rec {
+  pname = "watchdog";
+  version = "0.10.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "e38bffc89b15bafe2a131f0e1c74924cf07dcec020c2e0a26cccd208831fcd43";
+  };
+
+  buildInputs = lib.optionals stdenv.isDarwin
+    [ pkgs.darwin.apple_sdk.frameworks.CoreServices ];
+  propagatedBuildInputs = [ argh pathtools pyyaml ];
+
+  doCheck = false;
+
+  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/waterfurnace/default.nix b/nixpkgs/pkgs/development/python-modules/waterfurnace/default.nix
new file mode 100644
index 000000000000..a07c1e6333e8
--- /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/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..a7188a3103f4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/weasyprint/default.nix
@@ -0,0 +1,71 @@
+{ buildPythonPackage,
+  fetchPypi,
+  cairosvg,
+  pyphen,
+  cffi,
+  cssselect,
+  lxml,
+  html5lib,
+  tinycss,
+  pygobject2,
+  glib,
+  pango,
+  fontconfig,
+  lib, stdenv,
+  pytest,
+  pytestrunner,
+  pytest-isort,
+  pytest-flake8,
+  pytestcov,
+  isPy3k,
+  substituteAll
+}:
+
+buildPythonPackage rec {
+  pname = "weasyprint";
+  version = "52";
+  disabled = !isPy3k;
+
+  # excluded test needs the Ahem font
+  checkPhase = ''
+    runHook preCheck
+    pytest -k 'not test_font_stretch'
+    runHook postCheck
+  '';
+
+  # ignore failing flake8-test
+  prePatch = ''
+    substituteInPlace setup.cfg \
+        --replace '[tool:pytest]' '[tool:pytest]\nflake8-ignore = E501'
+  '';
+
+  checkInputs = [ pytest pytestrunner pytest-isort pytest-flake8 pytestcov ];
+
+  FONTCONFIG_FILE = "${fontconfig.out}/etc/fonts/fonts.conf";
+
+  propagatedBuildInputs = [ cairosvg pyphen cffi cssselect lxml html5lib tinycss pygobject2 ];
+
+  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}";
+    })
+  ];
+
+  src = fetchPypi {
+    inherit version;
+    pname = "WeasyPrint";
+    sha256 = "0rwf43111ws74m8b1alkkxzz57g0np3vmd8as74adwnxslfcg4gs";
+  };
+
+  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..c6eb87c94585
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/weasyprint/library-paths.patch
@@ -0,0 +1,38 @@
+diff --git a/weasyprint/fonts.py b/weasyprint/fonts.py
+index 79e3b5b..4438eb4 100644
+--- a/weasyprint/fonts.py
++++ b/weasyprint/fonts.py
+@@ -45,11 +45,8 @@ else:
+     # with OSError: dlopen() failed to load a library: cairo / cairo-2
+     # So let's hope we find the same file as cairo already did ;)
+     # Same applies to pangocairo requiring pangoft2
+-    fontconfig = dlopen(ffi, 'fontconfig', 'libfontconfig',
+-                        'libfontconfig-1.dll',
+-                        'libfontconfig.so.1', 'libfontconfig-1.dylib')
+-    pangoft2 = dlopen(ffi, 'pangoft2-1.0', 'libpangoft2-1.0-0',
+-                      'libpangoft2-1.0.so.0', 'libpangoft2-1.0.dylib')
++    fontconfig = dlopen(ffi, '@fontconfig@')
++    pangoft2 = dlopen(ffi, '@pangoft2@')
+ 
+     ffi.cdef('''
+         // FontConfig
+diff --git a/weasyprint/text.py b/weasyprint/text.py
+index 1dc5e4d..b070bad 100644
+--- a/weasyprint/text.py
++++ b/weasyprint/text.py
+@@ -255,12 +255,9 @@ def dlopen(ffi, *names):
+     return ffi.dlopen(names[0])  # pragma: no cover
+ 
+ 
+-gobject = dlopen(ffi, 'gobject-2.0', 'libgobject-2.0-0', 'libgobject-2.0.so.0',
+-                 'libgobject-2.0.dylib')
+-pango = dlopen(ffi, 'pango-1.0', 'libpango-1.0-0', 'libpango-1.0.so.0',
+-               'libpango-1.0.dylib')
+-pangocairo = dlopen(ffi, 'pangocairo-1.0', 'libpangocairo-1.0-0',
+-                    'libpangocairo-1.0.so.0', 'libpangocairo-1.0.dylib')
++gobject = dlopen(ffi, '@gobject@')
++pango = dlopen(ffi, '@pango@')
++pangocairo = dlopen(ffi, '@pangocairo@')
+ 
+ gobject.g_type_init()
+ 
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..84b4cc8dcfbb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/web/default.nix
@@ -0,0 +1,35 @@
+{ lib, stdenv, 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/webapp2/default.nix b/nixpkgs/pkgs/development/python-modules/webapp2/default.nix
new file mode 100644
index 000000000000..048c5d91b1d2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/webapp2/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, webob
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "webapp2";
+  version = "2.5.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "997db622a266bd64eb7fcc9cfe823efb69277544aa92064030c16acbfb2733a5";
+  };
+
+  # # error in tests when running with python 3+
+  doCheck = false;
+
+  propagatedBuildInputs = [ webob six ];
+
+  meta = with lib; {
+    description = "Taking Google App Engine's webapp to the next level";
+    homepage = "http://webapp-improved.appspot.com";
+    license = licenses.asl20;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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/webcolors/default.nix b/nixpkgs/pkgs/development/python-modules/webcolors/default.nix
new file mode 100644
index 000000000000..273cd7ac5d18
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/webcolors/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, python
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "webcolors";
+  version = "1.11.1";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "76f360636957d1c976db7466bc71dcb713bb95ac8911944dffc55c01cb516de6";
+  };
+
+  propagatedBuildInputs = [ six ];
+
+  checkPhase = ''
+    ${python.interpreter} -m unittest discover -s tests
+  '';
+
+  meta = {
+    description = "Library for working with color names/values defined by the HTML and CSS specifications";
+    homepage = "https://bitbucket.org/ubernostrum/webcolors/overview/";
+    license = lib.licenses.bsd3;
+  };
+}
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..eb13cd6b9bbf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/webdavclient3/default.nix
@@ -0,0 +1,30 @@
+{ buildPythonPackage, fetchPypi, isPy27, lib, dateutil, lxml, requests
+, pytestCheckHook }:
+
+buildPythonPackage rec {
+  pname = "webdavclient3";
+  version = "3.14.5";
+
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0yw3n5m70ysjn1ch48znpn4zr4a1bd0lsm7q2grqz7q5hfjzjwk0";
+  };
+
+  propagatedBuildInputs = [ 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/webhelpers/default.nix b/nixpkgs/pkgs/development/python-modules/webhelpers/default.nix
new file mode 100644
index 000000000000..040341ed376a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/webhelpers/default.nix
@@ -0,0 +1,31 @@
+{ lib, stdenv
+, 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..78ca8f918a3f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/webob/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, nose
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "WebOb";
+  version = "1.8.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "aa3a917ed752ba3e0b242234b2a373f9c4e2a75d35291dcbe977649bd21fd108";
+  };
+
+  propagatedBuildInputs = [ nose pytest ];
+
+  meta = with lib; {
+    description = "WSGI request and response object";
+    homepage = "http://pythonpaste.org/webob/";
+    license = licenses.mit;
+  };
+
+}
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..7c3d25068e30
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/weboob/default.nix
@@ -0,0 +1,84 @@
+{ lib, buildPythonPackage, fetchPypi, isPy27
+, Babel
+, cssselect
+, dateutil
+, feedparser
+, futures
+, gdata
+, gnupg
+, google_api_python_client
+, html2text
+, libyaml
+, lxml
+, mechanize
+, nose
+, pdfminer
+, pillow
+, prettytable
+, pyqt5
+, pyyaml
+, requests
+, simplejson
+, termcolor
+, unidecode
+}:
+
+buildPythonPackage rec {
+  pname = "weboob";
+  version = "2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1c69vzf8sg8471lcaafpz9iw2q3rfj5hmcpqrs2k59fkgbvy32zw";
+  };
+
+  postPatch = ''
+    # Disable doctests that require networking:
+    sed -i -n -e '/^ *def \+pagination *(.*: *$/ {
+      p; n; p; /"""\|'\'\'\'''/!b
+
+      :loop
+      n; /^ *\(>>>\|\.\.\.\)/ { h; bloop }
+      x; /^ *\(>>>\|\.\.\.\)/bloop; x
+      p; /"""\|'\'\'\'''/b
+      bloop
+    }; p' weboob/browser/browsers.py weboob/browser/pages.py
+  '';
+
+  checkInputs = [ nose ];
+
+  nativeBuildInputs = [ pyqt5 ];
+
+  propagatedBuildInputs = [
+    Babel
+    cssselect
+    dateutil
+    feedparser
+    gdata
+    gnupg
+    google_api_python_client
+    html2text
+    libyaml
+    lxml
+    mechanize
+    pdfminer
+    pillow
+    prettytable
+    pyqt5
+    pyyaml
+    requests
+    simplejson
+    termcolor
+    unidecode
+  ] ++ lib.optionals isPy27 [ futures ];
+
+  checkPhase = ''
+    nosetests
+  '';
+
+  meta = {
+    homepage = "http://weboob.org";
+    description = "Collection of applications and APIs to interact with websites without requiring the user to open a browser";
+    license = lib.licenses.agpl3;
+  };
+}
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..dacae3e81e1f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/websocket_client/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, fetchPypi, isPy27
+, six
+, backports_ssl_match_hostname
+}:
+
+buildPythonPackage rec {
+  version = "0.57.0";
+  pname = "websocket_client";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d735b91d6d1692a6a181f2a8c9e0238e5f6373356f561bb9dc4c7af36f452010";
+  };
+
+  propagatedBuildInputs = [
+    six
+  ] ++ lib.optional isPy27 backports_ssl_match_hostname;
+
+  meta = with lib; {
+    description = "Websocket client for python";
+    homepage = "https://github.com/websocket-client/websocket-client";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
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..eeb12bd5b75b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/websockets/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, pythonOlder
+, pytest
+, stdenv
+}:
+
+buildPythonPackage rec {
+  pname = "websockets";
+  version = "8.1";
+
+  src = fetchFromGitHub {
+    owner = "aaugustin";
+    repo = pname;
+    rev = version;
+    sha256 = "05jbqcbjg50ydwl0fijhdlqcq7fl6v99kjva66kmmzzza7vwa872";
+  };
+
+  disabled = pythonOlder "3.3";
+
+  # Tests fail on Darwin with `OSError: AF_UNIX path too long`
+  doCheck = !stdenv.isDarwin;
+
+  # Disable all tests that need to terminate within a predetermined amount of
+  # time.  This is nondeterministic.
+  patchPhase = ''
+    sed -i 's/with self.assertCompletesWithin.*:/if True:/' \
+      tests/test_protocol.py
+  '';
+
+  meta = with lib; {
+    description = "WebSocket implementation in Python 3";
+    homepage = "https://github.com/aaugustin/websockets";
+    license = licenses.bsd3;
+  };
+}
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..021344b2207a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/websockify/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, numpy
+}:
+
+buildPythonPackage rec {
+  version = "0.9.0";
+  pname = "websockify";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1nnalv0jkkj34hw6yb12lp6r6fj1ps9vkkyshjvx65y5xdwmnny3";
+  };
+
+  propagatedBuildInputs = [ numpy ];
+
+  meta = with lib; {
+    description = "WebSockets support for any application/server";
+    homepage = "https://github.com/kanaka/websockify";
+    license = licenses.lgpl3;
+  };
+
+}
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..98ee58d3f6c4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/webtest/default.nix
@@ -0,0 +1,44 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, nose
+, webob
+, six
+, beautifulsoup4
+, waitress
+, mock
+, pyquery
+, wsgiproxy2
+, PasteDeploy
+}:
+
+buildPythonPackage rec {
+  version = "2.0.32";
+  pname = "webtest";
+  disabled = isPy27; # paste.deploy is not longer a valid import
+
+  src = fetchPypi {
+    pname = "WebTest";
+    inherit version;
+    sha256 = "4221020d502ff414c5fba83c1213985b83219cb1cc611fe58aa4feaf96b5e062";
+  };
+
+  preConfigure = ''
+    substituteInPlace setup.py --replace "nose<1.3.0" "nose"
+  '';
+
+  propagatedBuildInputs = [ webob six beautifulsoup4 waitress ];
+
+  checkInputs = [ nose mock PasteDeploy wsgiproxy2 pyquery ];
+
+  # Some of the tests use localhost networking.
+  __darwinAllowLocalNetworking = true;
+
+  meta = with lib; {
+    description = "Helper to test WSGI applications";
+    homepage = "https://webtest.readthedocs.org/en/latest/";
+    license = licenses.mit;
+  };
+
+}
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..92e4ea5a8fb5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/webthing/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, ifaddr
+, jsonschema
+, pyee
+, tornado
+, zeroconf
+}:
+
+buildPythonPackage rec {
+  pname = "webthing";
+  version = "0.15.0";
+
+  src = fetchFromGitHub {
+    owner = "WebThingsIO";
+    repo = "webthing-python";
+    rev = "v${version}";
+    sha256 = "06264rwchy4qmbn7lv7m00qg864y7aw3rngcqqcr9nvaqz4rb0fg";
+  };
+
+  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/werkzeug/default.nix b/nixpkgs/pkgs/development/python-modules/werkzeug/default.nix
new file mode 100644
index 000000000000..7f35dd124d86
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/werkzeug/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi
+, itsdangerous, hypothesis
+, pytestCheckHook, requests
+, pytest-timeout
+, isPy3k
+ }:
+
+buildPythonPackage rec {
+  pname = "Werkzeug";
+  version = "1.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "6c80b1e5ad3665290ea39320b91e1be1e0d5f60652b964a3070216de83d2e47c";
+  };
+
+  propagatedBuildInputs = [ itsdangerous ];
+  checkInputs = [ pytestCheckHook requests hypothesis pytest-timeout ];
+
+  disabledTests = lib.optionals stdenv.isDarwin [
+    "test_get_machine_id"
+  ];
+
+  meta = with lib; {
+    homepage = "https://palletsprojects.com/p/werkzeug/";
+    description = "A WSGI utility library for Python";
+    license = licenses.bsd3;
+  };
+}
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..8958f37b0f85
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/west/default.nix
@@ -0,0 +1,53 @@
+{ lib, fetchPypi, buildPythonPackage, isPy3k
+, colorama, configobj, packaging, pyyaml, pykwalify
+}:
+
+buildPythonPackage rec {
+  version = "0.8.0";
+  pname = "west";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "672053c3392248846694e5619a7fe6ab4c40f010a8f5be6350821b39f6132a26";
+  };
+
+  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; {
+    homepage = "https://github.com/zephyrproject-rtos/west";
+    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).
+    '';
+    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..f42df0054952
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wfuzz/default.nix
@@ -0,0 +1,69 @@
+{ buildPythonPackage
+, chardet
+, colorama
+, configparser
+, fetchFromGitHub
+, future
+, isPy27
+, lib
+, mock
+, netaddr
+, pkgs
+, pycurl
+, pyparsing
+, pytest
+, pytestCheckHook
+, setuptools
+, six
+, stdenv
+}:
+
+buildPythonPackage rec {
+  pname = "wfuzz";
+  version = "3.1.0";
+
+  src = fetchFromGitHub {
+    owner = "xmendez";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1izasczm2zwknwzxbfzqhlf4zp02jvb54ha1hfk4rlwiz0rr1kj4";
+  };
+
+  propagatedBuildInputs = [
+    chardet
+    pycurl
+    six
+    setuptools
+    pyparsing
+  ] ++ lib.optionals isPy27 [
+    mock
+    future
+  ] ++ lib.optionals stdenv.hostPlatform.isWindows [
+    colorama
+  ];
+
+  checkInputs = [
+    netaddr
+    pytest
+    pytestCheckHook
+  ] ++ lib.optionals isPy27 [
+    mock
+  ];
+
+  preCheck = "export HOME=$(mktemp -d)";
+  # The skipped tests are requiring a local web server
+  pytestFlagsArray = [ "tests/test_{moduleman,filterintro,reqresp,api,clparser}.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/wheel/default.nix b/nixpkgs/pkgs/development/python-modules/wheel/default.nix
new file mode 100644
index 000000000000..4f51fb486ebc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wheel/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, bootstrapped-pip
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "wheel";
+  version = "0.35.1";
+  format = "other";
+
+  src = fetchFromGitHub {
+    owner = "pypa";
+    repo = pname;
+    rev = version;
+    sha256 = "uS+9a47ZopI0yGlEnJi421WyzS//8BxUvH25hX4BBL8=";
+    name = "${pname}-${version}-source";
+  };
+
+  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://bitbucket.org/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/whisper/default.nix b/nixpkgs/pkgs/development/python-modules/whisper/default.nix
new file mode 100644
index 000000000000..ad25df4868a4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/whisper/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, mock, six }:
+
+buildPythonPackage rec {
+  pname = "whisper";
+  version = "1.1.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "08biw3g6x6p2aa1nlvfazbgcs1xvf6m0hvskdjhgwnsbwxk1xq46";
+  };
+
+  propagatedBuildInputs = [ six ];
+  checkInputs = [ mock ];
+
+  meta = with lib; {
+    homepage = "http://graphite.wikidot.com/";
+    description = "Fixed size round-robin style database";
+    maintainers = with maintainers; [ offline basvandijk ];
+    license = licenses.asl20;
+  };
+}
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..2399c6ed73f2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/whitenoise/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv, fetchPypi, buildPythonPackage, isPy27 }:
+
+buildPythonPackage rec {
+  pname = "whitenoise";
+  version = "5.2.0";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "05ce0be39ad85740a78750c86a93485c40f08ad8c62a6006de0233765996e5c7";
+  };
+
+  # No tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Radically simplified static file serving for WSGI applications";
+    homepage = "http://whitenoise.evans.io/";
+    license = licenses.mit;
+  };
+}
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..759bc0cd8ee9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/whois/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, inetutils
+}:
+
+buildPythonPackage rec {
+  pname = "whois";
+  version = "0.9.7";
+
+  src = fetchFromGitHub {
+    owner = "DannyCork";
+    repo = "python-whois";
+    rev = version;
+    sha256 = "1rbc4xif4dn455vc8dhxdvwszrb0nik5q9fy12db6mxfx6zikb7z";
+  };
+
+  # whois is needed
+  propagatedBuildInputs = [ 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..f5bbccec2a5e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/whoosh/default.nix
@@ -0,0 +1,30 @@
+{ lib, stdenv, 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; [ nand0p ];
+  };
+}
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..bb8f1ab3b4d5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/widgetsnbextension/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, notebook
+, ipywidgets
+}:
+
+buildPythonPackage rec {
+  pname = "widgetsnbextension";
+  version = "3.5.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "079f87d87270bce047512400efd70238820751a11d2d8cb137a5a5bdbaf255c7";
+  };
+
+  propagatedBuildInputs = [ notebook ];
+
+  # 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/willow/default.nix b/nixpkgs/pkgs/development/python-modules/willow/default.nix
new file mode 100644
index 000000000000..fbf4965117b3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/willow/default.nix
@@ -0,0 +1,33 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, six
+, pillow
+}:
+
+buildPythonPackage rec {
+  pname = "willow";
+  version = "1.4";
+  disabled = pythonOlder "2.7";
+
+  src = fetchPypi {
+    pname = "Willow";
+    inherit version;
+    sha256 = "0b3lh7z98nlh4yn0cmvk7bimhfk5w4qvbmjr6jn880ji9h2ixq6d";
+  };
+
+  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..c08c5541a61a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/winacl/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "winacl";
+  version = "0.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "05xhdhbvzs1hcd8lxmdr9mpr6ifx5flhlvk6jr0qi6h25imhqclp";
+  };
+
+  # 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..02156ba17e50
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/winsspi/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, minikerberos
+, pythonAtLeast
+}:
+
+buildPythonPackage rec {
+  pname = "winsspi";
+  version = "0.0.9";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1q8hr8l8d9jxyp55qsrlkyhdhqjc0n18ajzms7hf1xkhdl7rrbd2";
+  };
+  propagatedBuildInputs = [ minikerberos ];
+
+  # Project 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/wled/default.nix b/nixpkgs/pkgs/development/python-modules/wled/default.nix
new file mode 100644
index 000000000000..92dbc210c6de
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wled/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, aiohttp
+, backoff
+, packaging
+, yarl
+, aresponses
+, pytest-asyncio
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "wled";
+  version = "0.4.4";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "frenck";
+    repo = "python-wled";
+    rev = "v${version}";
+    sha256 = "1adh23v4c9kia3ddqdq0brksd5rhgh4ff7l5hil8klx4dmkrjfz3";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    backoff
+    packaging
+    yarl
+  ];
+
+  checkInputs = [
+    aresponses
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  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/word2vec/default.nix b/nixpkgs/pkgs/development/python-modules/word2vec/default.nix
new file mode 100644
index 000000000000..647914bfbe5f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/word2vec/default.nix
@@ -0,0 +1,53 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, fetchzip
+, cython
+, numpy
+, scikitlearn
+, six
+, setuptools_scm
+, gcc
+, pytest
+, pytestcov
+, 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 scikitlearn six ];
+
+  checkInputs = [ pytest pytestcov ];
+
+  # 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; {
+    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..b4dd108ae739
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wordcloud/default.nix
@@ -0,0 +1,48 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub
+, matplotlib
+, mock
+, numpy
+, pillow
+, cython
+, pytestcov
+, pytest
+, fetchpatch
+}:
+
+buildPythonPackage rec {
+  pname = "word_cloud";
+  version = "1.8.1";
+
+  # tests are not included in pypi tarball
+  src = fetchFromGitHub {
+    owner = "amueller";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-4EFQfv+Jn9EngUAyDoJP0yv9zr9Tnbrdwq1YzDacB9Q=";
+  };
+
+  nativeBuildInputs = [ cython ];
+  propagatedBuildInputs = [ matplotlib numpy pillow ];
+
+  # Tests require extra dependencies
+  checkInputs = [ mock pytest pytestcov ];
+
+  checkPhase = ''
+    PATH=$out/bin:$PATH pytest test
+  '';
+
+  patches = [
+    (fetchpatch {
+      # https://github.com/amueller/word_cloud/pull/616
+      url = "https://github.com/amueller/word_cloud/commit/858a8ac4b5b08494c1d25d9e0b35dd995151a1e5.patch";
+      sha256 = "sha256-+aDTMPtOibVwjPrRLxel0y4JFD5ERB2bmJi4zRf/asg=";
+    })
+  ];
+
+  meta = with lib; {
+    description = "A little 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..d687ffd2d0b9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wordfreq/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, regex
+, langcodes
+, ftfy
+, msgpack
+, mecab-python3
+, jieba
+, pytest
+, pythonOlder
+, fetchFromGitHub
+}:
+
+buildPythonPackage rec {
+  pname = "wordfreq";
+  version = "2.3.2";
+  disabled = pythonOlder "3";
+
+   src = fetchFromGitHub {
+    owner = "LuminosoInsight";
+    repo = "wordfreq";
+    # upstream don't tag by version
+    rev = "v${version}";
+    sha256 = "078657iiksrqzcc2wvwhiilf3xxq5vlinsv0kz03qzqr1qyvbmas";
+   };
+
+  propagatedBuildInputs = [ regex langcodes ftfy msgpack mecab-python3 jieba ];
+
+  # patch to relax version requirements for regex
+  # dependency to prevent break in upgrade
+  postPatch = ''
+    substituteInPlace setup.py --replace "regex ==" "regex >="
+  '';
+
+  checkInputs = [ pytest ];
+
+  checkPhase = ''
+    # These languages require additional dictionaries
+    pytest tests -k 'not test_japanese and not test_korean and not test_languages and not test_french_and_related'
+  '';
+
+  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..51c0de77917d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/worldengine/default.nix
@@ -0,0 +1,64 @@
+{ lib, stdenv
+, buildPythonPackage
+, pythonOlder
+, 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/wptserve/default.nix b/nixpkgs/pkgs/development/python-modules/wptserve/default.nix
new file mode 100644
index 000000000000..7caf36fa6b2b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wptserve/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, six, h2
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "wptserve";
+  version = "3.0";
+
+  disabled = isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "11990a92b07e4535c2723c34a88bd905c66acec9cda6efa7a7b61371bfe8d87a";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py --replace "h2==" "h2>="
+  '';
+
+  propagatedBuildInputs = [ six h2 ];
+
+  meta = {
+    description = "A webserver intended for web browser testing";
+    homepage =  "https://wptserve.readthedocs.org/";
+    license = lib.licenses.bsd3;
+    maintainers = with lib.maintainers; [ raskin ];
+  };
+}
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..757585bd1455
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wrapio/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "wrapio";
+  version = "0.3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-jGupLh+xzwil+VBtAjIG+ZYT+dy+QaZOTIfipTQeyWo";
+  };
+
+  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..0d5376e10047
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wrapt/default.nix
@@ -0,0 +1,23 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "wrapt";
+  version = "1.12.1";
+
+  # No tests in archive
+  doCheck = false;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b62ffa81fb85f4332a4f609cab4ac40709470da05643a082ec1eb88e6d9b97d7";
+  };
+
+  meta = {
+    description = "Module for decorators, wrappers and monkey patching";
+    license = lib.licenses.bsd2;
+    homepage = "https://github.com/GrahamDumpleton/wrapt";
+  };
+}
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..29279cc1a448
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wrf-python/default.nix
@@ -0,0 +1,43 @@
+{lib, fetchFromGitHub, pythonOlder, buildPythonPackage, gfortran, mock, xarray, wrapt, numpy, netcdf4, setuptools}:
+
+buildPythonPackage rec {
+  pname = "wrf-python";
+  version = "1.3.2";
+
+  src = fetchFromGitHub {
+    owner = "NCAR";
+    repo = "wrf-python";
+    rev = version;
+    sha256 = "1rklkki54z5392cpwwy78bnmsy2ghc187l3j7nv0rzn6jk5bvyi7";
+  };
+
+  propagatedBuildInputs = [
+    wrapt
+    numpy
+    setuptools
+    xarray
+  ];
+
+  nativeBuildInputs = [
+    gfortran
+  ];
+
+  checkInputs = [
+    netcdf4
+  ] ++ lib.optional (pythonOlder "3.3") mock;
+
+  doCheck = true;
+  checkPhase = ''
+    runHook preCheck
+    cd ./test/ci_tests
+    python utests.py
+    runHook postCheck
+  '';
+
+  meta = {
+    description = "WRF postprocessing library for Python";
+    homepage = "http://wrf-python.rtfd.org";
+    license = lib.licenses.asl20;
+    maintainers = with lib.maintainers; [ mhaselsteiner ];
+  };
+}
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..2b7a66df285c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ws4py/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv, 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/wsgiproxy/default.nix b/nixpkgs/pkgs/development/python-modules/wsgiproxy/default.nix
new file mode 100644
index 000000000000..12aa3c88d968
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wsgiproxy/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, paste
+, six
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "WSGIProxy";
+  version = "0.2.2";
+  disabled = isPy3k; # Judging from SyntaxError
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0wqz1q8cvb81a37gb4kkxxpv4w7k8192a08qzyz67rn68ln2wcig";
+  };
+
+  propagatedBuildInputs = [ paste six ];
+
+  meta = with lib; {
+    description = "WSGIProxy gives tools to proxy arbitrary(ish) WSGI requests to other";
+    homepage = "http://pythonpaste.org/wsgiproxy/";
+    license = licenses.mit;
+  };
+
+}
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..81a2f98b86f8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wsgiproxy2/default.nix
@@ -0,0 +1,30 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, six
+, webob
+}:
+
+buildPythonPackage rec {
+  pname = "WSGIProxy2";
+  version = "0.4.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "13kf9bdxrc95y9vriaz0viry3ah11nz4rlrykcfvb8nlqpx3dcm4";
+  };
+
+  propagatedBuildInputs = [ six webob ];
+
+  # circular dep on webtest
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "http://pythonpaste.org/wsgiproxy/";
+    description = "HTTP proxying tools for WSGI apps";
+    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/0.14.nix b/nixpkgs/pkgs/development/python-modules/wsproto/0.14.nix
new file mode 100644
index 000000000000..a8488d8c4ab8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wsproto/0.14.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, fetchPypi, h11, enum34, pytest }:
+
+buildPythonPackage rec {
+  pname = "wsproto";
+  version = "0.14.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "051s127qb5dladxa14n9nqajwq7xki1dz1was5r5v9df5a0jq8pd";
+  };
+
+  propagatedBuildInputs = [ h11 enum34 ];
+
+  checkInputs = [ pytest ];
+
+  checkPhase = ''
+    py.test
+  '';
+
+  meta = with lib; {
+    description = "Pure Python, pure state-machine WebSocket implementation";
+    homepage = "https://github.com/python-hyper/wsproto/";
+    license = licenses.mit;
+  };
+}
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..d4dd7d089997
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wsproto/default.nix
@@ -0,0 +1,30 @@
+{ lib, buildPythonPackage, fetchPypi, pythonOlder, isPy36
+, dataclasses
+, h11
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "wsproto";
+  version = "1.0.0";
+  disabled = pythonOlder "3.6"; # python versions <3.6
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "868776f8456997ad0d9720f7322b746bbe9193751b5b290b7f924659377c8c38";
+  };
+
+  propagatedBuildInputs = [ h11 ] ++ lib.optional isPy36 dataclasses;
+
+  checkInputs = [ pytest ];
+
+  checkPhase = ''
+    py.test
+  '';
+
+  meta = with lib; {
+    description = "Pure Python, pure state-machine WebSocket implementation";
+    homepage = "https://github.com/python-hyper/wsproto/";
+    license = licenses.mit;
+  };
+}
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..69db4e50f675
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wtf-peewee/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, peewee
+, wtforms
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "wtf-peewee";
+  version = "3.0.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "03qs6np5s9r0nmsryfzll29ajcqk27b18kcbgd9plf80ys3nb6kd";
+  };
+
+  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..45c465ddcba7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wtforms/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, markupsafe
+}:
+
+buildPythonPackage rec {
+  version = "2.3.3";
+  pname = "WTForms";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "81195de0ac94fbc8368abbaf9197b88c4f3ffd6c2719b5bf5fc9da744f3d829c";
+  };
+
+  propagatedBuildInputs = [ markupsafe ];
+
+  # Django tests are broken "django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet."
+  doCheck = false;
+
+  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..e6897830fb7b
--- /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 = "2.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0hvmbc41kdwrjns8z1s4a59a4azdvzb8q3vs7nn1li4qm4l0g3yh";
+  };
+
+  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/3.0.nix b/nixpkgs/pkgs/development/python-modules/wxPython/3.0.nix
new file mode 100644
index 000000000000..6649c5f69315
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wxPython/3.0.nix
@@ -0,0 +1,91 @@
+{ fetchurl
+, lib
+, stdenv
+, darwin
+, openglSupport ? true
+, libX11
+, wxGTK
+, wxmac
+, pkg-config
+, buildPythonPackage
+, pyopengl
+, isPy3k
+, isPyPy
+, python
+, cairo
+, pango
+}:
+
+assert wxGTK.unicode;
+
+buildPythonPackage rec {
+  pname = "wxPython";
+  version = "3.0.2.0";
+
+  disabled = isPy3k || isPyPy;
+  doCheck = false;
+
+  src = fetchurl {
+    url = "mirror://sourceforge/wxpython/wxPython-src-${version}.tar.bz2";
+    sha256 = "0qfzx3sqx4mwxv99sfybhsij4b5pc03ricl73h4vhkzazgjjjhfm";
+  };
+
+  dontUseSetuptoolsBuild = true;
+  dontUsePipInstall = true;
+
+  hardeningDisable = [ "format" ];
+
+  nativeBuildInputs = [ pkg-config ]
+    ++ (lib.optionals (!stdenv.isDarwin) [ wxGTK libX11 ])
+    ++ (lib.optionals stdenv.isDarwin [ wxmac ]);
+
+  buildInputs = [ ]
+    ++ (lib.optionals (!stdenv.isDarwin) [  (wxGTK.gtk) ])
+    ++ (lib.optionals stdenv.isDarwin (with darwin.apple_sdk.frameworks; [
+      ApplicationServices
+      AudioToolbox
+      CFNetwork
+      Carbon
+      Cocoa
+      CoreGraphics
+      CoreServices
+      CoreText
+      DiskArbitration
+      IOKit
+      ImageIO
+      OpenGL
+      Security
+    ]))
+    ++ (lib.optional openglSupport pyopengl);
+
+  preConfigure = ''
+    cd wxPython
+    # remove wxPython's darwin hack that interference with python-2.7-distutils-C++.patch
+    substituteInPlace config.py \
+      --replace "distutils.unixccompiler.UnixCCompiler = MyUnixCCompiler" ""
+    # set the WXPREFIX to $out instead of the storepath of wxwidgets
+    substituteInPlace config.py \
+      --replace "WXPREFIX   = getWxConfigValue('--prefix')" "WXPREFIX   = '$out'"
+    # this check is supposed to only return false on older systems running non-framework python
+    substituteInPlace src/osx_cocoa/_core_wrap.cpp \
+      --replace "return wxPyTestDisplayAvailable();" "return true;"
+  '' + lib.optionalString (!stdenv.isDarwin) ''
+    substituteInPlace wx/lib/wxcairo.py \
+      --replace 'cairoLib = None' 'cairoLib = ctypes.CDLL("${cairo}/lib/libcairo.so")'
+    substituteInPlace wx/lib/wxcairo.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 = "";
+
+  installPhase = ''
+    ${python.interpreter} setup.py install WXPORT=${if stdenv.isDarwin then "osx_cocoa" else "gtk2"} NO_HEADERS=0 BUILD_GLCANVAS=${if openglSupport then "1" else "0"} UNICODE=1 --prefix=$out
+    wrapPythonPrograms
+  '';
+
+  passthru = { inherit wxGTK openglSupport; };
+}
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..d72d4aa35d4d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wxPython/4.0.nix
@@ -0,0 +1,78 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, pkg-config
+, which
+, cairo
+, pango
+, python
+, doxygen
+, ncurses
+, libintl
+, numpy
+, pillow
+, six
+, wxGTK
+, wxmac
+, IOKit
+, Carbon
+, Cocoa
+, AudioToolbox
+, OpenGL
+, CoreFoundation
+}:
+
+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 ]
+  );
+
+  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..e4cb6ec79e01
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wxPython/4.1.nix
@@ -0,0 +1,75 @@
+{ lib
+, stdenv
+, fetchPypi
+, buildPythonPackage
+, which
+, pkg-config
+, python
+, isPy27
+, pyopengl
+, doxygen
+, cairo
+, ncurses
+, pango
+, wxGTK
+}:
+let
+  dynamic-linker = stdenv.cc.bintools.dynamicLinker;
+in
+buildPythonPackage rec {
+  pname = "wxPython";
+  version = "4.1.0";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "12x4ci5q7qni4rkfiq6lnpn1fk8b0sfc6dck5wyxkj2sfp5pa91f";
+  };
+
+  # https://github.com/NixOS/nixpkgs/issues/75759
+  # https://github.com/wxWidgets/Phoenix/issues/1316
+  doCheck = false;
+
+  nativeBuildInputs = [ which doxygen wxGTK pkg-config ];
+
+  buildInputs = [
+    wxGTK.gtk
+    ncurses
+  ];
+
+  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-3.0.so"),
+        ("pangocairo", "${pango.out}/lib/libpangocairo-1.0.so"),
+        ("appsvc",     None)
+      ]}'
+
+    # https://github.com/wxWidgets/Phoenix/pull/1584
+    # It'll be not needed in next version because https://github.com/wxWidgets/Phoenix/pull/1699
+    substituteInPlace build.py --replace "os.environ['PYTHONPATH'] = phoenixDir()" \
+      "os.environ['PYTHONPATH'] = os.environ['PYTHONPATH'] + os.pathsep + phoenixDir()"
+  '';
+
+  buildPhase = ''
+    ${python.interpreter} build.py -v --use_syswx dox etg --nodoc build_py
+  '';
+
+  installPhase = ''
+    ${python.interpreter} setup.py install --skip-build --prefix=$out
+    wrapPythonPrograms
+  '';
+
+  passthru = { inherit wxGTK; };
+
+  meta = with lib; {
+    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..21bb787402c1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/x11_hash/default.nix
@@ -0,0 +1,22 @@
+{ lib, stdenv
+, 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..4ceb2dcae791
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/x256/default.nix
@@ -0,0 +1,22 @@
+{ lib, stdenv, 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..a71ade1b41b7
--- /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";
+    sha256 = "0j9awiiw9zf97r60m848absq43k37gghpyw7acxqjazfzd71fxvm";
+  };
+
+  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..28901017b2b5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xapp/default.nix
@@ -0,0 +1,43 @@
+{ lib, stdenv
+, fetchFromGitHub
+, buildPythonPackage
+, psutil
+, pygobject3
+, gtk3
+, gobject-introspection
+, xapps
+, polkit
+}:
+
+buildPythonPackage rec {
+  pname = "xapp";
+  version = "2.0.1";
+
+  src = fetchFromGitHub {
+    owner = "linuxmint";
+    repo = "python-xapp";
+    rev = version;
+    sha256 = "1pp3z4q6ryxcc26kaq222j53ji110n2v7rx29c7vy1fbb8mq64im";
+  };
+
+  propagatedBuildInputs = [
+    psutil
+    pygobject3
+    gtk3
+    gobject-introspection
+    xapps
+    polkit
+  ];
+
+  postPatch = ''
+    substituteInPlace "xapp/os.py" --replace "/usr/bin/pkexec" "${polkit}/bin/pkexec"
+  '';
+
+  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/default.nix b/nixpkgs/pkgs/development/python-modules/xarray/default.nix
new file mode 100644
index 000000000000..d905a11e3418
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xarray/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest
+, numpy
+, pandas
+, python
+, setuptools
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "xarray";
+  version = "0.16.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "5e1af056ff834bf62ca57da917159328fab21b1f8c25284f92083016bb2d92a5";
+  };
+
+  checkInputs = [ pytest ];
+  propagatedBuildInputs = [ numpy pandas setuptools ];
+
+  checkPhase = ''
+    pytest $out/${python.sitePackages}
+  '';
+
+  # There always seem to be broken tests...
+  doCheck = false;
+
+  disabled = !isPy3k;
+
+  meta = {
+    description = "N-D labeled arrays and datasets in Python";
+    homepage = "https://github.com/pydata/xarray";
+    license = lib.licenses.asl20;
+    maintainers = with lib.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..3583358a5605
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xattr/default.nix
@@ -0,0 +1,32 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, python
+, cffi
+}:
+
+buildPythonPackage rec {
+  pname = "xattr";
+  version = "0.9.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b0bbca828e04ef2d484a6522ae7b3a7ccad5e43fa1c6f54d78e24bb870f49d44";
+  };
+
+  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/xcaplib/default.nix b/nixpkgs/pkgs/development/python-modules/xcaplib/default.nix
new file mode 100644
index 000000000000..f6bb5712c2eb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xcaplib/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchdarcs
+, isPy3k
+, eventlib
+, application
+}:
+
+buildPythonPackage rec {
+  pname = "python-xcaplib";
+  version = "1.2.1";
+  disabled = isPy3k;
+
+  src = fetchdarcs {
+    url = "http://devel.ag-projects.com/repositories/${pname}";
+    rev = "release-${version}";
+    sha256 = "15ww8f0a9zh37mypw5s4q1qk44cwf7jlhc9q1z4vjlpvnzimg54v";
+  };
+
+  propagatedBuildInputs = [ eventlib application ];
+
+  meta = with lib; {
+    homepage = "https://github.com/AGProjects/python-xcaplib";
+    description = "XCAP (RFC4825) client library";
+    license = licenses.gpl2;
+  };
+
+}
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..8f51ec1e77f8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xcffib/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, xorg
+, cffi
+, nose
+, six
+}:
+
+buildPythonPackage rec {
+  version = "0.11.0";
+  pname = "xcffib";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a751081d816a63d02a4c63f91fd9c0112c1e0061af7ccf79c4e7c18517a75406";
+  };
+
+  patchPhase = ''
+    # Hardcode cairo library path
+    sed -e 's,ffi\.dlopen(,&"${xorg.libxcb.out}/lib/" + ,' -i xcffib/__init__.py
+  '';
+
+  propagatedBuildInputs = [ cffi six ];
+
+  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..e47a91fb993b
--- /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.0.1";
+  pname = "xdg";
+  disabled = isPy27;
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "srstevenson";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-WMY9Hs9SbErTp8hVBoCWTz4dLQhuzqTRpXFEyE7+woo=";
+  };
+
+  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..280470957dc7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xdis/default.nix
@@ -0,0 +1,31 @@
+{ lib, buildPythonPackage, fetchFromGitHub, isPy27
+, click
+, pytest
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "xdis";
+  version = "5.0.5";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "rocky";
+    repo = "python-xdis";
+    rev = version;
+    sha256 = "01248nh8y5szin6ymd3hrl8qnsg4xijsk3lxyks8zk9cjh008lmq";
+  };
+
+  checkInputs = [ pytest ];
+  propagatedBuildInputs = [ six click ];
+
+  checkPhase = ''
+    make check
+  '';
+
+  meta = with lib; {
+    description = "Python cross-version byte-code disassembler and marshal routines";
+    homepage = "https://github.com/rocky/python-xdis/";
+    license = licenses.gpl2;
+  };
+}
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..21b45b9c322d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xdot/default.nix
@@ -0,0 +1,31 @@
+{ lib, buildPythonPackage, fetchPypi, isPy3k, python3, xvfb_run, stdenv
+, 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 ];
+
+  checkPhase = ''
+    xvfb-run -s '-screen 0 800x600x24' ${python3.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..81a8d05f5bf0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xgboost/default.nix
@@ -0,0 +1,37 @@
+{ buildPythonPackage
+, pytest
+, nose
+, scipy
+, scikitlearn
+, stdenv
+, xgboost
+, substituteAll
+, pandas
+, matplotlib
+, graphviz
+, datatable
+}:
+
+buildPythonPackage {
+  pname = "xgboost";
+  inherit (xgboost) version src meta;
+
+  patches = [
+    (substituteAll {
+      src = ./lib-path-for-python.patch;
+      libpath = "${xgboost}/lib";
+      extention = stdenv.hostPlatform.extensions.sharedLibrary;
+    })
+  ];
+
+  postPatch = "cd python-package";
+
+  propagatedBuildInputs = [ scipy ];
+  buildInputs = [ xgboost ];
+  checkInputs = [ nose pytest scikitlearn pandas matplotlib graphviz datatable ];
+
+  checkPhase = ''
+    ln -sf ../demo .
+    nosetests ../tests/python
+  '';
+}
diff --git a/nixpkgs/pkgs/development/python-modules/xgboost/lib-path-for-python.patch b/nixpkgs/pkgs/development/python-modules/xgboost/lib-path-for-python.patch
new file mode 100644
index 000000000000..c9252c12fed1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xgboost/lib-path-for-python.patch
@@ -0,0 +1,38 @@
+diff --git a/python-package/xgboost/libpath.py b/python-package/xgboost/libpath.py
+index d87922c0..859a30fb 100644
+--- a/python-package/xgboost/libpath.py
++++ b/python-package/xgboost/libpath.py
+@@ -19,32 +19,4 @@ def find_lib_path():
+     lib_path: list(string)
+        List of all found library path to xgboost
+     """
+-    curr_path = os.path.dirname(os.path.abspath(os.path.expanduser(__file__)))
+-    # make pythonpack hack: copy this directory one level upper for setup.py
+-    dll_path = [curr_path, os.path.join(curr_path, '../../lib/'),
+-                os.path.join(curr_path, './lib/'),
+-                os.path.join(sys.prefix, 'xgboost')]
+-    if sys.platform == 'win32':
+-        if platform.architecture()[0] == '64bit':
+-            dll_path.append(os.path.join(curr_path, '../../windows/x64/Release/'))
+-            # hack for pip installation when copy all parent source directory here
+-            dll_path.append(os.path.join(curr_path, './windows/x64/Release/'))
+-        else:
+-            dll_path.append(os.path.join(curr_path, '../../windows/Release/'))
+-            # hack for pip installation when copy all parent source directory here
+-            dll_path.append(os.path.join(curr_path, './windows/Release/'))
+-        dll_path = [os.path.join(p, 'xgboost.dll') for p in dll_path]
+-    elif sys.platform.startswith('linux') or sys.platform.startswith('freebsd'):
+-        dll_path = [os.path.join(p, 'libxgboost.so') for p in dll_path]
+-    elif sys.platform == 'darwin':
+-        dll_path = [os.path.join(p, 'libxgboost.dylib') for p in dll_path]
+-
+-    lib_path = [p for p in dll_path if os.path.exists(p) and os.path.isfile(p)]
+-
+-    # From github issues, most of installation errors come from machines w/o compilers
+-    if not lib_path and not os.environ.get('XGBOOST_BUILD_DOC', False):
+-        raise XGBoostLibraryNotFound(
+-            'Cannot find XGBoost Library in the candidate path, ' +
+-            'did you install compilers and run build.sh in root path?\n'
+-            'List of candidates:\n' + ('\n'.join(dll_path)))
+-    return lib_path
++    return ["@libpath@/libxgboost@extention@"]
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..e3328c7e4534
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xhtml2pdf/default.nix
@@ -0,0 +1,34 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, pillow
+, html5lib
+, pypdf2
+, reportlab
+, six
+, python-bidi
+, arabic-reshaper
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "xhtml2pdf";
+  version = "0.2.5";
+
+  propagatedBuildInputs = [
+    pillow html5lib pypdf2 reportlab six
+    setuptools python-bidi arabic-reshaper
+  ];
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "6797e974fac66f0efbe927c1539a2756ca4fe8777eaa5882bac132fc76b39421";
+  };
+
+  meta = with lib; {
+    description = "A PDF generator using HTML and CSS";
+    homepage = "https://github.com/xhtml2pdf/xhtml2pdf";
+    license = licenses.asl20;
+  };
+
+}
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..88f7b9b94a1f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xkcdpass/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "xkcdpass";
+  version = "1.17.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0ghsjs5bxl996pap910q9s21nywb26mfpjd92rbfywbnj8f2k2cy";
+  };
+
+  # No tests included
+  # https://github.com/redacted/XKCD-password-generator/issues/32
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://pypi.python.org/pypi/xkcdpass/";
+    description = "Generate secure multiword passwords/passphrases, inspired by XKCD";
+    license = licenses.bsd3;
+  };
+
+}
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..b448f87a2d36
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xknx/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, netifaces
+, voluptuous
+, pyyaml
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "xknx";
+  version = "0.16.1";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "XKNX";
+    repo = pname;
+    rev = version;
+    sha256 = "0nma0fq67p9c90b6s5v7n4s6j94sdiwqf8rk1k2vfc6nxxn1jfll";
+  };
+
+  propagatedBuildInputs = [
+    voluptuous
+    netifaces
+    pyyaml
+  ];
+
+  checkInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "xknx" ];
+
+  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 ];
+  };
+}
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..1819fd5a5124
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xlib/default.nix
@@ -0,0 +1,41 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, six
+, setuptools_scm
+, xorg
+, python
+, mock
+, nose
+, util-linux
+}:
+
+buildPythonPackage rec {
+  pname = "xlib";
+  version = "0.29";
+
+  src = fetchFromGitHub {
+    owner = "python-xlib";
+    repo = "python-xlib";
+    rev = version;
+    sha256 = "sha256-zOG1QzRa5uN36Ngv8i5s3mq+VIoRzxFj5ltUbKdonJ0=";
+  };
+
+  checkPhase = ''
+    ${python.interpreter} runtests.py
+  '';
+
+  checkInputs = [ mock nose util-linux /* mcookie */ xorg.xauth xorg.xorgserver /* xvfb */ ];
+  nativeBuildInputs = [ setuptools_scm ];
+  buildInputs = [ xorg.libX11 ];
+  propagatedBuildInputs = [ six ];
+
+  doCheck = !stdenv.isDarwin;
+
+  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/xlrd/default.nix b/nixpkgs/pkgs/development/python-modules/xlrd/default.nix
new file mode 100644
index 000000000000..031ac047936e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xlrd/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "xlrd";
+  version = "1.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "546eb36cee8db40c3eaa46c351e67ffee6eeb5fa2650b71bc4c758a29a1b29b2";
+  };
+
+  checkInputs = [ pytest ];
+
+  checkPhase = ''
+    py.test -k "not test_tilde_path_expansion"
+  '';
+
+  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..a5b67632d836
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xlsx2csv/default.nix
@@ -0,0 +1,22 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "xlsx2csv";
+  version = "0.7.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "09vigknmz15izirfddkmb3a39h1rp2jmc00bnrff12i757n7jjl4";
+  };
+
+  meta = with lib; {
+    homepage = "https://github.com/bitprophet/alabaster";
+    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/xml2rfc/default.nix b/nixpkgs/pkgs/development/python-modules/xml2rfc/default.nix
new file mode 100644
index 000000000000..e06daf3c5b86
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xml2rfc/default.nix
@@ -0,0 +1,50 @@
+{ lib, stdenv, fetchPypi, buildPythonPackage, pythonAtLeast, intervaltree, pyflakes, requests, lxml, google-i18n-address
+, pycountry, html5lib, six, kitchen, pypdf2, dict2xml, weasyprint, pyyaml, jinja2, ConfigArgParse, appdirs
+}:
+
+buildPythonPackage rec {
+  pname = "xml2rfc";
+  version = "3.5.0";
+  disabled = pythonAtLeast "3.9";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "3ec836a9545f549707a8c8176038160185b9d08c1dd80304a906527da21bff68";
+  };
+
+  propagatedBuildInputs = [
+    intervaltree
+    jinja2
+    pyflakes
+    pyyaml
+    requests
+    lxml
+    google-i18n-address
+    pycountry
+    html5lib
+    six
+    kitchen
+    pypdf2
+    dict2xml
+    weasyprint
+    ConfigArgParse
+    appdirs
+  ];
+
+  preCheck = ''
+    export HOME=$(mktemp -d)
+  '';
+
+  # lxml tries to fetch from the internet
+  doCheck = false;
+  pythonImportsCheck = [ "xml2rfc" ];
+
+  meta = with lib; {
+    description = "Tool generating IETF RFCs and drafts from XML sources";
+    homepage = "https://tools.ietf.org/tools/xml2rfc/trac/";
+    # 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/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..e31054e74c13
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xmlschema/default.nix
@@ -0,0 +1,44 @@
+{ lib, buildPythonPackage, fetchFromGitHub
+, elementpath
+, lxml
+, pytest
+}:
+
+buildPythonPackage rec {
+  version = "1.4.1";
+  pname = "xmlschema";
+
+  src = fetchFromGitHub {
+    owner = "sissaschool";
+    repo = "xmlschema";
+    rev = "v${version}";
+    sha256 = "1yd7whf74z8bw99gldxlnrs8bjnjzald29b5cf2ka0i144sxbvad";
+  };
+
+  propagatedBuildInputs = [ elementpath ];
+
+  checkInputs = [ lxml pytest ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "elementpath~=2.0.0" "elementpath~=2.0"
+  '';
+
+  # Ignore broken fixtures, and tests for files which don't exist.
+  # For darwin, we need to explicity say we can't reach network
+  checkPhase = ''
+    pytest tests \
+      --ignore=tests/test_factory.py \
+      --ignore=tests/test_schemas.py \
+      --ignore=tests/test_memory.py \
+      --ignore=tests/test_validation.py \
+      -k 'not element_tree_import_script and not export_remote'
+  '';
+
+  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/xmltodict/default.nix b/nixpkgs/pkgs/development/python-modules/xmltodict/default.nix
new file mode 100644
index 000000000000..790aaec3ce3d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xmltodict/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, coverage
+, nose
+}:
+
+buildPythonPackage rec {
+  pname = "xmltodict";
+  version = "0.12.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "50d8c638ed7ecb88d90561beedbf720c9b4e851a9fa6c47ebd64e99d166d8a21";
+  };
+
+  checkInputs = [ coverage nose ];
+
+  checkPhase = ''
+    nosetests
+  '';
+
+  meta = {
+    description = "Makes working with XML feel like you are working with JSON";
+    homepage = "https://github.com/martinblech/xmltodict";
+    license = lib.licenses.mit;
+  };
+}
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..9023c4cc79ee
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xmodem/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv, 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/xmpppy/default.nix b/nixpkgs/pkgs/development/python-modules/xmpppy/default.nix
new file mode 100644
index 000000000000..fd046adadd97
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xmpppy/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv, buildPythonPackage, fetchurl, isPy3k }:
+buildPythonPackage rec {
+  pname = "xmpp.py";
+  version = "0.5.0rc1";
+
+  patches = [ ./ssl.patch ];
+
+  src = fetchurl {
+    url = "mirror://sourceforge/xmpppy/xmpppy-${version}.tar.gz";
+    sha256 = "16hbh8kwc5n4qw2rz1mrs8q17rh1zq9cdl05b1nc404n7idh56si";
+  };
+
+  preInstall = ''
+    mkdir -p $out/bin $out/lib $out/share $(toPythonPath $out)
+    export PYTHONPATH=$PYTHONPATH:$(toPythonPath $out)
+  '';
+
+  disabled = isPy3k;
+
+  meta = with lib; {
+    description = "XMPP python library";
+    homepage = "http://xmpppy.sourceforge.net/";
+    license = licenses.gpl3;
+    maintainers = [ maintainers.mic92 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/xmpppy/ssl.patch b/nixpkgs/pkgs/development/python-modules/xmpppy/ssl.patch
new file mode 100644
index 000000000000..915602dc23e5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xmpppy/ssl.patch
@@ -0,0 +1,25 @@
+diff -wbBur xmpppy-0.5.0rc1/xmpp/transports.py xmpppy-0.5.0rc1.q/xmpp/transports.py
+--- xmpppy-0.5.0rc1/xmpp/transports.py	2009-04-07 12:34:09.000000000 +0400
++++ xmpppy-0.5.0rc1.q/xmpp/transports.py	2015-05-08 13:06:03.049252065 +0300
+@@ -27,7 +27,7 @@
+ Also exception 'error' is defined to allow capture of this module specific exceptions.
+ """
+ 
+-import socket,select,base64,dispatcher,sys
++import socket,ssl,select,base64,dispatcher,sys
+ from simplexml import ustr
+ from client import PlugIn
+ from protocol import *
+@@ -312,9 +312,9 @@
+         """ Immidiatedly switch socket to TLS mode. Used internally."""
+         """ Here we should switch pending_data to hint mode."""
+         tcpsock=self._owner.Connection
+-        tcpsock._sslObj    = socket.ssl(tcpsock._sock, None, None)
+-        tcpsock._sslIssuer = tcpsock._sslObj.issuer()
+-        tcpsock._sslServer = tcpsock._sslObj.server()
++        tcpsock._sslObj    = ssl.wrap_socket(tcpsock._sock, None, None)
++        tcpsock._sslIssuer = tcpsock._sslObj.getpeercert().get('issuer')
++        tcpsock._sslServer = tcpsock._sslObj.getpeercert().get('server')
+         tcpsock._recv = tcpsock._sslObj.read
+         tcpsock._send = tcpsock._sslObj.write
+ 
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/xpybutil/default.nix b/nixpkgs/pkgs/development/python-modules/xpybutil/default.nix
new file mode 100644
index 000000000000..07cfc96e7fdd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xpybutil/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, fetchFromGitHub, xcffib, pillow, nose }:
+
+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 = [ xcffib pillow ];
+
+  checkInputs = [ nose ];
+
+  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/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..0316a8493762
--- /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 =  "http://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..8c872d0bbd19
--- /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.12.1.1";
+
+  src = fetchPypi {
+    inherit version pname;
+    sha256 = "d6ba48bb474420a8bcb2be02eef6ae96281ec24eff6befa54f04ebc9e4cc8910";
+  };
+
+  # 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..8542747d2dd6
--- /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.7.2.1";
+
+  src = fetchPypi {
+    inherit version pname;
+    sha256 = "b22b0a59ce17bf06e26508fdd264fff74409ebd9968af87a0a63402fce838dc2";
+  };
+
+  # 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/xvfbwrapper/default.nix b/nixpkgs/pkgs/development/python-modules/xvfbwrapper/default.nix
new file mode 100644
index 000000000000..0852fd2e15cf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xvfbwrapper/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv
+, 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..d2f6ae54a4cf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xxhash/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  version = "2.0.0";
+  pname = "xxhash";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "58ca818554c1476fa1456f6cd4b87002e2294f09baf0f81e5a2a4968e62c423c";
+  };
+
+  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/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/yamale/default.nix b/nixpkgs/pkgs/development/python-modules/yamale/default.nix
new file mode 100644
index 000000000000..9b2c7b116c6d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/yamale/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, isPy3k
+, pytest
+, pyyaml
+, ruamel_yaml
+}:
+
+buildPythonPackage rec {
+  pname = "yamale";
+  version = "3.0.4";
+
+  disabled = !isPy3k;
+
+  src = fetchFromGitHub {
+    owner = "23andMe";
+    repo = pname;
+    rev = version;
+    sha256 = "1xjvah4r3gpwk4zxql3c9jpllb34k175fm6iq1zvsd2vv2fwf8s2";
+  };
+
+  propagatedBuildInputs = [
+    pyyaml
+    ruamel_yaml
+  ];
+
+  checkInputs = [
+    pytest
+  ];
+
+  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/yamllint/default.nix b/nixpkgs/pkgs/development/python-modules/yamllint/default.nix
new file mode 100644
index 000000000000..7145c504cd92
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/yamllint/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi
+, nose, pyyaml, pathspec }:
+
+buildPythonPackage rec {
+  pname = "yamllint";
+  version = "1.25.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b1549cbe5b47b6ba67bdeea31720f5c51431a4d0c076c1557952d841f7223519";
+  };
+
+  checkInputs = [ nose ];
+
+  propagatedBuildInputs = [  pyyaml pathspec ];
+
+  # Two test failures
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A linter for YAML files";
+    homepage = "https://github.com/adrienverge/yamllint";
+    license = licenses.gpl3;
+    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..c8b2d5949cbf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/yamlloader/default.nix
@@ -0,0 +1,33 @@
+{ lib, buildPythonPackage, fetchPypi
+, pytest, pyyaml
+}:
+
+buildPythonPackage rec {
+  pname = "yamlloader";
+  version = "0.5.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "3KtfFrObsD0Q3aTNTzDJQ2dexMd3GAf8Z+fxuzGb9Mg=";
+  };
+
+  propagatedBuildInputs = [
+    pyyaml
+  ];
+
+  checkInputs = [
+    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..ce9602a4720c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/yamlordereddictloader/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, ordereddict
+, pyyaml
+}:
+
+buildPythonPackage rec {
+  pname = "yamlordereddictloader";
+  version = "0.4.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "03h8wa6pzqjiw25s3jv9gydn77gs444mf31lrgvpgy53kswz0c3z";
+  };
+
+  propagatedBuildInputs = [ pyyaml ] ++ lib.optional (isPy27) ordereddict;
+
+  # 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..6d4a3b41fbcc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/yanc/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv, buildPythonPackage, pythonOlder, fetchPypi, nose }:
+
+buildPythonPackage rec {
+  pname = "yanc";
+  version = "0.3.3";
+
+  # Tests fail on Python>=3.5. See: https://github.com/0compute/yanc/issues/10
+  disabled = !(pythonOlder "3.5");
+
+  checkInputs = [ nose ];
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0z35bkk9phs40lf5061k1plhjdl5fskm0dmdikrsqi1bjihnxp8w";
+  };
+
+  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/yapf/default.nix b/nixpkgs/pkgs/development/python-modules/yapf/default.nix
new file mode 100644
index 000000000000..36409ae40195
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/yapf/default.nix
@@ -0,0 +1,19 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "yapf";
+  version = "0.30.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "3000abee4c28daebad55da6c85f3cd07b8062ce48e2e9943c8da1b9667d48427";
+  };
+
+  meta = with lib; {
+    description = "A formatter for Python code.";
+    homepage    = "https://github.com/google/yapf";
+    license     = licenses.asl20;
+    maintainers = with maintainers; [ 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..b96d4efd44b8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/yappi/default.nix
@@ -0,0 +1,27 @@
+{ lib, buildPythonPackage, fetchFromGitHub, gevent, isPy27, python }:
+
+buildPythonPackage rec {
+  pname = "yappi";
+  version = "1.3.0";
+  disabled = isPy27; # invalid syntax
+
+  src = fetchFromGitHub {
+    owner = "sumerc";
+    repo = pname;
+    rev = "30f94024a0e2e4fa21c220de6a0dc97b4cb2c319";
+    sha256 = "1kvwl3y3c2hivf9y2x1q1s8a2y724iwqd1krq6ryvsbg3inyh8qw";
+  };
+
+  patches = [ ./tests.patch ];
+  checkInputs = [ gevent ];
+  checkPhase = ''
+    ${python.interpreter} run_tests.py
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/sumerc/yappi";
+    description = "Python profiler that supports multithreading and measuring CPU time";
+    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..359a855a3e5f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/yapsy/default.nix
@@ -0,0 +1,21 @@
+{ 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;
+  };
+
+}
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..7a88b695f639
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/yarl/default.nix
@@ -0,0 +1,34 @@
+{ stdenv
+, lib
+, fetchPypi
+, buildPythonPackage
+, pythonOlder
+, multidict
+, pytestrunner
+, pytest
+, typing-extensions
+, idna
+}:
+
+buildPythonPackage rec {
+  pname = "yarl";
+  version = "1.6.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "8a9066529240171b68893d60dca86a763eae2139dd42f42106b03cf4b426bf10";
+  };
+
+  checkInputs = [ pytest pytestrunner ];
+  propagatedBuildInputs = [ multidict idna ]
+    ++ lib.optionals (pythonOlder "3.8") [
+      typing-extensions
+    ];
+
+  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/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..be935b1995c6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ydiff/default.nix
@@ -0,0 +1,48 @@
+{ stdenv, 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..443b4daec854
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/yeelight/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, fetchgit
+, buildPythonPackage
+, pythonOlder
+, enum-compat
+, future
+, ifaddr
+, mock
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "yeelight";
+  version = "0.5.4";
+
+  src = fetchgit {
+    url = "https://gitlab.com/stavros/python-yeelight.git";
+    rev = "119faeff0d4f9de8c7f6d0580bdecc1c79bcdaea"; # v0.5.4 wasn't tagged
+    sha256 = "0j2c5pzd3kny7ghr9q7xn9vs8dffvyzz5igaavvvd04w7aph29sy";
+  };
+
+  propagatedBuildInputs = [
+    future
+    ifaddr
+  ] ++ lib.optional (pythonOlder "3.4") enum-compat;
+
+  checkInputs = [
+    pytestCheckHook
+  ] ++ lib.optional (pythonOlder "3.3") mock;
+
+  pytestFlagsArray = [ "yeelight/tests.py" ];
+
+  pythonImportsCheck = [ "yeelight" ];
+
+  meta = with lib; {
+    description = "A Python library for controlling YeeLight RGB bulbs";
+    homepage = "https://gitlab.com/stavros/python-yeelight/";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ nyanloutre ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/yenc/default.nix b/nixpkgs/pkgs/development/python-modules/yenc/default.nix
new file mode 100644
index 000000000000..453f3113853b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/yenc/default.nix
@@ -0,0 +1,29 @@
+{ fetchurl
+, lib
+, buildPythonPackage
+, python
+, isPyPy
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "yenc";
+  version = "0.4.0";
+  src = fetchurl {
+    url = "https://bitbucket.org/dual75/yenc/get/${version}.tar.gz";
+    sha256 = "0zkyzxgq30mbrzpnqam4md0cb09d5falh06m0npc81nnlhcghkp7";
+  };
+
+  checkPhase = ''
+    ${python.interpreter} -m unittest discover -s test
+  '';
+
+  disabled = isPy3k || isPyPy;
+
+  meta = {
+    description = "Encoding and decoding yEnc";
+    license = lib.licenses.lgpl21;
+    homepage = "https://bitbucket.org/dual75/yenc";
+    maintainers = with lib.maintainers; [ fridh ];
+  };
+}
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..7ae56cacbb68
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/yfinance/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, multitasking
+, numpy
+, pandas
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "yfinance";
+  version = "0.1.55";
+
+  # GitHub source releases aren't tagged
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "65d39bccf16bef35f6a08bf0df33650c0515b5ce8ea3c53924601f5fe00590cb";
+  };
+
+  propagatedBuildInputs = [
+    multitasking
+    numpy
+    pandas
+    requests
+  ];
+
+  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/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/yowsup/default.nix b/nixpkgs/pkgs/development/python-modules/yowsup/default.nix
new file mode 100644
index 000000000000..48c21434194f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/yowsup/default.nix
@@ -0,0 +1,35 @@
+{ buildPythonPackage, lib, stdenv, fetchFromGitHub, six, python-axolotl, pytest
+, isPy3k, consonance, appdirs
+}:
+
+buildPythonPackage rec {
+  pname = "yowsup";
+  version = "3.2.3";
+
+  # 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 = "0wb8yl685nr1i3vx89hwan5m6a482x8g48f5ksvdlph538p720pm";
+  };
+
+  checkInputs = [ pytest ];
+  checkPhase = ''
+    HOME=$(mktemp -d) py.test yowsup
+  '';
+
+  patches = [ ./dependency-fixes.patch ];
+
+  propagatedBuildInputs = [ six python-axolotl consonance appdirs ];
+
+  meta = with lib; {
+    homepage = "https://github.com/tgalal/yowsup";
+    description = "The python WhatsApp library";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/yowsup/dependency-fixes.patch b/nixpkgs/pkgs/development/python-modules/yowsup/dependency-fixes.patch
new file mode 100644
index 000000000000..eab56332d492
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/yowsup/dependency-fixes.patch
@@ -0,0 +1,13 @@
+diff --git a/setup.py b/setup.py
+index e3871a7..930bd6a 100755
+--- a/setup.py
++++ b/setup.py
+@@ -5,7 +5,7 @@ import yowsup
+ import platform
+ import sys
+ 
+-deps = ['consonance==0.1.2', 'argparse', 'python-axolotl==0.2.2', 'six==1.10', 'appdirs', 'protobuf>=3.6.0']
++deps = ['consonance>=0.1', 'python-axolotl>=0.2', 'six>=1.10', 'appdirs', 'protobuf>=3.6.0']
+ 
+ if sys.version_info < (2, 7):
+     deps.append('importlib')
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..83f9c7a9980b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/yq/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, nixosTests
+, buildPythonPackage
+, fetchPypi
+, substituteAll
+, pkgs
+, argcomplete
+, pyyaml
+, xmltodict
+# Test inputs
+, coverage
+, flake8
+, jq
+, pytest
+, toml
+}:
+
+buildPythonPackage rec {
+  pname = "yq";
+  version = "2.11.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1q4rky0a6n4izmq7slb91a54g8swry1xrbfqxwc8lkd3hhvlxxkl";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./jq-path.patch;
+      jq = "${lib.getBin pkgs.jq}/bin/jq";
+    })
+  ];
+
+  postPatch = ''
+    substituteInPlace test/test.py --replace "expect_exit_codes={0} if sys.stdin.isatty() else {2}" "expect_exit_codes={0}"
+  '';
+
+  propagatedBuildInputs = [
+    pyyaml
+    xmltodict
+    argcomplete
+  ];
+
+  doCheck = true;
+
+  checkInputs = [
+   pytest
+   coverage
+   flake8
+   toml
+  ];
+
+  checkPhase = "pytest ./test/test.py";
+
+  pythonImportsCheck = [ "yq" ];
+
+  passthru.tests = { inherit (nixosTests) yq; };
+
+  meta = with lib; {
+    description = "Command-line YAML processor - jq wrapper for YAML documents";
+    homepage = "https://github.com/kislyuk/yq";
+    license = [ licenses.asl20 ];
+    maintainers = [ maintainers.womfoo ];
+  };
+}
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..784a28feaf18
--- /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 a81f41b..9e80f04 100755
+--- a/test/test.py
++++ b/test/test.py
+@@ -112,7 +112,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 afeb42c..a0d7970 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:
+         # Note: universal_newlines is just a way to induce subprocess to make stdin a text buffer and encode it for us
+-        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,
+                               universal_newlines=True)
diff --git a/nixpkgs/pkgs/development/python-modules/yt/default.nix b/nixpkgs/pkgs/development/python-modules/yt/default.nix
new file mode 100644
index 000000000000..42bde9909b8c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/yt/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, matplotlib
+, setuptools
+, sympy
+, numpy
+, ipython
+, hdf5
+, nose
+, cython
+, python
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "yt";
+  version = "3.6.1";
+  disabled = isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "be454f9d05dcbe0623328b4df43a1bfd1f0925e516be97399710452931a19bb0";
+  };
+
+  buildInputs = [
+    cython
+  ];
+
+  propagatedBuildInputs = [
+    matplotlib
+    setuptools
+    sympy
+    numpy
+    ipython
+    hdf5
+  ];
+
+  checkInputs = [
+    nose
+  ];
+
+  checkPhase = ''
+    cd $out/${python.sitePackages}
+    HOME=$(mktemp -d) nosetests yt
+  '';
+
+  meta = with lib; {
+    description = "An analysis and visualization toolkit for volumetric data";
+    homepage = "https://github.com/yt-project/yt";
+    license = licenses.bsd3;
+    maintainers = [ maintainers.costrouc ];
+  };
+}
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..f1af120d56eb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/z3c-checkversions/default.nix
@@ -0,0 +1,31 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, python
+, zc_buildout
+, zope_testrunner
+}:
+
+buildPythonPackage rec {
+  pname = "z3c-checkversions";
+  version = "1.1";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "z3c.checkversions";
+    sha256 = "b45bd22ae01ed60933694fb5abede1ff71fe8ffa79b37082b2fcf38a2f0dec9d";
+  };
+
+  propagatedBuildInputs = [ zc_buildout ];
+  checkInputs = [ zope_testrunner ];
+  doCheck = !python.pkgs.isPy27;
+  checkPhase = ''
+    ${python.interpreter} -m zope.testrunner --test-path=src []
+  '';
+
+  meta = with lib; {
+    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/zake/default.nix b/nixpkgs/pkgs/development/python-modules/zake/default.nix
new file mode 100644
index 000000000000..1d1d21a462ec
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zake/default.nix
@@ -0,0 +1,36 @@
+{ lib, stdenv
+, 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..3d21bbb3fe39
--- /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.6.1";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "fa7eac1e4ff47ff82d09c42bb4679e18e8a05a73ee81ce59cee6a441a210b2fd";
+  };
+
+  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..4e126074b184
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zbaemon/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv
+, 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/zbase32/default.nix b/nixpkgs/pkgs/development/python-modules/zbase32/default.nix
new file mode 100644
index 000000000000..a4e7a476beca
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zbase32/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, setuptoolsDarcs
+, pyutil
+}:
+
+buildPythonPackage rec {
+  pname = "zbase32";
+  version = "1.1.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "9b25c34ba586cbbad4517af516e723599a6f38fc560f4797855a5f3051e6422f";
+  };
+
+  # Tests require `pyutil' so disable them to avoid circular references.
+  doCheck = false;
+
+  propagatedBuildInputs = [ setuptoolsDarcs pyutil ];
+
+  meta = with lib; {
+    description = "zbase32, a base32 encoder/decoder";
+    homepage = "https://pypi.python.org/pypi/zbase32";
+    license = licenses.bsd0;
+  };
+
+}
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..3b75de3a24b6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zc_lockfile/default.nix
@@ -0,0 +1,26 @@
+{ buildPythonPackage
+, fetchPypi
+, mock
+, zope_testing
+, lib, stdenv
+}:
+
+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..a6a00ad821b8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zconfig/default.nix
@@ -0,0 +1,37 @@
+{ lib, stdenv
+, fetchPypi
+, fetchpatch
+, buildPythonPackage
+, zope_testrunner
+, manuel
+, docutils
+, pythonAtLeast
+}:
+
+buildPythonPackage rec {
+  pname = "ZConfig";
+  version = "3.5.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0s7aycxna07a04b4rswbkj4y5qh3gxy2mcsqb9dmy0iimj9f9550";
+  };
+
+  patches = [
+    # fixes 3.8+ logger validation issues, has been merged into master, remove next bump
+    (fetchpatch {
+      url = "https://github.com/zopefoundation/ZConfig/commit/f0c2990d35ac3c924ecc8be4a5c71c8e4abbd0e5.patch";
+      sha256 = "1bjg3wrvii0rwzf3s0vlpzgg2ckj0h2zxkyxwjcr64s4k2vaq9ij";
+    })
+  ] ++ lib.optional stdenv.hostPlatform.isMusl ./remove-setlocale-test.patch;
+
+  buildInputs = [ manuel docutils ];
+  propagatedBuildInputs = [ zope_testrunner ];
+
+  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/zdaemon/default.nix b/nixpkgs/pkgs/development/python-modules/zdaemon/default.nix
new file mode 100644
index 000000000000..4e126074b184
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zdaemon/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv
+, 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..50dda4c8edbd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zeep/default.nix
@@ -0,0 +1,85 @@
+{ fetchPypi
+, lib
+, fetchpatch
+, buildPythonPackage
+, isPy3k
+, appdirs
+, attrs
+, cached-property
+, defusedxml
+, isodate
+, lxml
+, requests
+, requests_toolbelt
+, six
+, pytz
+, tornado
+, aiohttp
+# test dependencies
+, freezegun
+, mock
+, pretend
+, pytest
+, pytestcov
+, requests-mock
+, aioresponses
+}:
+
+buildPythonPackage rec {
+  pname = "zeep";
+  version = "3.4.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0e98669cfeb60756231ae185498f9ae21b30b2681786b8de58ed34c3b93e41dd";
+  };
+
+  patches = [
+    ( fetchpatch {
+        url = "https://github.com/mvantellingen/python-zeep/pull/1006/commits/ba7edd6bf2b31023b31e8f17c161e1d6d5af3d29.patch";
+        sha256 = "1j0jd5hmh457im9sbawaqf6pnfy36fhr9wqdim8wk5da9ixr0ajs";
+     })
+  ];
+
+  propagatedBuildInputs = [
+    appdirs
+    attrs
+    cached-property
+    defusedxml
+    isodate
+    lxml
+    requests
+    requests_toolbelt
+    six
+    pytz
+
+    # optional requirements
+    tornado
+  ] ++ lib.optional isPy3k aiohttp;
+
+  checkInputs = [
+    freezegun
+    mock
+    pretend
+    pytestcov
+    pytest
+    requests-mock
+  ] ++ lib.optional isPy3k aioresponses;
+
+  checkPhase = ''
+    runHook preCheck
+    # fix compatibility with pytest 4
+    substituteInPlace tests/conftest.py \
+       --replace 'request.node.get_marker("requests")' 'request.node.get_closest_marker("requests")'
+    # ignored tests requires xmlsec python module
+    HOME=$(mktemp -d) pytest tests --ignore tests/test_wsse_signature.py
+    runHook postCheck
+  '';
+
+  meta = with lib; {
+    homepage = "http://docs.python-zeep.org";
+    license = licenses.mit;
+    description = "A modern/fast Python SOAP client based on lxml / requests";
+    maintainers = with maintainers; [ rvl ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/zerobin/default.nix b/nixpkgs/pkgs/development/python-modules/zerobin/default.nix
new file mode 100644
index 000000000000..e12088756686
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zerobin/default.nix
@@ -0,0 +1,33 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, cherrypy
+, bottle
+, lockfile
+, clize
+}:
+
+buildPythonPackage {
+  pname = "zerobin";
+  version = "20160108";
+
+  src = fetchFromGitHub {
+    owner = "sametmax";
+    repo = "0bin";
+    rev = "7da1615";
+    sha256 = "1pzcwy454kn5216pvwjqzz311s6jbh7viw9s6kw4xps6f5h44bid";
+  };
+
+  propagatedBuildInputs = [ cherrypy bottle lockfile clize ];
+
+  # zerobin doesn't have any tests, but includes a copy of cherrypy which
+  # can wrongly fail the check phase.
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A client side encrypted pastebin";
+    homepage = "https://0bin.net/";
+    license = licenses.wtfpl;
+  };
+
+}
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..f85674d68673
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zeroc-ice/default.nix
@@ -0,0 +1,20 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, openssl, bzip2 }:
+
+buildPythonPackage rec {
+  pname = "zeroc-ice";
+  version = "3.7.4";
+
+  src = fetchPypi {
+    inherit version pname;
+    sha256 = "dc79a1eaad1d1cd1cf8cfe636e1bc413c60645e3e87a5a8e9b97ce882690e0e4";
+  };
+
+  buildInputs = [ openssl bzip2 ];
+
+  meta = with lib; {
+    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..a3b00ec32324
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zeroconf/default.nix
@@ -0,0 +1,46 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchPypi
+, ifaddr
+, typing
+, isPy27
+, pythonOlder
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "zeroconf";
+  version = "0.28.8";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0narq8haa3b375vfblbyil77n8bw0wxqnanl91pl0wwwm884mqjb";
+  };
+
+  propagatedBuildInputs = [ ifaddr ]
+    ++ lib.optionals (pythonOlder "3.5") [ typing ];
+
+  checkInputs = [ pytestCheckHook ];
+  pytestFlagsArray = [ "zeroconf/test.py" ];
+  disabledTests = [
+    # disable tests that expect some sort of networking in the build container
+    "test_launch_and_close"
+    "test_launch_and_close_v4_v6"
+    "test_launch_and_close_v6_only"
+    "test_integration_with_listener_ipv6"
+  ] ++ lib.optionals stdenv.isDarwin [
+    "test_lots_of_names"
+  ];
+  __darwinAllowLocalNetworking = true;
+
+  pythonImportsCheck = [ "zeroconf" ];
+
+  meta = with lib; {
+    description = "Python implementation of multicast DNS service discovery";
+    homepage = "https://github.com/jstasiak/python-zeroconf";
+    license = licenses.lgpl21;
+    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..85e950b830e8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zetup/default.nix
@@ -0,0 +1,33 @@
+{ lib, buildPythonPackage, fetchPypi
+, setuptools_scm, pathpy, nbconvert
+, pytest }:
+
+buildPythonPackage rec {
+  pname = "zetup";
+  version = "0.2.64";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b8a9bdcfa4b705d72b55b218658bc9403c157db7b57a14158253c98d03ab713d";
+  };
+
+  # Python 3.8 compatibility
+  postPatch = ''
+    substituteInPlace zetup/zetup_config.py \
+      --replace "'3.7']" "'3.7', '3.8']"
+  '';
+
+  checkPhase = ''
+    py.test test -k "not TestObject" --deselect=test/test_zetup_config.py::test_classifiers
+  '';
+
+  checkInputs = [ pytest pathpy nbconvert ];
+  propagatedBuildInputs = [ setuptools_scm ];
+
+  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/zfec/default.nix b/nixpkgs/pkgs/development/python-modules/zfec/default.nix
new file mode 100644
index 000000000000..8a5aaf46b0e4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zfec/default.nix
@@ -0,0 +1,39 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, setuptoolsDarcs
+, pyutil
+}:
+
+buildPythonPackage rec {
+  pname = "zfec";
+  version = "1.5.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "6033b2f3cc3edacf3f7eeed5f258c1ebf8a1d7e5e35b623db352512ce564e5ca";
+  };
+
+  buildInputs = [ setuptoolsDarcs ];
+  propagatedBuildInputs = [ pyutil ];
+
+  # argparse is in the stdlib but zfec doesn't know that.
+  postPatch = ''
+    sed -i -e '/argparse/d' setup.py
+  '';
+
+  meta = with lib; {
+    homepage = "http://allmydata.org/trac/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;
+  };
+
+}
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..2f3500516cb9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zha-quirks/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, aiohttp
+, zigpy
+, asynctest
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "zha-quirks";
+  version = "0.0.51";
+
+  src = fetchFromGitHub {
+    owner = "zigpy";
+    repo = "zha-device-handlers";
+    rev = version;
+    sha256 = "14v01kclf096ax88cd6ckfs8gcffqissli9vpr0wfzli08afmbi9";
+  };
+
+  propagatedBuildInputs = [ aiohttp zigpy ];
+  checkInputs = [ pytestCheckHook asynctest ];
+
+  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; [ etu ];
+    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..da36c1cba899
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zict/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi
+, pytest, heapdict, pythonOlder }:
+
+buildPythonPackage rec {
+  pname = "zict";
+  version = "2.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "8e2969797627c8a663575c2fc6fcb53a05e37cdb83ee65f341fc6e0c3d0ced16";
+  };
+
+  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..79b9d910053a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zigpy-cc/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, asynctest
+, buildPythonPackage
+, fetchFromGitHub
+, pyserial
+, pyserial-asyncio
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, zigpy }:
+
+buildPythonPackage rec {
+  pname = "zigpy-cc";
+  version = "0.5.2";
+  # 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
+    pyserial-asyncio
+    zigpy
+  ];
+
+  checkInputs = [
+    asynctest
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "A library which communicates with Texas Instruments CC2531 radios for zigpy";
+    homepage = "https://github.com/zigpy/zigpy-cc";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ etu 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..d9c7854bf984
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zigpy-deconz/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pyserial
+, pyserial-asyncio
+, zigpy
+, pytestCheckHook
+, pytest-asyncio
+, asynctest
+}:
+
+buildPythonPackage rec {
+  pname = "zigpy-deconz";
+  version = "0.11.1";
+
+  src = fetchFromGitHub {
+    owner = "zigpy";
+    repo = pname;
+    rev = version;
+    sha256 = "1p9mdsfc200iyszppcflazzfwqg4v8nqqwqsx114nip5km7a5s37";
+  };
+
+  propagatedBuildInputs = [ pyserial pyserial-asyncio zigpy ];
+  checkInputs = [ pytestCheckHook pytest-asyncio asynctest ];
+
+  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; [ etu 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..1279bb804de6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zigpy-xbee/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, asynctest
+, buildPythonPackage
+, fetchFromGitHub
+, pyserial
+, pyserial-asyncio
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, zigpy }:
+
+buildPythonPackage rec {
+  pname = "zigpy-xbee";
+  version = "0.13.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 = "Krdqb9bYKwUC2cdNppB2+tLwWjzmzIHhXnQ1KRduofU=";
+  };
+
+  buildInputs = [
+    pyserial
+    pyserial-asyncio
+    zigpy
+  ];
+
+  checkInputs = [
+    asynctest
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  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; [ etu 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..5ebb17dd498b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zigpy-zigate/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, asynctest
+, buildPythonPackage
+, fetchFromGitHub
+, pyserial
+, pyserial-asyncio
+, pyusb
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, zigpy }:
+
+buildPythonPackage rec {
+  pname = "zigpy-zigate";
+  version = "0.7.4";
+  # 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-zigate";
+    rev = version;
+    sha256 = "0xl8qgljvmypi602f52m89iv9pcrzsdal3jw619vrcavp40rc04d";
+  };
+
+  propagatedBuildInputs = [
+    pyserial
+    pyserial-asyncio
+    pyusb
+    zigpy
+  ];
+
+  checkInputs = [
+    asynctest
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "A library which communicates with ZiGate radios for zigpy";
+    homepage = "https://github.com/zigpy/zigpy-zigate";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ etu 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..4de49cbc46b3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zigpy-znp/default.nix
@@ -0,0 +1,60 @@
+{ lib, stdenv
+, async-timeout
+, asynctest
+, buildPythonPackage
+, coloredlogs
+, coveralls
+, fetchFromGitHub
+, pyserial
+, pyserial-asyncio
+, pytest-asyncio
+, pytest-mock
+, pytest-timeout
+, pytestcov
+, pytestCheckHook
+, voluptuous
+, zigpy }:
+
+buildPythonPackage rec {
+  pname = "zigpy-znp";
+  version = "0.3.0";
+
+  src = fetchFromGitHub {
+    owner = "zha-ng";
+    repo = "zigpy-znp";
+    rev = "v${version}";
+    sha256 = "18dav2n5fqdigf8dl7gcqa9z8l6p2ig6l5q78gqg2wj7wjpncwyj";
+  };
+
+  propagatedBuildInputs = [
+    async-timeout
+    coloredlogs
+    pyserial
+    pyserial-asyncio
+    voluptuous
+    zigpy
+  ];
+
+  checkInputs = [
+    asynctest
+    coveralls
+    pytest-asyncio
+    pytest-mock
+    pytest-timeout
+    pytestcov
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # zigpy-znp was too slow to sync up with the zigpy 0.29 release and has API breakage, remove >0.3.0
+    "test_force_remove"
+  ];
+
+  meta = with lib; {
+    description = "A library for zigpy which communicates with TI ZNP radios";
+    homepage = "https://github.com/zha-ng/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..9a6b0feb3b77
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zigpy/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, aiohttp
+, aiosqlite
+, asynctest
+, buildPythonPackage
+, crccheck
+, fetchFromGitHub
+, pycrypto
+, pycryptodome
+, pytest-aiohttp
+, pytest-asyncio
+, pytestCheckHook
+, tox
+, voluptuous }:
+
+buildPythonPackage rec {
+  pname = "zigpy";
+  version = "0.30.0";
+
+  src = fetchFromGitHub {
+    owner = "zigpy";
+    repo = "zigpy";
+    rev = version;
+    sha256 = "14qyxm7bj62fsvxfp6x3r1ygjlv7q3jjvq6gzj30na78x1fqr9g1";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    aiosqlite
+    crccheck
+    pycrypto
+    pycryptodome
+    voluptuous
+  ];
+
+  checkInputs = [
+    asynctest
+    pytest-aiohttp
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Library implementing a ZigBee stack";
+    homepage = "https://github.com/zigpy/zigpy";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ etu 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..338dd93150b3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zimports/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, isPy3k
+, fetchFromGitHub
+, buildPythonPackage
+, flake8-import-order
+, pyflakes
+, mock
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "zimports";
+  version = "0.2.0";
+
+  src = fetchFromGitHub {
+    owner = "sqlalchemyorg";
+    repo = "zimports";
+    rev = version;
+    sha256 = "0a5axflkk0wv0rdnrh8l2rgj8gh2pfkg5lrvr8x4yxxiifawrafc";
+  };
+
+  disabled = !isPy3k;
+
+  propagatedBuildInputs = [
+    pyflakes
+    flake8-import-order
+    setuptools
+  ];
+
+  checkInputs = [
+    mock
+  ];
+
+  checkPhase = ''
+    runHook preInstallCheck
+    PYTHONPATH= $out/bin/zimports --help >/dev/null
+    runHook postInstallCheck
+  '';
+
+  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/1.nix b/nixpkgs/pkgs/development/python-modules/zipp/1.nix
new file mode 100644
index 000000000000..0de729928d0f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zipp/1.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools_scm
+, pytest
+, pytest-flake8
+, more-itertools
+, toml
+}:
+
+buildPythonPackage rec {
+  pname = "zipp";
+  version = "1.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0v3qayhqv7vyzydpydwcp51bqciw8p2ajddw68x5k8zppc0vx3yk";
+  };
+
+  nativeBuildInputs = [ setuptools_scm ];
+
+  propagatedBuildInputs = [ more-itertools ];
+
+  checkInputs = [ pytest pytest-flake8 ];
+
+  checkPhase = ''
+    pytest
+  '';
+
+  # Prevent infinite recursion with pytest
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Pathlib-compatible object wrapper for zip files";
+    homepage = "https://github.com/jaraco/zipp";
+    license = licenses.mit;
+  };
+}
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..1dafe8cbb0c5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zipp/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools_scm
+, pytest
+, pytest-flake8
+, more-itertools
+, toml
+}:
+
+buildPythonPackage rec {
+  pname = "zipp";
+  version = "3.4.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ed5eee1974372595f9e416cc7bbeeb12335201d8081ca8a0743c954d4446e5cb";
+  };
+
+  nativeBuildInputs = [ setuptools_scm toml ];
+
+  propagatedBuildInputs = [ more-itertools ];
+
+  checkInputs = [ pytest pytest-flake8 ];
+
+  checkPhase = ''
+    pytest
+  '';
+
+  # Prevent infinite recursion with pytest
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Pathlib-compatible object wrapper for zip files";
+    homepage = "https://github.com/jaraco/zipp";
+    license = licenses.mit;
+  };
+}
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..ec885c6df0f4
--- /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; [ primeos ];
+  };
+}
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..d48b9c4b9507
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zodb/default.nix
@@ -0,0 +1,61 @@
+{ lib, stdenv
+, fetchPypi
+, buildPythonPackage
+, python
+, pythonAtLeast
+, zope_testrunner
+, transaction
+, six
+, zope_interface
+, zodbpickle
+, zconfig
+, persistent
+, zc_lockfile
+, BTrees
+, manuel
+}:
+
+buildPythonPackage rec {
+    pname = "ZODB";
+    version = "5.6.0";
+
+    src = fetchPypi {
+      inherit pname version;
+      sha256 = "1zh7rd182l15swkbkm3ib0wgyn16xasdz2mzry8k4lwk6dagnm26";
+    };
+
+    # remove broken test
+    postPatch = ''
+      rm -vf src/ZODB/tests/testdocumentation.py
+    '';
+
+    # ZConfig 3.5.0 is not compatible with Python 3.8
+    disabled = pythonAtLeast "3.8";
+
+    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..9a0727c82e90
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zodbpickle/default.nix
@@ -0,0 +1,22 @@
+{ buildPythonPackage
+, isPyPy
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "zodbpickle";
+  version = "2.0.0";
+  disabled = isPyPy; # https://github.com/zopefoundation/zodbpickle/issues/10
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0fb7c7pnz86pcs6qqwlyw72vnijc04ns2h1zfrm0h7yl8q7r7ng0";
+  };
+
+  # fails..
+  doCheck = false;
+
+  meta = {
+    homepage = "https://pypi.python.org/pypi/zodbpickle";
+  };
+}
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..2998376b6726
--- /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.3";
+
+  src = fetchPypi {
+    pname = "zope.deferredimport";
+    inherit version;
+    sha256 = "2ddef5a7ecfff132a2dd796253366ecf9748a446e30f1a0b3a636aec9d9c05c5";
+  };
+
+  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..6c19ffbec029
--- /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.0.1";
+
+  src = fetchPypi {
+    pname = "zope.hookable";
+    inherit version;
+    sha256 = "0hc82lfr7bk53nvbxvjkibkarngyrzgfk2i6bg8wshl0ly0pdl19";
+  };
+
+  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_broken/default.nix b/nixpkgs/pkgs/development/python-modules/zope_broken/default.nix
new file mode 100644
index 000000000000..899d7f3344be
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zope_broken/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv
+, 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..6ea86b9b984d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zope_component/default.nix
@@ -0,0 +1,37 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, zope-deferredimport
+, zope_deprecation
+, zope_event
+, zope-hookable
+, zope_interface
+, zope_configuration
+, zope_i18nmessageid
+}:
+
+buildPythonPackage rec {
+  pname = "zope.component";
+  version = "4.6.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "91628918218b3e6f6323de2a7b845e09ddc5cae131c034896c051b084bba3c92";
+  };
+
+  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..e8d05b7767b3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zope_configuration/default.nix
@@ -0,0 +1,33 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, zope_i18nmessageid
+, zope_schema
+, zope_testrunner
+, manuel
+}:
+
+buildPythonPackage rec {
+  pname = "zope.configuration";
+  version = "4.4.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "e9f02bac44405ad1526399d6574b91d792f9694f9c67df8b64e91fe10fcddb3c";
+  };
+
+  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..6b66cca18aab
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zope_contenttype/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv
+, 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..cda7af8e7a0c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zope_deprecation/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv
+, 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..0e8f35431364
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zope_dottedname/default.nix
@@ -0,0 +1,22 @@
+{ lib, stdenv
+, 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..cc82da7ea9a1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zope_event/default.nix
@@ -0,0 +1,22 @@
+{ lib, stdenv
+, 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.python.org/pypi/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..09f08c7bba48
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zope_exceptions/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, zope_interface
+}:
+
+buildPythonPackage rec {
+  pname = "zope.exceptions";
+  version = "4.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0d72886b1bb8af4c346a117a540f28ab122577f5e3a105a261be72cd15776fda";
+  };
+
+  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..7aae2a24d623
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zope_filerepresentation/default.nix
@@ -0,0 +1,30 @@
+{ lib, stdenv
+, 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..49270488ecdb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zope_i18nmessageid/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv
+, 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..7a32045fc3e3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zope_interface/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, zope_event
+}:
+
+buildPythonPackage rec {
+  pname = "zope.interface";
+  version = "5.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "8251f06a77985a2729a8bdbefbae79ee78567dddc3acbd499b87e705ca59fe24";
+  };
+
+  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..390624b50de7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zope_lifecycleevent/default.nix
@@ -0,0 +1,37 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+, zope_event
+, zope_component
+, zope_interface
+}:
+
+buildPythonPackage rec {
+  pname = "zope.lifecycleevent";
+  version = "4.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "7ec39087cc1524e55557e7d9dc6295eb1b95b09b125e293c0e2dd068574f0aee";
+  };
+
+  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..62b2cef9ea75
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zope_location/default.nix
@@ -0,0 +1,32 @@
+{ lib, stdenv
+, 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..af108c058c7f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zope_proxy/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, zope_interface
+}:
+
+buildPythonPackage rec {
+  pname = "zope.proxy";
+  version = "4.3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a66a0d94e5b081d5d695e66d6667e91e74d79e273eee95c1747717ba9cb70792";
+  };
+
+  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..c7e228c4e05b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zope_schema/default.nix
@@ -0,0 +1,33 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, zope_location
+, zope_event
+, zope_interface
+, zope_testing
+}:
+
+buildPythonPackage rec {
+  pname = "zope.schema";
+  version = "6.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "20fbbce8a0726ba34f0e3958676498feebb818f06575193254e139d8d7214f26";
+  };
+
+  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..79eadc880a25
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zope_size/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv
+, 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..3d7cbf90c25f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zope_testing/default.nix
@@ -0,0 +1,30 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPyPy
+, zope_interface
+, zope_exceptions
+, zope_location
+}:
+
+buildPythonPackage rec {
+  pname = "zope.testing";
+  version = "4.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d66be8d1de37e8536ca58a1d9f4d89a68c9cc75cc0e788a175c8a20ae26003ea";
+  };
+
+  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..c516106e48bb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zope_testrunner/default.nix
@@ -0,0 +1,30 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, zope_interface
+, zope_exceptions
+, zope_testing
+, six
+}:
+
+
+buildPythonPackage rec {
+  pname = "zope.testrunner";
+  version = "5.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "873d6017abadc213992a0c38c786ed020341b6e0fe78d14bc2a684cf5a70de4b";
+  };
+
+  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..a80b3155b8ce
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zopfli/default.nix
@@ -0,0 +1,21 @@
+{ lib, buildPythonPackage, fetchPypi, pytest }:
+
+buildPythonPackage rec {
+  pname = "zopfli";
+  version = "0.1.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "512892714f0e3dcc9a77222cb509ed519f41ce2b92467e47a4b406a23b48561a";
+    extension = "zip";
+  };
+
+  checkInputs = [ pytest ];
+
+  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..fc5f8c3161ed
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zstandard/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, cffi
+, hypothesis
+}:
+
+buildPythonPackage rec {
+  pname = "zstandard";
+  version = "0.15.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "cb7c6a6f7d62350b9f5539045da54422975630e34dd9069584cc776b9917115f";
+  };
+
+  propagatedBuildInputs = [ cffi ];
+
+  checkInputs = [ hypothesis ];
+
+  meta = with lib; {
+    description = "zstandard bindings for Python";
+    homepage = "https://github.com/indygreg/python-zstandard";
+    license = licenses.bsdOriginal;
+    maintainers = [ 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..af7bb7692f66
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zstd/default.nix
@@ -0,0 +1,47 @@
+{ lib, stdenv, pkg-config, fetchPypi, buildPythonPackage
+, buildPackages
+, zstd, pytest }:
+
+buildPythonPackage rec {
+  pname = "zstd";
+  version = "1.4.8.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b62b21eb850abd6b8c0046bfc1c5c773c873eeb94f1904ef1ff304e98b62b80e";
+  };
+
+  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..2c7b7582b80e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zulip/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, isPy3k
+, fetchFromGitHub
+, requests
+, matrix-client
+, distro
+}:
+
+buildPythonPackage rec {
+  pname = "zulip";
+  version = "0.7.1";
+
+  disabled = !isPy3k;
+
+  # no sdist on PyPI
+  src = fetchFromGitHub {
+    owner = "zulip";
+    repo = "python-zulip-api";
+    rev = version;
+    sha256 = "0da1ki1v252avy27j6d7snnc0gyq0xa9fypm3qdmxhw2w79d6q36";
+  };
+  sourceRoot = "source/zulip";
+
+  propagatedBuildInputs = [
+    requests
+    matrix-client
+    distro
+  ];
+
+  preCheck = ''
+    export COLUMNS=80
+  '';
+
+  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/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 ];
+  };
+}