1{
2 lib,
3 buildPythonPackage,
4 click,
5 fetchFromGitHub,
6 pythonOlder,
7 setuptools,
8 orjson,
9 curl-cffi,
10
11 # To build orjson
12 rustPlatform,
13
14 # Optional dependencies
15 lxml,
16}:
17let
18 curl-cffi_0_7_0 = curl-cffi.overrideAttrs (
19 final: old: {
20 version = "0.7.0b4";
21 src = fetchFromGitHub {
22 owner = "yifeikong";
23 repo = "curl_cffi";
24 rev = "v${final.version}";
25 hash = "sha256-txrJNUzswAPeH4Iazn0iKJI0Rqk0HHRoDrtTfDHKMoo=";
26 };
27 }
28 );
29
30 orjson_3_10_3 = orjson.overrideAttrs (
31 final: old: {
32 version = "3.10.3";
33 src = fetchFromGitHub {
34 owner = "ijl";
35 repo = "orjson";
36 rev = "refs/tags/${final.version}";
37 hash = "sha256-bK6wA8P/IXEbiuJAx7psd0nUUKjR1jX4scFfJr1MBAk=";
38 };
39 cargoDeps = rustPlatform.fetchCargoTarball {
40 inherit (final) src;
41 name = "${old.pname}-${final.version}";
42 hash = "sha256-ilGq+/gPSuNwURUWy2ZxInzmUv+PxYMxd8esxrMpr2o=";
43 };
44 }
45 );
46in
47buildPythonPackage rec {
48 pname = "duckduckgo-search";
49 version = "v5.3.1";
50 pyproject = true;
51
52 disabled = pythonOlder "3.8";
53
54 src = fetchFromGitHub {
55 owner = "deedy5";
56 repo = "duckduckgo_search";
57 rev = version;
58 hash = "sha256-T7rlB3dU7y+HbHr1Ss9KkejlXFORhnv9Va7cFTRtfQU=";
59 };
60
61 nativeBuildInputs = [ setuptools ];
62
63 propagatedBuildInputs = [
64 click
65 orjson_3_10_3
66 curl-cffi_0_7_0
67 ];
68
69 passthru.optional-dependencies = {
70 lxml = [ lxml ];
71 };
72
73 doCheck = false; # tests require network access
74
75 pythonImportsCheck = [ "duckduckgo_search" ];
76
77 meta = {
78 description = "Python CLI and library for searching for words, documents, images, videos, news, maps and text translation using the DuckDuckGo.com search engine";
79 mainProgram = "ddgs";
80 homepage = "https://github.com/deedy5/duckduckgo_search";
81 changelog = "https://github.com/deedy5/duckduckgo_search/releases/tag/${version}";
82 license = lib.licenses.mit;
83 maintainers = with lib.maintainers; [ drawbu ];
84 };
85}