Module: Lutaml::Formatter::Graphviz::DocumentFormatter

Included in:
Lutaml::Formatter::Graphviz
Defined in:
lib/lutaml/lml/formatter/graphviz/document_formatter.rb

Instance Method Summary collapse

Instance Method Details

#build_associations(node, hide_other_classes) ⇒ Object



38
39
40
41
42
43
# File 'lib/lutaml/lml/formatter/graphviz/document_formatter.rb', line 38

def build_associations(node, hide_other_classes)
  associations = collect_all_associations(node)
  associations = sort_by_document_grouping(node.groups, associations) if node.groups
  classes_names = node.classes.map(&:name)
  format_filtered_associations(associations, classes_names, hide_other_classes)
end

#build_digraph(classes, associations) ⇒ Object



60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/lutaml/lml/formatter/graphviz/document_formatter.rb', line 60

def build_digraph(classes, associations)
  indented_classes = indent_lines(classes)
  indented_assocs = indent_lines(associations)

  <<~HEREDOC
    digraph G {
      graph [#{@graph}]
      edge [#{@edge}]
      node [#{@node}]

    #{indented_classes}

    #{indented_assocs}
    }
  HEREDOC
end

#collect_all_associations(node) ⇒ Object



45
46
47
48
49
50
# File 'lib/lutaml/lml/formatter/graphviz/document_formatter.rb', line 45

def collect_all_associations(node)
  class_level = node.classifiable_classes
  seen = Set.new
  all = class_level.filter_map(&:associations).flatten + node.associations
  all.uniq { |a| association_key(a) }
end

#extract_fidelity_options(node) ⇒ Object



18
19
20
21
22
23
24
# File 'lib/lutaml/lml/formatter/graphviz/document_formatter.rb', line 18

def extract_fidelity_options(node)
  if node.fidelity
    [node.fidelity.hideMembers, node.fidelity.hideOtherClasses]
  else
    [nil, nil]
  end
end

#format_all_classes(node, hide_members) ⇒ Object



26
27
28
29
30
31
32
33
34
35
36
# File 'lib/lutaml/lml/formatter/graphviz/document_formatter.rb', line 26

def format_all_classes(node, hide_members)
  node.all_classes.map do |class_node|
    graph_node_name = generate_graph_name(class_node.name)
    <<~HEREDOC
      #{graph_node_name} [
        shape="plain"
        fontname="#{@fontname || DEFAULT_CLASS_FONT}"
        label=<#{format_class(class_node, hide_members)}>]
    HEREDOC
  end.join("\n")
end

#format_document(node) ⇒ Object



7
8
9
10
11
12
13
14
15
16
# File 'lib/lutaml/lml/formatter/graphviz/document_formatter.rb', line 7

def format_document(node)
  @fontname = node.fontname || DEFAULT_CLASS_FONT
  @node['fontname'] = "#{@fontname}-bold"

  hide_members, hide_other_classes = extract_fidelity_options(node)
  classes = format_all_classes(node, hide_members)
  associations = build_associations(node, hide_other_classes)

  build_digraph(classes, associations)
end

#format_filtered_associations(associations, classes_names, hide_other_classes) ⇒ Object



52
53
54
55
56
57
58
# File 'lib/lutaml/lml/formatter/graphviz/document_formatter.rb', line 52

def format_filtered_associations(associations, classes_names, hide_other_classes)
  associations.filter_map do |assoc_node|
    next if hide_other_classes && !classes_names.include?(assoc_node.member_end)

    format_relationship(assoc_node)
  end.join("\n")
end

#indent_lines(text) ⇒ Object



77
78
79
# File 'lib/lutaml/lml/formatter/graphviz/document_formatter.rb', line 77

def indent_lines(text)
  text.lines.map { |line| "  #{line}" }.join.chomp
end