about summary refs log tree commit diff
path: root/nixpkgs/pkgs/games/anki
diff options
context:
space:
mode:
Diffstat (limited to 'nixpkgs/pkgs/games/anki')
-rw-r--r--nixpkgs/pkgs/games/anki/default.nix192
-rw-r--r--nixpkgs/pkgs/games/anki/no-version-check.patch13
2 files changed, 205 insertions, 0 deletions
diff --git a/nixpkgs/pkgs/games/anki/default.nix b/nixpkgs/pkgs/games/anki/default.nix
new file mode 100644
index 000000000000..c9a227b98db1
--- /dev/null
+++ b/nixpkgs/pkgs/games/anki/default.nix
@@ -0,0 +1,192 @@
+{ stdenv
+, buildPythonApplication
+, callPackage
+, lib
+, python
+, fetchurl
+, fetchpatch
+, fetchFromGitHub
+, lame
+, mplayer
+, libpulseaudio
+, pyqt5
+, decorator
+, beautifulsoup4
+, sqlalchemy
+, pyaudio
+, requests
+, markdown
+, matplotlib
+, pytest
+, glibcLocales
+, nose
+, send2trash
+, CoreAudio
+# This little flag adds a huge number of dependencies, but we assume that
+# everyone wants Anki to draw plots with statistics by default.
+, plotsSupport ? true
+# manual
+, asciidoc
+}:
+
+let
+    # when updating, also update rev-manual to a recent version of
+    # https://github.com/dae/ankidocs
+    # The manual is distributed independently of the software.
+    version = "2.1.9";
+    sha256-pkg = "0p4admjxs0gwc54hby9kc1isg99ghxd5kpy08w9hrk3mcyq74z3i";
+    rev-manual = "c2c443bf991089534b0193029f6ee34908124e80";
+    sha256-manual = "1jwm5zrydc6qis7zslfqj56d083kpbzbl51n0x4czhskm9pjh7qd";
+
+    manual = stdenv.mkDerivation {
+      name = "anki-manual-${version}";
+      src = fetchFromGitHub {
+        owner = "dae";
+        repo = "ankidocs";
+        rev = rev-manual;
+        sha256 = sha256-manual;
+      };
+      phases = [ "unpackPhase" "patchPhase" "buildPhase" ];
+      nativeBuildInputs = [ asciidoc ];
+      patchPhase = ''
+        # rsync isnt needed
+        # WEB is the PREFIX
+        # We remove any special ankiweb output generation
+        # and rename every .mako to .html
+        sed -e 's/rsync -a/cp -a/g' \
+            -e "s|\$(WEB)/docs|$out/share/doc/anki/html|" \
+            -e '/echo asciidoc/,/mv $@.tmp $@/c \\tasciidoc -b html5 -o $@ $<' \
+            -e 's/\.mako/.html/g' \
+            -i Makefile
+        # patch absolute links to the other language manuals
+        sed -e 's|https://apps.ankiweb.net/docs/|link:./|g' \
+            -i {manual.txt,manual.*.txt}
+        # there’s an artifact in most input files
+        sed -e '/<%def.*title.*/d' \
+            -i *.txt
+        mkdir -p $out/share/doc/anki/html
+      '';
+    };
+
+in
+buildPythonApplication rec {
+    name = "anki-${version}";
+
+    src = fetchurl {
+      urls = [
+        "https://apps.ankiweb.net/downloads/current/${name}-source.tgz"
+        # "https://apps.ankiweb.net/downloads/current/${name}-source.tgz"
+        # "http://ankisrs.net/download/mirror/${name}.tgz"
+        # "http://ankisrs.net/download/mirror/archive/${name}.tgz"
+      ];
+      sha256 = sha256-pkg;
+    };
+
+    outputs = [ "out" "doc" "man" ];
+
+    propagatedBuildInputs = [
+      pyqt5 sqlalchemy beautifulsoup4 send2trash pyaudio requests decorator
+      markdown
+    ]
+      ++ lib.optional plotsSupport matplotlib
+      ++ lib.optional stdenv.isDarwin [ CoreAudio ]
+      ;
+
+    checkInputs = [ pytest glibcLocales nose ];
+
+    buildInputs = [ lame mplayer libpulseaudio  ];
+
+    makeWrapperArgs = [
+        ''--prefix PATH ':' "${lame}/bin:${mplayer}/bin"''
+    ];
+
+    patches = [
+      # Disable updated version check.
+      ./no-version-check.patch
+    ];
+
+    buildPhase = ''
+      # Dummy build phase
+      # Anki does not use setup.py
+    '';
+
+    postPatch = ''
+      # Remove unused starter. We'll create our own, minimalistic,
+      # starter.
+      # rm anki/anki
+
+      # Remove QT translation files. We'll use the standard QT ones.
+      rm "locale/"*.qm
+
+      # hitting F1 should open the local manual
+      substituteInPlace anki/consts.py \
+        --replace 'HELP_SITE="http://ankisrs.net/docs/manual.html"' \
+                  'HELP_SITE="${manual}/share/doc/anki/html/manual.html"'
+    '';
+
+    # UTF-8 locale needed for testing
+    LC_ALL = "en_US.UTF-8";
+
+    checkPhase = ''
+      # - Anki writes some files to $HOME during tests
+      # - Skip tests using network
+      env HOME=$TMP pytest --ignore tests/test_sync.py
+    '';
+
+    installPhase = ''
+      pp=$out/lib/${python.libPrefix}/site-packages
+
+      mkdir -p $out/bin
+      mkdir -p $out/share/applications
+      mkdir -p $doc/share/doc/anki
+      mkdir -p $man/share/man/man1
+      mkdir -p $out/share/mime/packages
+      mkdir -p $out/share/pixmaps
+      mkdir -p $pp
+
+      cat > $out/bin/anki <<EOF
+      #!${python}/bin/python
+      import aqt
+      aqt.run()
+      EOF
+      chmod 755 $out/bin/anki
+
+      cp -v anki.desktop $out/share/applications/
+      cp -v README* LICENSE* $doc/share/doc/anki/
+      cp -v anki.1 $man/share/man/man1/
+      cp -v anki.xml $out/share/mime/packages/
+      cp -v anki.{png,xpm} $out/share/pixmaps/
+      cp -rv locale $out/share/
+      cp -rv anki aqt web $pp/
+
+      wrapPythonPrograms
+
+      # copy the manual into $doc
+      cp -r ${manual}/share/doc/anki/html $doc/share/doc/anki
+    '';
+
+    passthru = {
+      inherit manual;
+    };
+
+    meta = with stdenv.lib; {
+      homepage = "https://apps.ankiweb.net/";
+      description = "Spaced repetition flashcard program";
+      longDescription = ''
+        Anki is a program which makes remembering things easy. Because it is a lot
+        more efficient than traditional study methods, you can either greatly
+        decrease your time spent studying, or greatly increase the amount you learn.
+
+        Anyone who needs to remember things in their daily life can benefit from
+        Anki. Since it is content-agnostic and supports images, audio, videos and
+        scientific markup (via LaTeX), the possibilities are endless. For example:
+        learning a language, studying for medical and law exams, memorizing
+        people's names and faces, brushing up on geography, mastering long poems,
+        or even practicing guitar chords!
+      '';
+      license = licenses.agpl3Plus;
+      broken = stdenv.hostPlatform.isAarch64;
+      platforms = platforms.mesaPlatforms;
+      maintainers = with maintainers; [ the-kenny Profpatsch ];
+    };
+}
diff --git a/nixpkgs/pkgs/games/anki/no-version-check.patch b/nixpkgs/pkgs/games/anki/no-version-check.patch
new file mode 100644
index 000000000000..ce166b4b87d5
--- /dev/null
+++ b/nixpkgs/pkgs/games/anki/no-version-check.patch
@@ -0,0 +1,13 @@
+diff -Nurp anki-2.0.33.orig/aqt/main.py anki-2.0.33/aqt/main.py
+--- anki-2.0.33.orig/aqt/main.py	2016-01-05 21:37:53.904533750 +0100
++++ anki-2.0.33/aqt/main.py	2016-01-05 21:39:11.469175976 +0100
+@@ -820,6 +820,9 @@ title="%s">%s</button>''' % (
+     ##########################################################################
+ 
+     def setupAutoUpdate(self):
++        # Don't check for latest version since the versions are
++        # managed in Nixpkgs.
++        return
+         import aqt.update
+         self.autoUpdate = aqt.update.LatestVersionFinder(self)
+         self.connect(self.autoUpdate, SIGNAL("newVerAvail"), self.newVerAvail)