{ stdenv, fetchFromGitHub, ocamlPackages, writeScript , dune, python3, rsync, buck, watchman, sqlite }: let # Manually set version - the setup script requires # hg and git + keeping the .git directory around. pyre-version = "0.0.22"; # also change typeshed revision below with $pyre-src/.typeshed-version pyre-src = fetchFromGitHub { owner = "facebook"; repo = "pyre-check"; rev = "v${pyre-version}"; sha256 = "057vy6zmgwsi0ag9n4m6sszhahmfk2s1ywm36nyfs7w4d0wnk92s"; }; versionFile = writeScript "version.ml" '' cat > "./version.ml" < dune ln -sf ${versionFile} ./scripts/generate-version-number.sh mkdir $(pwd)/build export OCAMLFIND_DESTDIR=$(pwd)/build export OCAMLPATH=$OCAMLPATH:$(pwd)/build ''; buildFlags = [ "release" ]; doCheck = true; # ./scripts/run-python-tests.sh # TODO: once typeshed and python bits are added # Note that we're not installing the typeshed yet. # Improvement for a future version. installPhase = '' install -D ./_build/default/main.exe $out/bin/pyre.bin ''; meta = with stdenv.lib; { description = "A performant type-checker for Python 3"; homepage = https://pyre-check.org; license = licenses.mit; platforms = ocamlPackages.ocaml.meta.platforms; maintainers = with maintainers; [ teh ]; }; }; typeshed = stdenv.mkDerivation { pname = "typeshed"; version = pyre-version; src = fetchFromGitHub { owner = "python"; repo = "typeshed"; rev = "0b49ce75b478fdf283dda5dd1368759ac342dfe2"; sha256 = "1w5aqbbcfk5ki8n9fgdikkyadjb318ipqyi517s9xnwlzi1jv0fh"; }; phases = [ "unpackPhase" "installPhase" ]; installPhase = "cp -r $src $out"; }; in python3.pkgs.buildPythonApplication { pname = "pyre-check"; version = pyre-version; src = pyre-src; patches = [ ./pyre-bdist-wheel.patch ]; # The build-pypi-package script does some funky stuff with build # directories - easier to patch it a bit than to replace it # completely though: postPatch = '' mkdir ./build substituteInPlace scripts/build-pypi-package.sh \ --replace 'NIX_BINARY_FILE' '${pyre-bin}/bin/pyre.bin' \ --replace 'BUILD_ROOT="$(mktemp -d)"' "BUILD_ROOT=$PWD/build" for file in client/pyre.py client/commands/initialize.py client/commands/tests/initialize_test.py; do substituteInPlace "$file" \ --replace '"watchman"' '"${watchman}/bin/watchman"' done substituteInPlace client/buck.py \ --replace '"buck"' '"${buck}/bin/buck"' substituteInPlace client/tests/buck_test.py \ --replace '"buck"' '"${buck}/bin/buck"' ''; buildInputs = [ pyre-bin ]; nativeBuildInputs = [ rsync ]; # only required for build-pypi-package.sh propagatedBuildInputs = with python3.pkgs; [ docutils typeshed click-log ipython sqlalchemy munch xxhash ujson ]; buildPhase = '' bash scripts/build-pypi-package.sh --version ${pyre-version} --bundle-typeshed ${typeshed} cp -r build/dist dist ''; checkPhase = '' bash scripts/run-python-tests.sh ''; }