1{
2 lib,
3 buildPythonPackage,
4 fetchPypi,
5 ply,
6 roman,
7 uqbar,
8 pythonOlder,
9 pythonAtLeast,
10 pytestCheckHook,
11 lilypond,
12 typing-extensions,
13}:
14
15buildPythonPackage rec {
16 pname = "abjad";
17 version = "3.28";
18 format = "setuptools";
19
20 # see issue upstream indicating Python 3.12 support will come
21 # with version 3.20: https://github.com/Abjad/abjad/issues/1574
22 disabled = pythonOlder "3.10" || pythonAtLeast "3.12";
23
24 src = fetchPypi {
25 inherit pname version;
26 hash = "sha256-J4LPOSz34GvDRwpCG8yt4LAqt+dhDrfG/W451bZRpgk=";
27 };
28
29 propagatedBuildInputs = [
30 ply
31 roman
32 uqbar
33 typing-extensions
34 ];
35
36 buildInputs = [ lilypond ];
37
38 nativeCheckInputs = [ pytestCheckHook ];
39
40 postPatch = ''
41 substituteInPlace abjad/io.py \
42 --replace-fail 'lilypond_path = self.get_lilypond_path()' \
43 'lilypond_path = "${lilypond}/bin/lilypond"'
44 # general invocations of binary for IO purposes
45
46 substituteInPlace abjad/configuration.py \
47 --replace-fail '["lilypond"' '["${lilypond}/bin/lilypond"'
48 # get_lilypond_version_string
49 '';
50
51 pythonImportsCheck = [ "abjad" ];
52
53 meta = {
54 description = "GNU LilyPond wrapper for Python";
55 longDescription = ''
56 Abjad helps composers build up complex pieces of music notation in
57 iterative and incremental ways. Use Abjad to create a symbolic
58 representation of all the notes, rests, chords, tuplets, beams and slurs
59 in any score. Because Abjad extends the Python programming language, you
60 can use Abjad to make systematic changes to music as you work. Because
61 Abjad wraps the LilyPond music notation package, you can use Abjad to
62 control the typographic detail of symbols on the page.
63 '';
64 license = lib.licenses.mit;
65 homepage = "https://abjad.github.io/";
66 changelog = "https://abjad.github.io/appendices/changes.html";
67 maintainers = [ lib.maintainers.davisrichard437 ];
68 };
69}