Skip to content

Commit a9d2797

Browse files
committed
Replace *pygraphviz* with *pydot* to simplify installation.
References colour-science/colour#1298. Signed-off-by: Thomas Mansencal <[email protected]>
1 parent 3980e45 commit a9d2797

File tree

4 files changed

+67
-46
lines changed

4 files changed

+67
-46
lines changed

README.rst

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -87,10 +87,9 @@ as follows::
8787
poetry install --with optional
8888

8989
The *aces-dev* *CTL* reference graph can be plotted but it requires `Graphviz <https://graphviz.org>`__
90-
to be installed on the system and having installed the optional `pygraphviz <https://pypi.org/project/pygraphviz>`__:
91-
python package::
90+
to be installed on the system::
9291

93-
poetry install --with graphviz,optional
92+
poetry install --with optional
9493

9594
Docker
9695
~~~~~~
@@ -134,7 +133,7 @@ Optional Dependencies
134133
- `graphviz <https://www.graphviz.org>`__
135134
- `jsonpickle <https://jsonpickle.github.io>`__
136135
- `networkx <https://pypi.org/project/networkx>`__
137-
- `pygraphviz <https://pypi.org/project/pygraphviz>`__
136+
- `pydot <https://pypi.org/project/pydot>`__
138137

139138
Development Dependencies
140139
************************

docs/installation.rst

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,9 @@ as follows::
3535
poetry install --with optional
3636

3737
The *aces-dev* *CTL* reference graph can be plotted but it requires `Graphviz <https://graphviz.org>`__
38-
to be installed on the system and having installed the optional `pygraphviz <https://pypi.org/project/pygraphviz>`__:
39-
python package::
38+
to be installed on the system::
4039

41-
poetry install --with graphviz,optional
40+
poetry install --with optional
4241

4342
Docker
4443
------
@@ -82,7 +81,7 @@ Optional Dependencies
8281
- `graphviz <https://www.graphviz.org>`__
8382
- `jsonpickle <https://jsonpickle.github.io>`__
8483
- `networkx <https://pypi.org/project/networkx>`__
85-
- `pygraphviz <https://pypi.org/project/pygraphviz>`__
84+
- `pydot <https://pypi.org/project/pydot>`__
8685

8786
Development Dependencies
8887
************************

opencolorio_config_aces/config/reference/discover/graph.py

Lines changed: 60 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import codecs
1919
import logging
20+
import os
2021
import pickle
2122

