diff --git a/nixos/modules/programs/xonsh.nix b/nixos/modules/programs/xonsh.nix index 6bf18d4ebd89..86bdb4088845 100644 --- a/nixos/modules/programs/xonsh.nix +++ b/nixos/modules/programs/xonsh.nix @@ -23,7 +23,7 @@ in }; package = lib.mkPackageOption pkgs "xonsh" { - example = "xonsh.wrapper.override { extraPackages = ps: [ ps.requests ]; }"; + example = "pkgs.xonsh.override { extraPackages = ps: [ ps.requests ]; }"; }; config = lib.mkOption { diff --git a/pkgs/by-name/xo/xonsh/package.nix b/pkgs/by-name/xo/xonsh/package.nix index 60b96dd67f24..2cf2b9241ca4 100644 --- a/pkgs/by-name/xo/xonsh/package.nix +++ b/pkgs/by-name/xo/xonsh/package.nix @@ -1,118 +1,24 @@ { lib, - callPackage, - coreutils, - fetchFromGitHub, - git, - gitUpdater, - glibcLocales, - python3Packages, + python3, + runCommand, + # configurable options + extraPackages ? (ps: [ ]), }: let - - argset = { - pname = "xonsh"; - version = "0.17.0"; - pyproject = true; - - # PyPI package ships incomplete tests - src = fetchFromGitHub { - owner = "xonsh"; - repo = "xonsh"; - rev = "refs/tags/${argset.version}"; - hash = "sha256-9sRY9aetWWXzCFfgdHCBCia48THIJcMxsYMnFR6Xa8A="; - }; - - nativeBuildInputs = with python3Packages; [ - setuptools - wheel - ]; - - propagatedBuildInputs = (with python3Packages; [ - ply - prompt-toolkit - pygments - ]); - - nativeCheckInputs = [ - git - glibcLocales - ] ++ (with python3Packages; [ - pip - pyte - pytest-mock - pytest-subprocess - pytestCheckHook - requests - ]); - - disabledTests = [ - # fails on sandbox - "test_colorize_file" - "test_loading_correctly" - "test_no_command_path_completion" - "test_bsd_man_page_completions" - "test_xonsh_activator" - # fails on non-interactive shells - "test_capture_always" - "test_casting" - "test_command_pipeline_capture" - "test_dirty_working_directory" - "test_man_completion" - "test_vc_get_branch" - "test_bash_and_is_alias_is_only_functional_alias" - "test_spec_modifier_alias_output_format" - # flaky tests - "test_script" - "test_alias_stability" - "test_alias_stability_exception" - "test_complete_import" - "test_subproc_output_format" - ]; - - disabledTestPaths = [ - # fails on sandbox - "tests/completers/test_command_completers.py" - "tests/test_ptk_highlight.py" - "tests/test_ptk_shell.py" - # fails on non-interactive shells - "tests/prompt/test_gitstatus.py" - "tests/completers/test_bash_completer.py" - ]; - - env.LC_ALL = "en_US.UTF-8"; - - postPatch = '' - sed -ie 's|/bin/ls|${lib.getExe' coreutils "ls"}|' tests/test_execer.py - sed -ie 's|SHELL=xonsh|SHELL=$out/bin/xonsh|' tests/test_integrations.py - - for script in tests/test_integrations.py scripts/xon.sh $(find -name "*.xsh"); do - sed -ie 's|/usr/bin/env|${lib.getExe' coreutils "env"}|' $script - done - patchShebangs . - ''; - - preCheck = '' - export HOME=$TMPDIR - export PATH=$out/bin:$PATH - ''; - - passthru = { - shellPath = "/bin/xonsh"; - python = python3Packages.python; # To the wrapper - wrapper = callPackage ./wrapper.nix { }; - updateScript = gitUpdater { }; - }; - - meta = { - homepage = "https://xon.sh/"; - description = "A Python-ish, BASHwards-compatible shell"; - changelog = "https://github.com/xonsh/xonsh/raw/main/CHANGELOG.rst"; - license = with lib.licenses; [ bsd3 ]; - mainProgram = "xonsh"; - maintainers = with lib.maintainers; [ samlukeyes123 ]; - }; - }; + pythonEnv = python3.withPackages + (ps: [ ps.xonsh ] ++ extraPackages ps); + xonsh = python3.pkgs.xonsh; in -python3Packages.buildPythonApplication argset +runCommand + "xonsh-${xonsh.version}" + { + inherit (xonsh) pname version meta passthru; + } + '' + mkdir -p $out/bin + for bin in ${lib.getBin xonsh}/bin/*; do + ln -s ${pythonEnv}/bin/$(basename "$bin") $out/bin/ + done + '' diff --git a/pkgs/by-name/xo/xonsh/unwrapped.nix b/pkgs/by-name/xo/xonsh/unwrapped.nix new file mode 100644 index 000000000000..4b9f6c6e3cfc --- /dev/null +++ b/pkgs/by-name/xo/xonsh/unwrapped.nix @@ -0,0 +1,128 @@ +{ + lib, + coreutils, + fetchFromGitHub, + git, + gitUpdater, + glibcLocales, + pythonPackages, +}: + +let + + argset = { + pname = "xonsh"; + version = "0.18.2"; + pyproject = true; + + # PyPI package ships incomplete tests + src = fetchFromGitHub { + owner = "xonsh"; + repo = "xonsh"; + rev = "refs/tags/${argset.version}"; + hash = "sha256-iTdUu2yGixWwDJICDLfzRcwgGe+xlq2CvxUeSbmDiUU="; + }; + + nativeBuildInputs = with pythonPackages; [ + setuptools + wheel + ]; + + propagatedBuildInputs = ( + with pythonPackages; + [ + ply + prompt-toolkit + pygments + ] + ); + + nativeCheckInputs = + [ + git + glibcLocales + ] + ++ (with pythonPackages; [ + pip + pyte + pytest-mock + pytest-subprocess + pytestCheckHook + requests + ]); + + disabledTests = [ + # fails on sandbox + "test_colorize_file" + "test_loading_correctly" + "test_no_command_path_completion" + "test_bsd_man_page_completions" + "test_xonsh_activator" + + # fails on non-interactive shells + "test_capture_always" + "test_casting" + "test_command_pipeline_capture" + "test_dirty_working_directory" + "test_man_completion" + "test_vc_get_branch" + "test_bash_and_is_alias_is_only_functional_alias" + + # flaky tests + "test_script" + "test_alias_stability" + "test_alias_stability_exception" + "test_complete_import" + "test_subproc_output_format" + + # https://github.com/xonsh/xonsh/issues/5569 + "test_spec_decorator_alias_output_format" + ]; + + disabledTestPaths = [ + # fails on sandbox + "tests/completers/test_command_completers.py" + "tests/shell/test_ptk_highlight.py" + # fails on non-interactive shells + "tests/prompt/test_gitstatus.py" + "tests/completers/test_bash_completer.py" + ]; + + # https://github.com/NixOS/nixpkgs/issues/248978 + dontWrapPythonPrograms = true; + + env.LC_ALL = "en_US.UTF-8"; + + postPatch = '' + sed -ie 's|/bin/ls|${lib.getExe' coreutils "ls"}|' tests/test_execer.py + sed -ie 's|SHELL=xonsh|SHELL=$out/bin/xonsh|' tests/test_integrations.py + + for script in tests/test_integrations.py scripts/xon.sh $(find -name "*.xsh"); do + sed -ie 's|/usr/bin/env|${lib.getExe' coreutils "env"}|' $script + done + patchShebangs . + ''; + + preCheck = '' + export HOME=$TMPDIR + export PATH=$out/bin:$PATH + ''; + + passthru = { + shellPath = "/bin/xonsh"; + python = pythonPackages.python; # To the wrapper + wrapper = throw "The top-level xonsh package is now wrapped. Use it directly."; + updateScript = gitUpdater { }; + }; + + meta = { + homepage = "https://xon.sh/"; + description = "Python-ish, BASHwards-compatible shell"; + changelog = "https://github.com/xonsh/xonsh/raw/main/CHANGELOG.rst"; + license = with lib.licenses; [ bsd3 ]; + mainProgram = "xonsh"; + maintainers = with lib.maintainers; [ samlukeyes123 ]; + }; + }; +in +pythonPackages.buildPythonPackage argset diff --git a/pkgs/by-name/xo/xonsh/wrapper.nix b/pkgs/by-name/xo/xonsh/wrapper.nix deleted file mode 100644 index 1b9637f04dd6..000000000000 --- a/pkgs/by-name/xo/xonsh/wrapper.nix +++ /dev/null @@ -1,25 +0,0 @@ -{ - lib, - runCommand, - xonsh, - # configurable options - extraPackages ? (ps: [ ]), -}: - -let - inherit (xonsh.passthru) python; - - pythonEnv = python.withPackages - (ps: [ (ps.toPythonModule xonsh) ] ++ extraPackages ps); -in -runCommand - "xonsh-wrapped-${xonsh.version}" - { - inherit (xonsh) pname version meta passthru; - } - '' - mkdir -p $out/bin - for bin in ${lib.getBin xonsh}/bin/*; do - ln -s ${pythonEnv}/bin/$(basename "$bin") $out/bin/ - done - '' diff --git a/pkgs/top-level/python-packages.nix b/pkgs/top-level/python-packages.nix index 7b8140fa845e..710161682328 100644 --- a/pkgs/top-level/python-packages.nix +++ b/pkgs/top-level/python-packages.nix @@ -17697,9 +17697,7 @@ self: super: with self; { xnd = callPackage ../development/python-modules/xnd { }; - xonsh = toPythonModule (pkgs.xonsh.override { - python3Packages = self; - }); + xonsh = callPackage ../by-name/xo/xonsh/unwrapped.nix { }; xpath-expressions = callPackage ../development/python-modules/xpath-expressions { };