python3Packages.orjson: Disable failing tests on 32 bit
[NixPkgs.git] / pkgs / games / anki / default.nix
blob71575c35fd37d61062b3dd6c63cc8d5bd317d506
1 { stdenv
2 , buildPythonApplication
3 , lib
4 , python
5 , fetchurl
6 , fetchFromGitHub
7 , fetchpatch
8 , lame
9 , mpv-unwrapped
10 , libpulseaudio
11 , pyqtwebengine
12 , decorator
13 , beautifulsoup4
14 , sqlalchemy
15 , pyaudio
16 , requests
17 , markdown
18 , matplotlib
19 , pytest
20 , glibcLocales
21 , nose
22 , jsonschema
23 , setuptools
24 , send2trash
25 , CoreAudio
26   # This little flag adds a huge number of dependencies, but we assume that
27   # everyone wants Anki to draw plots with statistics by default.
28 , plotsSupport ? true
29   # manual
30 , asciidoc
33 let
34   # when updating, also update rev-manual to a recent version of
35   # https://github.com/ankitects/anki-docs
36   # The manual is distributed independently of the software.
37   version = "2.1.15";
38   sha256-pkg = "12dvyf3j9df4nrhhnqbzd9b21rpzkh4i6yhhangn2zf7ch0pclss";
39   rev-manual = "8f6387867ac37ef3fe9d0b986e70f898d1a49139";
40   sha256-manual = "0pm5slxn78r44ggvbksz7rv9hmlnsvn9z811r6f63dsc8vm6mfml";
42   manual = stdenv.mkDerivation {
43     pname = "anki-manual";
44     inherit version;
45     src = fetchFromGitHub {
46       owner = "ankitects";
47       repo = "anki-docs";
48       rev = rev-manual;
49       sha256 = sha256-manual;
50     };
51     dontInstall = true;
52     nativeBuildInputs = [ asciidoc ];
53     patchPhase = ''
54       # rsync isnt needed
55       # WEB is the PREFIX
56       # We remove any special ankiweb output generation
57       # and rename every .mako to .html
58       sed -e 's/rsync -a/cp -a/g' \
59           -e "s|\$(WEB)/docs|$out/share/doc/anki/html|" \
60           -e '/echo asciidoc/,/mv $@.tmp $@/c \\tasciidoc -b html5 -o $@ $<' \
61           -e 's/\.mako/.html/g' \
62           -i Makefile
63       # patch absolute links to the other language manuals
64       sed -e 's|https://apps.ankiweb.net/docs/|link:./|g' \
65           -i {manual.txt,manual.*.txt}
66       # there’s an artifact in most input files
67       sed -e '/<%def.*title.*/d' \
68           -i *.txt
69       mkdir -p $out/share/doc/anki/html
70     '';
71   };
74 buildPythonApplication rec {
75   pname = "anki";
76   inherit version;
77   format = "other";
79   src = fetchurl {
80     urls = [
81       "https://apps.ankiweb.net/downloads/current/${pname}-${version}-source.tgz"
82       # "https://apps.ankiweb.net/downloads/current/${name}-source.tgz"
83       # "http://ankisrs.net/download/mirror/${name}.tgz"
84       # "http://ankisrs.net/download/mirror/archive/${name}.tgz"
85     ];
86     sha256 = sha256-pkg;
87   };
89   outputs = [ "out" "doc" "man" ];
91   propagatedBuildInputs = [
92     pyqtwebengine
93     sqlalchemy
94     beautifulsoup4
95     send2trash
96     pyaudio
97     requests
98     decorator
99     markdown
100     jsonschema
101     setuptools
102   ]
103   ++ lib.optional plotsSupport matplotlib
104   ++ lib.optionals stdenv.isDarwin [ CoreAudio ]
105   ;
107   checkInputs = [ pytest glibcLocales nose ];
109   nativeBuildInputs = [ pyqtwebengine.wrapQtAppsHook ];
110   buildInputs = [ lame mpv-unwrapped libpulseaudio ];
112   patches = [
113     # Disable updated version check.
114     ./no-version-check.patch
115     (fetchpatch {
116       name = "fix-mpv-args.patch";
117       url = "https://sources.debian.org/data/main/a/anki/2.1.15+dfsg-3/debian/patches/fix-mpv-args.patch";
118       sha256 = "1dimnnawk64m5bbdbjrxw5k08q95l728n94cgkrrwxwavmmywaj2";
119     })
120     (fetchpatch {
121       name = "anki-2.1.15-unescape.patch";
122       url = "https://795309.bugs.gentoo.org/attachment.cgi?id=715200";
123       sha256 = "14rz864kdaba4fd1marwkyz9n1jiqnbjy4al8bvwlhpvp0rm1qk6";
124     })
125   ];
127   # Anki does not use setup.py
128   dontBuild = true;
130   postPatch = ''
131     # Remove QT translation files. We'll use the standard QT ones.
132     rm "locale/"*.qm
134     # hitting F1 should open the local manual
135     substituteInPlace anki/consts.py \
136       --replace 'HELP_SITE="http://ankisrs.net/docs/manual.html"' \
137                 'HELP_SITE="${manual}/share/doc/anki/html/manual.html"'
138   '';
140   # UTF-8 locale needed for testing
141   LC_ALL = "en_US.UTF-8";
143   # tests fail with to many open files
144   doCheck = !stdenv.isDarwin;
146   # - Anki writes some files to $HOME during tests
147   # - Skip tests using network
148   checkPhase = ''
149     HOME=$TMP pytest --ignore tests/test_sync.py
150   '';
152   installPhase = ''
153     pp=$out/lib/${python.libPrefix}/site-packages
155     mkdir -p $out/bin
156     mkdir -p $out/share/applications
157     mkdir -p $doc/share/doc/anki
158     mkdir -p $man/share/man/man1
159     mkdir -p $out/share/mime/packages
160     mkdir -p $out/share/pixmaps
161     mkdir -p $pp
163     cat > $out/bin/anki <<EOF
164     #!${python}/bin/python
165     import aqt
166     aqt.run()
167     EOF
168     chmod 755 $out/bin/anki
170     cp -v anki.desktop $out/share/applications/
171     cp -v README* LICENSE* $doc/share/doc/anki/
172     cp -v anki.1 $man/share/man/man1/
173     cp -v anki.xml $out/share/mime/packages/
174     cp -v anki.{png,xpm} $out/share/pixmaps/
175     cp -rv locale $out/share/
176     cp -rv anki aqt web $pp/
178     # copy the manual into $doc
179     cp -r ${manual}/share/doc/anki/html $doc/share/doc/anki
180   '';
182   # now wrapPythonPrograms from postFixup will add both python and qt env variables
183   dontWrapQtApps = true;
185   preFixup = ''
186     makeWrapperArgs+=(
187       "''${qtWrapperArgs[@]}"
188       --prefix PATH ':' "${lame}/bin:${mpv-unwrapped}/bin"
189     )
190   '';
192   passthru = {
193     inherit manual;
194   };
196   meta = with lib; {
197     homepage = "https://apps.ankiweb.net/";
198     description = "Spaced repetition flashcard program";
199     longDescription = ''
200       Anki is a program which makes remembering things easy. Because it is a lot
201       more efficient than traditional study methods, you can either greatly
202       decrease your time spent studying, or greatly increase the amount you learn.
204       Anyone who needs to remember things in their daily life can benefit from
205       Anki. Since it is content-agnostic and supports images, audio, videos and
206       scientific markup (via LaTeX), the possibilities are endless. For example:
207       learning a language, studying for medical and law exams, memorizing
208       people's names and faces, brushing up on geography, mastering long poems,
209       or even practicing guitar chords!
210     '';
211     license = licenses.agpl3Plus;
212     platforms = platforms.mesaPlatforms;
213     maintainers = with maintainers; [ oxij Profpatsch ];
214   };