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.



654
655
656
657
658
659
660
661
662
663
664
# File 'lib/rigor/module_graph/cli.rb', line 654

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



696
697
698
699
700
701
702
703
704
705
706
# File 'lib/rigor/module_graph/cli.rb', line 696

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



708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
# File 'lib/rigor/module_graph/cli.rb', line 708

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



732
733
734
735
736
737
# File 'lib/rigor/module_graph/cli.rb', line 732

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



666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
# File 'lib/rigor/module_graph/cli.rb', line 666

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