New release: Abjad 3.27

3 views
Skip to first unread message

Trevor Bača

unread,
Jul 28, 2025, 2:53:26 PMJul 28
to abjad...@googlegroups.com
Hi,

Abjad 3.27 is now available:

https://github.com/Abjad/abjad/releases

https://pypi.org/project/abjad/

https://pypi.org/project/nauert/

https://pypi.org/project/rmakers/

Please see the Abjad 3.22 release notes for the new way of installing the nauert and makers packages.

Documentation available here:

https://abjad.github.io

https://abjad.github.io/nauert/

https://abjad.github.io/rmakers

Abjad 3.27 is a bridge release from Abjad 3.26 to Abjad 3.28:

* First-time users of Abjad should skip 3.27 and install Abajd 3.28 when it becomes available.

* Existing users of Abjad who do not port their scores forward through successive versions of Abjad should also skip 3.27 and install Abjad 3.28 (or later) when starting a new score.

* Existing users of Abjad who do port their scores forward through successive versions of Abjad will find that Abjad 3.27 contains almost 200 name changes. Users interested in porting their scores forward should first port forward all the way to Abjad 3.26; then port to Abjad 3.27 (with its large number of name changes); and then port forward to Abjad 3.28 (which contains a corresponding set of almost 200 name changes).

The large number of name changes in Abjad 3.27 and Abjad 3.28 result from refactoring all Python `@property`-decorated attributes as zero-argument methods. This change marks a major structural shift. While this is a breaking change for users who access these attributes directly, the benefits are substantial. The shift to explicit methods dramatically improves documentation quality: return types now appear clearly in the API docs, and method definitions link reliably to source code, unlike properties, which Sphinx and viewcode treat as second-class citizens. The refactor also eliminates the hidden costs of property evaluation — making it easier to reason about performance — and unifies the API around a single, easily introspectable mechanism for querying object state. Abjad 3.27 thus acts as a transitional release, clearing the way for a cleaner and more consistent API in Abjad 3.28.

Versions of Abjad prior to 3.27 implemented a large number of read-only properties and a somewhat smaller number of settable properties. Abjad 3.27 and 3.28 refactor these two different types of property like this:

Read-only properties:

    3.26: abjad.timespan.Timespan.axis
    3.27: abjad.timespan.Timespan.get_axis()
    3.28: abjad.timespan.Timespan.axis()

Settable properties:

    3.26: abjad.score.Note.written_duration
    3.27: abjad.score.Note.get_written_duration()
          abjad.score.Note.set_written_duration()
    3.28: abjad.score.Note.written_duration()
          abjad.score.Note.set_written_duration()

The result is that 3.26 read-only properties (`abjad.timespan.Timespan.axis`) are changed to 3.28 zero-argument methods (`abjad.timespan.Timespan.axis()`); the temporary change to 3.27 zero-argument methods prefixed with "get_" (`abjad.timespan.Timespan.get_axis()`) exists only to make it easier for users to make large numbers of name-changes to existing scores.

Likewise, 3.26 settable properties (`abjad.score.Note.written_duration`) that could be set with the equal sign (`note.written_duration = abjad.Duration(3, 16)`) must instead be set with the explicit "set_" method starting in 3.27 (`note.set_written_duration(abjad.Duration(3, 16))`).

The full list of changes appears in the release notes linked above.

Happy composing,

Trevor & Joséphine.

-- 
Reply all
Reply to author
Forward
0 new messages