1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
|
{
lib,
stdenv,
buildPythonPackage,
fetchFromGitHub,
gitUpdater,
# build-system
hatchling,
hatch-requirements-txt,
hatch-fancy-pypi-readme,
# dependencies
fsspec,
httpx,
huggingface-hub,
packaging,
typing-extensions,
websockets,
# tests
gradio,
pydub,
pytest-asyncio,
pytestCheckHook,
rich,
safehttpx,
tomlkit,
writableTmpDirAsHomeHook,
}:
buildPythonPackage rec {
pname = "gradio-client";
version = "2.0.1";
pyproject = true;
# no tests on pypi
src = fetchFromGitHub {
owner = "gradio-app";
repo = "gradio";
# not to be confused with @gradio/client@${version}
# tag = "gradio_client@${version}";
# TODO: switch back to a tag next release, if they tag it.
rev = "7a8894d7249ee20c2f7a896237e290e99661fd43"; # 2.0.1
sparseCheckout = [
"client/python"
"gradio/media_assets"
];
hash = "sha256-p3okK48DJjjyvUzedNR60r5P8aKUxjE+ocb3EplZ6Uk=";
};
sourceRoot = "${src.name}/client/python";
postPatch = ''
# Because we set sourceRoot above, the folders "client/python"
# don't exist, as far as this is concerned.
substituteInPlace test/conftest.py \
--replace-fail 'from client.python.test import media_data' 'import media_data'
'';
# upstream adds upper constraints because they can, not because the need to
# https://github.com/gradio-app/gradio/pull/4885
pythonRelaxDeps = [
# only backward incompat is dropping py3.7 support
"websockets"
];
build-system = [
hatchling
hatch-requirements-txt
hatch-fancy-pypi-readme
];
dependencies = [
fsspec
httpx
huggingface-hub
packaging
typing-extensions
websockets
];
nativeCheckInputs = [
gradio.sans-reverse-dependencies
pydub
pytest-asyncio
pytestCheckHook
rich
safehttpx
tomlkit
writableTmpDirAsHomeHook
];
# ensuring we don't propagate this intermediate build
disallowedReferences = [ gradio.sans-reverse-dependencies ];
postInstall = ''
mkdir -p $out/lib/gradio
cp -r ../../gradio/media_assets $out/lib/gradio
'';
# Add a pytest hook skipping tests that access network, marking them as "Expected fail" (xfail).
preCheck = ''
cat ${./conftest-skip-network-errors.py} >> test/conftest.py
'';
pytestFlags = [
#"-x" "-Wignore" # uncomment for debugging help
];
enabledTestPaths = [
"test/"
];
disabledTestMarks = [
"flaky"
];
disabledTests = lib.optionals stdenv.hostPlatform.isDarwin [
# flaky: OSError: Cannot find empty port in range: 7860-7959
"test_layout_components_in_output"
"test_layout_and_state_components_in_output"
"test_upstream_exceptions"
"test_httpx_kwargs"
];
pythonImportsCheck = [ "gradio_client" ];
__darwinAllowLocalNetworking = true;
passthru.updateScript = gitUpdater {
rev-prefix = "gradio_client@";
ignoredVersions = ".*-(beta|dev).*";
};
meta = {
homepage = "https://www.gradio.app/";
changelog = "https://github.com/gradio-app/gradio/releases/tag/gradio_client@${version}";
description = "Lightweight library to use any Gradio app as an API";
license = lib.licenses.asl20;
maintainers = with lib.maintainers; [ pbsds ];
};
}
|