diff --git a/abjad/docs/source/cookbook/creating_rest_delimited_slurs.rst b/abjad/docs/source/cookbook/creating_rest_delimited_slurs.rst index 3f9bbd1247e..712ab98d49f 100644 --- a/abjad/docs/source/cookbook/creating_rest_delimited_slurs.rst +++ b/abjad/docs/source/cookbook/creating_rest_delimited_slurs.rst @@ -57,8 +57,9 @@ We add slur spanners inside our loop: leaves = iterate(staff).by_class(scoretools.Leaf) for group in iterate(leaves).by_run((Note, Chord)): - slur = Slur() - attach(slur, group) + if 1 < len(group): + slur = Slur() + attach(slur, group) Here's the result: diff --git a/abjad/docs/source/reference_manual/voices.rst b/abjad/docs/source/reference_manual/voices.rst index 863496c7352..3e844684c27 100644 --- a/abjad/docs/source/reference_manual/voices.rst +++ b/abjad/docs/source/reference_manual/voices.rst @@ -67,11 +67,11 @@ Select the components in a voice like this: Selecting a voice's leaves -------------------------- -Use ``select_leaves()`` to select the leaves in a voice: +Use ``select(...).by_leaf()`` to select the leaves in a voice: .. abjad:: - voice.select_leaves() + select(voice).by_leaf() Getting the length of a voice diff --git a/abjad/etc/packaging/packaging_transcript.txt b/abjad/etc/packaging/packaging_transcript.txt index 252c5020e6b..4f08b1efd8e 100644 --- a/abjad/etc/packaging/packaging_transcript.txt +++ b/abjad/etc/packaging/packaging_transcript.txt @@ -16,29 +16,27 @@ Abjad 2.18 9. dot -V: graphviz version 2.38.0 (20140413.2041) Python 3.5.1 (OSX) test results: - 1. mainline py.test test results: - 2. mainline doctest test results: - 3. experimental py.test test results: - 4. experimental doctest test results: - 7. sanity check test results: - 8. experimental HTML build results: - 9. mainline HTML build results: + 1. mainline py.test test results: 10130 passed, 12 skipped + 2. mainline doctest test results: 12111 tests passed in 908 modules + 3. experimental py.test test results: 3 passed, 0 skipped + 4. experimental doctest test results: 120 tests passed in 43 modules + 7. sanity check test results: OK + 8. experimental HTML build results: OK + 9. mainline HTML build results: OK Python 3.5.1 (Windows) test results: - 1. mainline py.test test results: - 2. mainline doctest test results: - 3. experimental py.test test results: - 4. experimental doctest test results: - 7. sanity check test results: - 8. experimental HTML build results: - 9. mainline HTML build results: + 1. mainline py.test test results: 10128 passed, 15 skipped + 2. mainline doctest test results: 12111 tests passed in 908 modules + 3. experimental py.test test results: 3 passed, 0 skipped + 4. experimental doctest test results: 120 tests passed in 43 modules + 7. sanity check test results: OK Python 2.7.9 (OSX) test results: - 1. mainline py.test test results: - 2. mainline doctest test results: - 3. experimental py.test test results: - 4. experimental doctest test results: - 7. sanity check test results: + 1. mainline py.test test results: 10121 passed, 10 skipped + 2. mainline doctest test results: 12111 tests passed in 908 modules + 3. experimental py.test test results: 3 passed, 0 skipped + 4. experimental doctest test results: 120 tests passed in 43 modules + 7. sanity check test results: OK Abjad 2.17 diff --git a/abjad/ext/ipython.py b/abjad/ext/ipython.py index 5e62d1dcdfe..fdb58299582 100644 --- a/abjad/ext/ipython.py +++ b/abjad/ext/ipython.py @@ -31,12 +31,16 @@ def load_ipython_extension(ipython): from abjad.tools import topleveltools play = ipythontools.Play() show = ipythontools.Show() + graph = ipythontools.Graph() abjad.play = play abjad.show = show + abjad.graph = graph topleveltools.play = play topleveltools.show = show + topleveltools.graph = graph names = { 'play': play, 'show': show, + 'graph': graph, } ipython.push(names) diff --git a/abjad/tools/commandlinetools/ManageBuildTargetScript.py b/abjad/tools/commandlinetools/ManageBuildTargetScript.py index 0df3f81d880..2249eabe35f 100644 --- a/abjad/tools/commandlinetools/ManageBuildTargetScript.py +++ b/abjad/tools/commandlinetools/ManageBuildTargetScript.py @@ -434,23 +434,23 @@ def _setup_argument_parser(self, parser): help='list build targets', action='store_true', ) - action_group.add_argument( - '--copy', '-Y', - help='copy build target', - metavar=('SOURCE', 'TARGET'), - nargs=2, - ) - action_group.add_argument( - '--rename', '-M', - help='rename build target', - metavar=('SOURCE', 'TARGET'), - nargs=2, - ) - action_group.add_argument( - '--delete', '-D', - help='delete build target', - metavar='NAME', - ) +# action_group.add_argument( +# '--copy', '-Y', +# help='copy build target', +# metavar=('SOURCE', 'TARGET'), +# nargs=2, +# ) +# action_group.add_argument( +# '--rename', '-M', +# help='rename build target', +# metavar=('SOURCE', 'TARGET'), +# nargs=2, +# ) +# action_group.add_argument( +# '--delete', '-D', +# help='delete build target', +# metavar='NAME', +# ) render_group = parser.add_argument_group( '--render flags', 'Use when rendering specific assets only.', diff --git a/abjad/tools/commandlinetools/ManageMaterialScript.py b/abjad/tools/commandlinetools/ManageMaterialScript.py index 17a076adfd6..f68359c4c83 100644 --- a/abjad/tools/commandlinetools/ManageMaterialScript.py +++ b/abjad/tools/commandlinetools/ManageMaterialScript.py @@ -228,23 +228,23 @@ def _setup_argument_parser(self, parser): help='list materials', action='store_true', ) - action_group.add_argument( - '--copy', '-Y', - help='copy material', - metavar=('SOURCE', 'TARGET'), - nargs=2, - ) - action_group.add_argument( - '--rename', '-M', - help='rename material', - metavar=('SOURCE', 'TARGET'), - nargs=2, - ) - action_group.add_argument( - '--delete', '-D', - help='delete material', - metavar='NAME', - ) +# action_group.add_argument( +# '--copy', '-Y', +# help='copy material', +# metavar=('SOURCE', 'TARGET'), +# nargs=2, +# ) +# action_group.add_argument( +# '--rename', '-M', +# help='rename material', +# metavar=('SOURCE', 'TARGET'), +# nargs=2, +# ) +# action_group.add_argument( +# '--delete', '-D', +# help='delete material', +# metavar='NAME', +# ) common_group = parser.add_argument_group('common options') common_group.add_argument( '--score-path', '-s', diff --git a/abjad/tools/commandlinetools/ManageSegmentScript.py b/abjad/tools/commandlinetools/ManageSegmentScript.py index 913fa6e6359..fd0e5a446cb 100644 --- a/abjad/tools/commandlinetools/ManageSegmentScript.py +++ b/abjad/tools/commandlinetools/ManageSegmentScript.py @@ -392,23 +392,23 @@ def _setup_argument_parser(self, parser): help='list segments', action='store_true', ) - action_group.add_argument( - '--copy', '-Y', - help='copy segment', - metavar=('SOURCE', 'TARGET'), - nargs=2, - ) - action_group.add_argument( - '--rename', '-M', - help='rename segment', - metavar=('SOURCE', 'TARGET'), - nargs=2, - ) - action_group.add_argument( - '--delete', '-D', - help='delete segment', - metavar='NAME', - ) +# action_group.add_argument( +# '--copy', '-Y', +# help='copy segment', +# metavar=('SOURCE', 'TARGET'), +# nargs=2, +# ) +# action_group.add_argument( +# '--rename', '-M', +# help='rename segment', +# metavar=('SOURCE', 'TARGET'), +# nargs=2, +# ) +# action_group.add_argument( +# '--delete', '-D', +# help='delete segment', +# metavar='NAME', +# ) common_group = parser.add_argument_group('common options') common_group.add_argument( '--score-path', '-s', diff --git a/abjad/tools/ipythontools/Graph.py b/abjad/tools/ipythontools/Graph.py new file mode 100644 index 00000000000..2979c0a52e4 --- /dev/null +++ b/abjad/tools/ipythontools/Graph.py @@ -0,0 +1,78 @@ +# -*- coding: utf-8 -*- +import os +import shutil +import subprocess +import tempfile + + +class Graph(object): + r'''IPython replacement callable for `topleveltools.graph()`. + ''' + + ### SPECIAL METHODS ### + + def __call__( + self, + expr, + layout='dot', + graph_attributes=None, + node_attributes=None, + edge_attributes=None, + **kwargs + ): + r'''A replacement for Ajbad's graph function for IPython Notebook. + ''' + from abjad.tools import systemtools + from IPython.core.display import display_png + + if isinstance(expr, str): + graphviz_format = expr + else: + assert hasattr(expr, '__graph__') + graphviz_graph = expr.__graph__(**kwargs) + if graph_attributes: + graphviz_graph.attributes.update(graph_attributes) + if node_attributes: + graphviz_graph.node_attributes.update(node_attributes) + if edge_attributes: + graphviz_graph.edge_attributes.update(edge_attributes) + graphviz_format = str(graphviz_graph) + + valid_layouts = ( + 'circo', + 'dot', + 'fdp', + 'neato', + 'osage', + 'sfdp', + 'twopi', + ) + assert layout in valid_layouts + + message = 'cannot find `{}` command-line tool.' + message = message.format(layout) + message += ' Please download Graphviz from graphviz.org.' + assert systemtools.IOManager.find_executable(layout), message + assert systemtools.IOManager.find_executable('convert') + + temporary_directory = tempfile.mkdtemp() + dot_path = os.path.join(temporary_directory, 'graph.dot') + pdf_path = os.path.join(temporary_directory, 'graph.pdf') + png_path = os.path.join(temporary_directory, 'graph.png') + + with open(dot_path, 'w') as file_pointer: + file_pointer.write(graphviz_format) + + command = '{} -v -Tpdf {} -o {}' + command = command.format(layout, dot_path, pdf_path) + subprocess.call(command, shell=True) + + command = 'convert {} -trim {}' + command = command.format(pdf_path, png_path) + subprocess.call(command, shell=True) + + systemtools.IOManager.spawn_subprocess(command) + with open(png_path, 'rb') as file_pointer: + png = file_pointer.read() + shutil.rmtree(temporary_directory) + display_png(png, raw=True) diff --git a/abjad/tools/ipythontools/Play.py b/abjad/tools/ipythontools/Play.py index e454330b526..22131a7a96a 100644 --- a/abjad/tools/ipythontools/Play.py +++ b/abjad/tools/ipythontools/Play.py @@ -1,6 +1,8 @@ # -*- coding: utf-8 -*- import os import shutil +import subprocess +import sys import tempfile @@ -14,103 +16,85 @@ class Play(object): ### SPECIAL METHODS ### def __call__(self, expr): - '''Render `expr` as Vorbis audio and display it in the IPython notebook + '''Render `expr` as audio and display it in the IPython notebook as an