Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
129 changes: 6 additions & 123 deletions pkgs/development/python-modules/playwright/default.nix
Original file line number Diff line number Diff line change
@@ -1,131 +1,21 @@
{ lib
, stdenv
, buildPythonPackage
, chromium
, ffmpeg
, git
, greenlet
, jq
, nodejs
, fetchFromGitHub
, fetchurl
, makeFontsConf
, makeWrapper
, pyee
, python
, pythonOlder
, runCommand
, setuptools-scm
, unzip
, playwright-driver
}:

let
inherit (stdenv.hostPlatform) system;
throwSystem = throw "Unsupported system: ${system}";

driverVersion = "1.31.1";

driver = let
suffix = {
x86_64-linux = "linux";
aarch64-linux = "linux-arm64";
x86_64-darwin = "mac";
aarch64-darwin = "mac-arm64";
}.${system} or throwSystem;
filename = "playwright-${driverVersion}-${suffix}.zip";
in stdenv.mkDerivation {
pname = "playwright-driver";
version = driverVersion;

src = fetchurl {
url = "https://playwright.azureedge.net/builds/driver/${filename}";
sha256 = {
x86_64-linux = "1wg49kfs8fflmx8g01bkckbjkghhwy7c44akckjf7dp4lbh1z8fd";
aarch64-linux = "0f09a0cxqxihy8lmbjzii80jkpf3n5xlvhjpgdkwmrr3wh0nnixj";
x86_64-darwin = "1zd0dz8jazymcpa1im5yzxb7rwl6wn4xz19lpz83bnpd1njq01b3";
aarch64-darwin = "0hcn80zm9aki8hzsf1cljzcmi4iaw7fascs8ajj0qcwqkkm4jnw0";
}.${system} or throwSystem;
};

sourceRoot = ".";

nativeBuildInputs = [ unzip ];

postPatch = ''
# Use Nix's NodeJS instead of the bundled one.
substituteInPlace playwright.sh --replace '"$SCRIPT_PATH/node"' '"${nodejs}/bin/node"'
rm node

# Hard-code the script path to $out directory to avoid a dependency on coreutils
substituteInPlace playwright.sh \
--replace 'SCRIPT_PATH="$(cd "$(dirname "$0")" ; pwd -P)"' "SCRIPT_PATH=$out"

patchShebangs playwright.sh package/bin/*.sh
'';

installPhase = ''
runHook preInstall

mkdir -p $out/bin
mv playwright.sh $out/bin/playwright
mv package $out/

runHook postInstall
'';

passthru = {
inherit filename;
};
};

browsers-mac = stdenv.mkDerivation {
pname = "playwright-browsers";
version = driverVersion;

dontUnpack = true;

installPhase = ''
runHook preInstall

export PLAYWRIGHT_BROWSERS_PATH=$out
${driver}/bin/playwright install
rm -r $out/.links

runHook postInstall
'';

meta.platforms = lib.platforms.darwin;
};

browsers-linux = {}: let
fontconfig = makeFontsConf {
fontDirectories = [];
};
in runCommand "playwright-browsers"
{
nativeBuildInputs = [
makeWrapper
jq
];
} (''
BROWSERS_JSON=${driver}/package/browsers.json
CHROMIUM_REVISION=$(jq -r '.browsers[] | select(.name == "chromium").revision' $BROWSERS_JSON)
mkdir -p $out/chromium-$CHROMIUM_REVISION/chrome-linux

# See here for the Chrome options:
# https://github.com/NixOS/nixpkgs/issues/136207#issuecomment-908637738
makeWrapper ${chromium}/bin/chromium $out/chromium-$CHROMIUM_REVISION/chrome-linux/chrome \
--set SSL_CERT_FILE /etc/ssl/certs/ca-bundle.crt \
--set FONTCONFIG_FILE ${fontconfig}

FFMPEG_REVISION=$(jq -r '.browsers[] | select(.name == "ffmpeg").revision' $BROWSERS_JSON)
mkdir -p $out/ffmpeg-$FFMPEG_REVISION
ln -s ${ffmpeg}/bin/ffmpeg $out/ffmpeg-$FFMPEG_REVISION/ffmpeg-linux
'');
driver = playwright-driver;
in
buildPythonPackage rec {
pname = "playwright";
version = "1.31.1";
version = "1.31.1";
format = "setuptools";
disabled = pythonOlder "3.7";

Expand Down Expand Up @@ -191,18 +81,11 @@ buildPythonPackage rec {
"playwright"
];

passthru = rec {
passthru = {
inherit driver;
browsers = {
x86_64-linux = browsers-linux { };
aarch64-linux = browsers-linux { };
x86_64-darwin = browsers-mac;
aarch64-darwin = browsers-mac;
}.${system} or throwSystem;
browsers-chromium = browsers-linux { };

tests = {
inherit driver browsers;
driver = playwright-driver;
browsers = playwright-driver.browsers;
};
};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
, fetchFromGitHub
, buildPythonPackage
, playwright
, playwright-driver
, pytest
, pytest-base-url
, pytestCheckHook
Expand Down Expand Up @@ -46,7 +47,7 @@ buildPythonPackage rec {
doCheck = false;

preCheck = ''
export PLAYWRIGHT_BROWSERS_PATH=${playwright.browsers}
export PLAYWRIGHT_BROWSERS_PATH=${playwright-driver.browsers}
'';

pythonImportsCheck = [
Expand Down
130 changes: 130 additions & 0 deletions pkgs/development/web/playwright/driver.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,130 @@
{ lib
, stdenv
, chromium
, ffmpeg
, git
, jq
, nodejs
, fetchFromGitHub
, fetchurl
, makeFontsConf
, makeWrapper
, runCommand
, unzip
}:
let
inherit (stdenv.hostPlatform) system;

throwSystem = throw "Unsupported system: ${system}";

driver = stdenv.mkDerivation (finalAttrs:
let
suffix = {
x86_64-linux = "linux";
aarch64-linux = "linux-arm64";
x86_64-darwin = "mac";
aarch64-darwin = "mac-arm64";
}.${system} or throwSystem;
filename = "playwright-${finalAttrs.version}-${suffix}.zip";
in
{
pname = "playwright-driver";
version = "1.31.1";

src = fetchurl {
url = "https://playwright.azureedge.net/builds/driver/${filename}";
sha256 = {
x86_64-linux = "1wg49kfs8fflmx8g01bkckbjkghhwy7c44akckjf7dp4lbh1z8fd";
aarch64-linux = "0f09a0cxqxihy8lmbjzii80jkpf3n5xlvhjpgdkwmrr3wh0nnixj";
x86_64-darwin = "1zd0dz8jazymcpa1im5yzxb7rwl6wn4xz19lpz83bnpd1njq01b3";
aarch64-darwin = "0hcn80zm9aki8hzsf1cljzcmi4iaw7fascs8ajj0qcwqkkm4jnw0";
}.${system} or throwSystem;
};

sourceRoot = ".";

nativeBuildInputs = [ unzip ];

postPatch = ''
# Use Nix's NodeJS instead of the bundled one.
substituteInPlace playwright.sh --replace '"$SCRIPT_PATH/node"' '"${nodejs}/bin/node"'
rm node

# Hard-code the script path to $out directory to avoid a dependency on coreutils
substituteInPlace playwright.sh \
--replace 'SCRIPT_PATH="$(cd "$(dirname "$0")" ; pwd -P)"' "SCRIPT_PATH=$out"

patchShebangs playwright.sh package/bin/*.sh
'';

installPhase = ''
runHook preInstall

mkdir -p $out/bin
mv playwright.sh $out/bin/playwright
mv package $out/

runHook postInstall
'';

passthru = {
inherit filename;
browsers = {
x86_64-linux = browsers-linux { };
aarch64-linux = browsers-linux { };
x86_64-darwin = browsers-mac;
aarch64-darwin = browsers-mac;
}.${system} or throwSystem;
browsers-chromium = browsers-linux {};
};
});

browsers-mac = stdenv.mkDerivation {
pname = "playwright-browsers";
inherit (driver) version;

dontUnpack = true;

installPhase = ''
runHook preInstall

export PLAYWRIGHT_BROWSERS_PATH=$out
${driver}/bin/playwright install
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I doubt that we are cross friendly right now but we should put driver into nativeBuildInputs to be more ready for it.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is just code moving around, if someone wants to do cross compilation he can do it in a follow up PR

rm -r $out/.links

runHook postInstall
'';

meta.platforms = lib.platforms.darwin;
};

browsers-linux = { withChromium ? true }: let
fontconfig = makeFontsConf {
fontDirectories = [];
};
in
runCommand ("playwright-browsers"
+ lib.optionalString withChromium "-chromium")
{
nativeBuildInputs = [
makeWrapper
jq
];
} (''
BROWSERS_JSON=${driver}/package/browsers.json
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does this need to be an env? Otherwise we should put it into a nix string

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this was just copy/pasted from the current derivation

'' + lib.optionalString withChromium ''
CHROMIUM_REVISION=$(jq -r '.browsers[] | select(.name == "chromium").revision' $BROWSERS_JSON)
mkdir -p $out/chromium-$CHROMIUM_REVISION/chrome-linux

# See here for the Chrome options:
# https://github.com/NixOS/nixpkgs/issues/136207#issuecomment-908637738
makeWrapper ${chromium}/bin/chromium $out/chromium-$CHROMIUM_REVISION/chrome-linux/chrome \
--set SSL_CERT_FILE /etc/ssl/certs/ca-bundle.crt \
--set FONTCONFIG_FILE ${fontconfig}
'' + ''
FFMPEG_REVISION=$(jq -r '.browsers[] | select(.name == "ffmpeg").revision' $BROWSERS_JSON)
mkdir -p $out/ffmpeg-$FFMPEG_REVISION
ln -s ${ffmpeg}/bin/ffmpeg $out/ffmpeg-$FFMPEG_REVISION/ffmpeg-linux
'');
in
driver
2 changes: 2 additions & 0 deletions pkgs/top-level/all-packages.nix
Original file line number Diff line number Diff line change
Expand Up @@ -11134,6 +11134,8 @@ with pkgs;

playwright = with python3Packages; toPythonApplication playwright;

playwright-driver = callPackage ../development/web/playwright/driver.nix { };

please = callPackage ../tools/security/please { };

plecost = callPackage ../tools/security/plecost { };
Expand Down
4 changes: 1 addition & 3 deletions pkgs/top-level/python-packages.nix
Original file line number Diff line number Diff line change
Expand Up @@ -7400,9 +7400,7 @@ self: super: with self; {

pkuseg = callPackage ../development/python-modules/pkuseg { };

playwright = callPackage ../development/python-modules/playwright {
inherit (pkgs) jq;
};
playwright = callPackage ../development/python-modules/playwright { };

pmsensor = callPackage ../development/python-modules/pmsensor { };

Expand Down