{ lib , pkgs }: # TODO: pagefind let python-builtins = [ "builtins" "os" "array" "sys" "time" "traceback" "pathlib" "itertools" "functools" "unittest" "argparse" "asyncio" "textwrap" "collections" "configparser" "concurrent" "contextlib" "operator" "pickle" "copy" "ctypes" "pprint" "shlex" "re" "abc" "ast" "random" "shutil" "sqlite3" "subprocess" "statistics" "string" "tarfile" "typing" "uuid" "warnings" "wave" "dataclasses" "glob" "gzip" "inspect" "json" "base64" "zipfile" ]; #python-packages = with pkgs.python3Packages; [ cached-property ]; #python-packages = lib.pipe pkgs.python3Packages [ # builtins.attrValues # (builtins.filter lib.isDerivation) #]; /** / python-packages = with pkgs.python3Packages; [ more-itertools altair pygal vispy seaborn bokeh plotly tabulate wavefile moderngl pydantic typer ptpython colorama pyjwt zipp aiofiles aafigure urllib3 tesserocr trio starlette pyverilog nixpkgs wavedrom httpx pyquery mpv beautifulsoup4 hid hidapi #sanic # broken build? paramiko pydub aiohttp papermill rtoml redis numpy #domeneshop munch migen amaranth click attrs graphviz baron redbaron fastapi pytest #pyglet # pyglet.com fails, windows only #pygame # pygame.movie fails on pdoc3, pdoc hangs plotly peewee parsel pandas #mutmut # moved to toplevel from python3Packages mlflow meshio #einops # depends on tensorflow, which is broken ATM aiodns json5 seaborn matplotlib dash rarfile pyramid pygtail codecov nbconvert humanfriendly pendulum jsonpickle cachetools wrapt lxml chardet yarl frozenlist itsdangerous xmltodict cached-property toolz aioitertools coconut asyncpg aiopg libsass pytorch pytorch-lightning pillow trio tqdm rich pudb pony mido jedi h5py atom toml pyyaml jinja2 requests h5py imageio pygments trimesh shapely #faiss #geomloss #mesh_to_sdf #pyrender ]; /**/ python-packages = with pkgs.python3Packages; [ aiocurrencylayer aioitertools aiolifx-connection aiolifx-effects aiomisc aionotify aiorun aioshutil aiozeroconf alembic aliyun-python-sdk-dbfs allure-python-commons-test amply angr aniso8601 anonip ansible ansicolor ansiwrap apptools aprslib aqipy-atmotech arc4 argcomplete args arpeggio asgi-csrf asn1tools aspectlib astor async-lru asynccmd asyncio-throttle asynctest asysocks atom atomicwrites-homeassistant attrdict autopage autopep8 avea avro3k awacs awswrangler azure-mgmt-nspkg b2sdk behave bitarray bitcoinrpc bitlist bluetooth-auto-recovery bnunicodenormalizer boschshcpy bottleneck brelpy bsddb3 bson bunch cart casa-formats-io cftime chacha20poly1305 cmigemo coapthon3 cogapp coinmetrics-api-client commentjson cons contexttimer contourpy coreapi cppheaderparser dash-table dask-jobqueue decli deep-chainmap diceware diff-cover django-bootstrap4 django-cache-url django-cacheops django-celery-results django-compressor django-picklefield django-reversion django-tables2 djangorestframework-guardian2 djmail doit-py dotmap drf-nested-routers dugong dunamai dvc-render entrance-with-router-features ephemeral-port-reserve et_xmlfile eth-hash eth-keys eve exdown exif face fastbencode fastcache fastentrypoints fe25519 filetype fingerprints fire fixtures flake8-future-import flask-gravatar flask-swagger flask-swagger-ui fpdf fs ftputil funcparserlib funcy fuzzywuzzy gbinder-python gcovr generic geoip geojson ghrepo-stats gibberish-detector google-cloud-bigquery-logging google-cloud-dns gpaw graphql-server-core greeclimate gunicorn gvm-tools headerparser heapdict hijri-converter hledger-utils htmllaundry httpie httpx hyperlink imageio-ffmpeg imaplib2 importlib-resources inotifyrecursive inquirer insteon-frontend-home-assistant intelhex interface-meta ipwhl irctokens isounidecode itemloaders iteration-utilities itsdangerous itypes jaeger-client javaproperties jax joblib json-rpc json-tricks jsonpatch junit-xml jupyter-cache jupyter-packaging jupyterlab-pygments jupyterlab_launcher jxmlease keyrings-cryptfile korean-lunar-calendar kubernetes language-data lazy lcov_cobertura ldap3 ledger libais libarchive-c libarcus libgpuarray license-expression lightwave lima lit lockfile log-symbols luhn m3u8 magic-wormhole mail-parser manhole markups marshmallow-oneofschema marshmallow-polyfield mastodon-py maxminddb mdurl mdutils meep mergedict merkletools mip mkdocs mkdocs-material-extensions msoffcrypto-tool multimethod multipart multiprocess mypy nanoid napalm napalm-hp-procurve nbdime nbformat nbval ndtypes neo4j nessclient netdata nose-randomly notebook-shim nsz nulltype ome-zarr onetimepass oocsi opsdroid_get_image_size opytimark oracledb pa-ringbuffer pad4pi papermill parsimonious parsley pcapy-ng pdoc phonopy pick picobox pipdate pkce pkgconfig pkginfo plantuml platformdirs plum-py plyer plyvel progressbar33 prometheus-client promise prox-tv pulumi-command pure-cdb py-dmidecode py-multiaddr py-multibase py-nextbusnext py-zabbix pyaehw4a1 pyatv pybullet pycangjie pycddl pycep-parser pydevccu pyftdi pyfume pygatt pygetwindow pyglet pygmars pyhcl pyheos pyinstrument pykdtree pylint-flask pymeeus pymetar pymodbus pymysensors pypdf pypdf3 pyprind pyqtwebengine pyrainbird pyrmvtransport pyro5 pyrogram pyrr pyscss pysdl2 pysearpc pysensors pyside2 pysmf pysmi pysml pysmt pysnmp-pyasn1 pyspf pysvg-py3 pysychonaut pytest-bdd pytest-catchlog pytest-django pytest-expect pytest-factoryboy pytest-flask pytest-isort pytest-relaxed pytest-snapshot pytest-socket pytest-virtualenv pytestcache python-baseconv python-bidi python-daemon python-decouple python-editor python-ipware python-ldap-test python-packer python-socketio python-status python-u2flib-server pytimeparse pytm pytzdata pyvisa pywemo pyworld pyxl3 qtile reactivex rebulk reikna related repath repoze_lru requests-pkcs12 requirements-parser result retrying rich-argparse-plus rivet rouge-score rtp rx safe sasmodels scikit-bio scikit-fmm seccomp securetar sendgrid sentence-transformers serialio setuptools-git sexpdata sfrbox-api sh sievelib simber simpleaudio simpleeval snapshottest soapysdr somajo speedtest-cli sphinx_pypi_upload sphinxcontrib-openapi sqlobject starkbank-ecdsa starlette staticjinja stdiomask strategies stravalib strenum strictyaml stringcase stringly sympy syncer sysv_ipc tabview takethetime tblite tcolorpy termstyle testing-common-database textacy textwrap3 textx tweepy twilio twitter-common-collections twitter-common-confluence types-futures types-redis types-urllib3 typesystem udatetime ukpostcodeparser unicrypto unidecode unidic-lite unpaddedbase64 update-copyright ush vdirsyncer vector venusian versioneer veryprettytable videocr voluptuous-stubs volvooncall wakeonlan web webcolors webhelpers wfuzz whichcraft widlparser winacl wordfreq ws4py wsdiscovery wsgi-intercept xdg xhtml2pdf xstatic-jquery-file-upload xstatic-pygments yamllint yaramod yubico zarr zc_lockfile zigpy-zigate zigpy-znp zipstream zipstream-ng zope_proxy zope_schema zopfli ]; /**/ mkPdoc = use-pdoc3: drv: let isBuiltin = !lib.isDerivation drv; name = if isBuiltin then drv else drv.pname; desc = if isBuiltin then "builtin" else drv.meta.description; version = if isBuiltin then "-" else drv.version; homepage = if isBuiltin then "https://docs.python.org/3/library/${drv}.html" else drv.meta.homepage or "-"; doc = pkgs.runCommand "pdoc${if use-pdoc3 then "3" else ""}-${name}-docs" { nativeBuildInputs = (if use-pdoc3 then [pkgs.python3Packages.pdoc3] else [pkgs.python3Packages.pdoc]) ++ lib.optionals (!isBuiltin) [ drv ] ++ lib.optionals (!isBuiltin) (lib.pipe (drv.passthru.optional-dependencies or {}) [ builtins.attrValues lib.flatten (builtins.filter (drv': (builtins.tryEval drv'.outPath).success )) ]); env.NAME = lib.toLower name; env.DESC = lib.escapeXML desc; # TODO: license # TODO: build html with something better than bash } '' LITERALS=() ${lib.optionalString isBuiltin '' LITERALS+=("${name}") _tmp="$(python -c 'import ${name}; print((getattr(${name}, "__doc__", "") or "builtin").split("\n")[0])')" test "$?" -eq 0 && DESC="$_tmp" ''} ${lib.optionalString (!isBuiltin) '' LITERALS+=(${lib.escapeShellArgs ( (drv.pythonImportsCheck or []) ++ (drv.pythonImportsExtraCheck or []) )}) pushd ${drv}/${pkgs.python3.sitePackages} shopt -s globstar #for fname in **/*; do for fname in *; do if test -f "$fname" && ( test "''${fname##*.}" = "py" || test "''${fname##*.}" = "so" ) ; then [[ "$fname" =~ (^|/)"_"* ]] && continue LITERALS+=("$(echo "''${fname%%.py*}" | tr "/-" "._" )") elif test -d "$fname" && test -f "$fname"/__init__.py; then LITERALS+=("$(echo "$fname" | tr "/-" "._" )") fi done popd # make unique LITERALS=( $(printf "%q\n" "''${LITERALS[@]}" | sort -u) ) echo "''${LITERALS[0]}" ''} ( timeout 900s ${if !use-pdoc3 then ''pdoc --no-search --math --no-browser --output-directory $out "''${LITERALS[@]}"'' else ''pdoc3 --skip-errors --output-dir $out --html "''${LITERALS[@]}" --force'' } 2>&1 | tee "$NAME".log ) || true mkdir -p $out cp "$NAME".log $out test -f $out/index.html && rm -v $out/index.html function write { { printf "%s" "$@"; echo; } >> $out/index.part-"$NAME".html } write "" if test -f $out/"''${LITERALS[0]}".html; then write "${lib.escapeXML name}" elif test -d $out/"''${LITERALS[0]}"; then write "${lib.escapeXML name}" else write "${lib.escapeXML name}" fi write "${version}" if test -s $out/$NAME.log; then write "log" else write "-" fi write "$DESC" ${if homepage == "-" then '' write "n/a" '' else '' write "${homepage}" ''} write "" ''; fallback = pkgs.writeTextDir "index.part-${lib.toLower name}.html" '' ${lib.escapeXML name} ${version} ⨯ ${lib.escapeXML desc} ${if homepage == "-" then "n/a" else ''${homepage}'' } ''; in if (builtins.tryEval doc.outPath).success then doc else fallback; mkPdocs = use-pdoc3: with builtins; pkgs.symlinkJoin { name = "pdoc-docs"; paths = map (mkPdoc use-pdoc3) (python-builtins ++ python-packages); # note: globs are sorted postBuild = '' shopt -s nocaseglob >>$out/index.html echo "" >>$out/index.html echo "" >>$out/index.html cat $out/index.part-*.html >>$out/index.html echo "
nameversionlogdescriptionhomepage
" rm $out/index.part-*.html ''; }; in { pdocs = mkPdocs false; pdocs3 = mkPdocs true; }