2223
from opencolorio_config_aces.config.reference.discover.classify import (
@@ -299,11 +300,11 @@ def conversion_path(graph, source, target):
299300

300301

301302
@required("NetworkX")
302-
def plot_aces_conversion_graph(graph, filename, prog="dot", args=""):
303+
def plot_aces_conversion_graph(graph, filename, prog="dot"):
303304
"""
304305
Plot given *aces-dev* conversion graph using
305306
`Graphviz <https://www.graphviz.org/>`__ and
306-
`pyraphviz <https://pygraphviz.github.io>`__.
307+
`Pydot <https://pypi.org/project/pydot/>`__.
307308
308309
Parameters
309310
----------
@@ -314,72 +315,96 @@ def plot_aces_conversion_graph(graph, filename, prog="dot", args=""):
314315
prog : unicode, optional
315316
{'neato', 'dot', 'twopi', 'circo', 'fdp', 'nop'},
316317
*Graphviz* layout method.
317-
args : unicode, optional
318-
Additional arguments for *Graphviz*.
319318
320319
Returns
321320
-------
322-
AGraph
323-
*PyGraphviz* graph.
321+
Dot
322+
*Pydot* graph.
324323
"""
325324

326325
import networkx as nx
326+
from pydot import Subgraph
327327

328-
agraph = nx.nx_agraph.to_agraph(graph)
329-
330-
agraph.node_attr.update(
331-
style="filled", shape="circle", fontname="Helvetica", fontsize=20
332-
)
328+
dot = nx.drawing.nx_pydot.to_pydot(graph)
333329

334330
ctl_transforms_csc = []
335331
ctl_transforms_idt = []
336332
ctl_transforms_odt = []
337333
ctl_transforms_output_transform = []
338334
ctl_transforms_lmt = []
339335

340-
for node in agraph.nodes():
336+
for node in dot.get_nodes():
337+
node.set_style("filled")
338+
node.set_shape("circle")
339+
node.set_fontname("Helvetica")
340+
node.set_fontsize(20)
341+
341342
unserialized = pickle.loads( # noqa: S301
342-
codecs.decode(node.attr["serialized"].encode(), "base64")
343+
codecs.decode(node.get_attributes()["serialized"].encode(), "base64")
343344
)
344345

345346
ctl_transform_type = unserialized.type
346347
if node in ("ACES2065-1", "OCES"):
347-
node.attr.update(
348-
shape="doublecircle",
349-
color="#673AB7FF",
350-
fillcolor="#673AB770",
351-
fontsize=30,
352-
)
348+
node.set_shape("doublecircle")
349+
node.set_color("#673AB7FF")
350+
node.set_fillcolor("#673AB7FF")
351+
node.set_fontsize(30)
353352
elif ctl_transform_type == "ACEScsc":
354-
node.attr.update(color="#00BCD4FF", fillcolor="#00BCD470")
353+
node.set_color("#00BCD4FF")
354+
node.set_fillcolor("#00BCD470")
355355
ctl_transforms_csc.append(node)
356356
elif ctl_transform_type == "IDT":
357-
node.attr.update(color="#B3BC6D", fillcolor="#E6EE9C")
357+
node.set_color("#B3BC6D")
358+
node.set_fillcolor("#E6EE9C")
358359
ctl_transforms_idt.append(node)
359360
elif ctl_transform_type in ("ODT", "InvODT"):
360-
node.attr.update(color="#CA9B52", fillcolor="#FFCC80")
361+
node.set_color("#CA9B52")
362+
node.set_fillcolor("#FFCC80")
361363
ctl_transforms_odt.append(node)
362364
elif ctl_transform_type in ("RRTODT", "InvRRTODT"):
363-
node.attr.update(color="#C88719", fillcolor="#FFB74D")
365+
node.set_color("#C88719")
366+
node.set_fillcolor("#FFB74D")
364367
ctl_transforms_output_transform.append(node)
365368
elif ctl_transform_type == "LMT":
366-
node.attr.update(color="#4BA3C7", fillcolor="#81D4FA")
369+
node.set_color("#4BA3C7")
370+
node.set_fillcolor("#81D4FA")
367371
ctl_transforms_lmt.append(node)
368372

369-
agraph.add_subgraph(ctl_transforms_csc, name="cluster_ACEScsc", color="#00BCD4FF")
370-
agraph.add_subgraph(ctl_transforms_idt, name="cluster_IDT", color="#B3BC6D")
371-
agraph.add_subgraph(ctl_transforms_odt, name="cluster_ODT", color="#CA9B52")
372-
agraph.add_subgraph(
373-
ctl_transforms_output_transform,
374-
name="cluster_OutputTransform",
375-
color="#C88719",
373+
ctl_transforms_csc_subgraph = Subgraph(name="cluster_ACEScsc", color="#00BCD4FF")
374+
for node in ctl_transforms_csc:
375+
ctl_transforms_csc_subgraph.add_node(node)
376+
dot.add_subgraph(ctl_transforms_csc_subgraph)
377+
378+
ctl_transforms_idt_subgraph = Subgraph(name="cluster_IDT", color="#B3BC6D")
379+
for node in ctl_transforms_idt:
380+
ctl_transforms_idt_subgraph.add_node(node)
381+
dot.add_subgraph(ctl_transforms_idt_subgraph)
382+
383+
ctl_transforms_odt_subgraph = Subgraph(name="cluster_ODT", color="#CA9B52")
384+
for node in ctl_transforms_odt:
385+
ctl_transforms_odt_subgraph.add_node(node)
386+
dot.add_subgraph(ctl_transforms_odt_subgraph)
387+
388+
ctl_transforms_output_transform_subgraph = Subgraph(
389+
name="cluster_OutputTransform", color="#C88719"
376390
)
377-
agraph.add_subgraph(ctl_transforms_lmt, name="cluster_LMT", color="#4BA3C7")
391+
for node in ctl_transforms_output_transform:
392+
ctl_transforms_output_transform_subgraph.add_node(node)
393+
dot.add_subgraph(ctl_transforms_output_transform_subgraph)
394+
395+
ctl_transforms_lmt_subgraph = Subgraph(name="cluster_LMT", color="#4BA3C7")
396+
for node in ctl_transforms_lmt:
397+
ctl_transforms_lmt_subgraph.add_node(node)
398+
dot.add_subgraph(ctl_transforms_lmt_subgraph)
399+
400+
for edge in dot.get_edges():
401+
edge.set_color("#26323870")
378402

379-
agraph.edge_attr.update(color="#26323870")
380-
agraph.draw(filename, prog=prog, args=args)
403+
file_format = os.path.splitext(filename)[-1][1:]
404+
write_method = getattr(dot, f"write_{file_format}")
405+
write_method(filename, prog=prog, f=file_format)
381406

382-
return agraph
407+
return dot
383408

384409

385410
if __name__ == "__main__":

pyproject.toml

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,7 @@ semver = ">= 3, < 4"
3232
colour-science = ">= 0.4.3"
3333
jsonpickle = ">= 2, < 3"
3434
networkx = "*"
35-
36-
[tool.poetry.group.graphviz.dependencies]
37-
pygraphviz = "*"
35+
pydot = ">= 3, 4"
3836

3937
[tool.poetry.group.dev.dependencies]
4038
coverage = "*"

0 commit comments

Comments
 (0)