Packages

A bridge between Glamorous Toolkit (GT) and the BEAM VM, enabling remote code evaluation, object inspection, and Phlow view rendering.

Current section

Files

Jump to
gt_bridge lib examples e_mondrian.ex
Raw

lib/examples/e_mondrian.ex

defmodule Examples.EMondrian do
@moduledoc """
I am examples for the Mondrian graph view shim.
"""
use ExExample
import ExUnit.Assertions
alias GtBridge.Phlow.Mondrian
@spec simple_graph() :: map()
example simple_graph do
nodes = [:a, :b, :c, :d]
children = %{
a: [:b, :c],
b: [:d],
c: [],
d: []
}
dict =
GtBridge.Phlow.Builder.mondrian()
|> Mondrian.title("Dependencies")
|> Mondrian.priority(5)
|> Mondrian.nodes(nodes)
|> Mondrian.node_label(&Atom.to_string/1)
|> Mondrian.node_color(fn _ -> "#d3d3d2" end)
|> Mondrian.edges(fn node -> Map.get(children, node, []) end)
|> Mondrian.layout(:horizontal_tree)
|> Mondrian.as_dict()
assert dict.viewName == "GtPhlowMondrianViewSpecification"
assert length(dict.nodes) == 4
assert Enum.at(dict.nodes, 0) == %{label: "a", object: :a, color: "#d3d3d2"}
assert Enum.at(dict.adjacency, 0) == [1, 2]
assert Enum.at(dict.adjacency, 1) == [3]
assert Enum.at(dict.adjacency, 2) == []
assert dict.layout == "horizontalTree"
dict
end
@spec default_labels() :: map()
example default_labels do
dict =
GtBridge.Phlow.Builder.mondrian()
|> Mondrian.nodes([1, 2, 3])
|> Mondrian.as_dict()
assert Enum.at(dict.nodes, 0) == %{label: "1", object: 1, color: "#d3d3d3"}
dict
end
@spec map_graph_flat() :: map()
example map_graph_flat do
view = GtBridge.Views.MapGraph.graph(%{a: 1}, GtBridge.Phlow.Builder)
dict = Mondrian.as_dict(view)
assert dict.viewName == "GtPhlowMondrianViewSpecification"
assert length(dict.nodes) == 2
# Domain objects as nodes, inspect/1 for labels
objects = Enum.map(dict.nodes, & &1.object)
assert :a in objects
assert 1 in objects
a_idx = Enum.find_index(dict.nodes, &(&1.object == :a))
v_idx = Enum.find_index(dict.nodes, &(&1.object == 1))
assert Enum.at(dict.adjacency, a_idx) == [v_idx]
assert Enum.at(dict.adjacency, v_idx) == []
dict
end
@spec map_graph_nested() :: map()
example map_graph_nested do
view = GtBridge.Views.MapGraph.graph(%{x: %{y: 1}}, GtBridge.Phlow.Builder)
dict = Mondrian.as_dict(view)
assert length(dict.nodes) == 3
objects = Enum.map(dict.nodes, & &1.object)
assert :x in objects
assert :y in objects
assert 1 in objects
x_idx = Enum.find_index(dict.nodes, &(&1.object == :x))
y_idx = Enum.find_index(dict.nodes, &(&1.object == :y))
v_idx = Enum.find_index(dict.nodes, &(&1.object == 1))
# :x → :y → 1
assert Enum.at(dict.adjacency, x_idx) == [y_idx]
assert Enum.at(dict.adjacency, y_idx) == [v_idx]
assert Enum.at(dict.adjacency, v_idx) == []
dict
end
@spec map_graph_view_registered() :: map()
example map_graph_view_registered do
GtBridge.View.register(GtBridge.Views.MapGraph)
views = GtBridge.Views.lookup(GtBridge.Views, Map)
assert MapSet.size(views) >= 1
assert MapSet.member?(views, {GtBridge.Views.MapGraph, :graph})
end
end