Class: Rigor::ModuleGraph::CLI::Render

Inherits:
Object
  • Object
show all
Includes:
EdgeFilters
Defined in:
lib/rigor/module_graph/cli.rb

Overview

Shared base for ‘dot` / `mermaid` — both load an edges JSONL and print a rendered string.

Constant Summary

Constants included from EdgeFilters

EdgeFilters::VALID_CONFIDENCES, EdgeFilters::VALID_DIRECTIONS, EdgeFilters::VALID_EDGE_SCOPES, EdgeFilters::VALID_KINDS

Instance Method Summary collapse

Methods included from EdgeFilters

#add_filter_options, #apply_filters, #validate!

Constructor Details

#initialize(format, stdout:, stderr:, stdin:) ⇒ Render

Returns a new instance of Render.



707
708
709
710
711
712
713
714
715
716
717
# File 'lib/rigor/module_graph/cli.rb', line 707

def initialize(format, stdout:, stderr:, stdin:)
  @format = format
  @stdout = stdout
  @stderr = stderr
  @stdin = stdin
  @state = {
    collapse: [], kinds: nil, confidences: nil,
    from: nil, depth: nil, direction: :both, edge_scope: :cluster,
    package: nil
  }
end

Instance Method Details

#package_groups(edges) ⇒ Object



749
750
751
752
753
754
755
756
757
758
759
# File 'lib/rigor/module_graph/cli.rb', line 749

def package_groups(edges)
  return nil unless @state[:package]

  overlay = PackwerkOverlay.discover(@state[:package])
  unless overlay.any?
    @stderr.puts "rigor-module-graph #{@format}: no package.yml found under #{@state[:package].inspect}"
    return nil
  end

  overlay.groups_for(edges)
end

#parse_options!(argv) ⇒ Object



761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
# File 'lib/rigor/module_graph/cli.rb', line 761

def parse_options!(argv)
  parser = OptionParser.new do |opts|
    opts.banner = "Usage: rigor-module-graph #{@format} [options] [FILE]"
    opts.on("--collapse PREFIXES", Array,
            "Comma-separated namespace prefixes to fold into clusters") do |prefixes|
      @state[:collapse].concat(prefixes)
    end
    opts.on("--package",
            "Cluster by Packwerk packages discovered in cwd") do
      @state[:package] ||= "."
    end
    opts.on("--package-root PATH",
            "Cluster by Packwerk packages discovered under PATH") do |root|
      @state[:package] = root
    end
    add_filter_options(opts, @state)
    opts.on("-h", "--help") do
      @stdout.puts opts
      exit 0
    end
  end
  parser.parse!(argv)
end

#rendered(edges, groups) ⇒ Object



785
786
787
788
789
790
# File 'lib/rigor/module_graph/cli.rb', line 785

def rendered(edges, groups)
  case @format
  when :dot then Dot.render(edges, collapse: @state[:collapse], groups: groups)
  when :mermaid then Mermaid.render(edges, collapse: @state[:collapse], groups: groups)
  end
end

#run(argv) ⇒ Object



719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
# File 'lib/rigor/module_graph/cli.rb', line 719

def run(argv)
  argv = argv.dup
  parse_options!(argv)
  path, = argv
  io = path ? File.open(path, "r") : @stdin
  begin
    edges = EdgeIO.read(io)
  ensure
    io.close if path && !io.closed?
  end
  edges = apply_filters(
    edges,
    kinds: @state[:kinds],
    confidences: @state[:confidences],
    from: @state[:from],
    depth: @state[:depth],
    direction: @state[:direction],
    edge_scope: @state[:edge_scope]
  )
  groups = package_groups(edges)
  @stdout.print(rendered(edges, groups))
  0
rescue Errno::ENOENT => e
  @stderr.puts "rigor-module-graph #{@format}: #{e.message}"
  1
rescue OptionParser::ParseError => e
  @stderr.puts "rigor-module-graph #{@format}: #{e.message}"
  2
end