Sha256: 21bdc6a1f7414b73f10da623c5fda4e5f318123322d72c7b4ac68c62cefd0cbc

Contents?: true

Size: 1.38 KB

Versions: 2

Compression:

Stored size: 1.38 KB

Contents

# typed: strict

module VisualizePackwerk
  class PackageGraph
    extend T::Sig
    include GraphInterface

    sig { returns(T::Set[PackageNode]) }
    attr_reader :package_nodes

    sig { override.returns(T::Set[NodeInterface]) }
    def nodes
      package_nodes
    end

    sig { params(package_nodes: T::Set[PackageNode]).void }
    def initialize(package_nodes:)
      @package_nodes = package_nodes
      @index_by_name = T.let({}, T::Hash[String, PackageNode])
    end

    sig { returns(PackageGraph) }
    def self.construct
      package_nodes = Set.new
      ParsePackwerk.all.each do |p|
        # We could consider ignoring the root!
        # We would also need to ignore it when parsing PackageNodes.
        # next if p.name == ParsePackwerk::ROOT_PACKAGE_NAME
        owner = CodeOwnership.for_package(p)
        violations_by_package = p.violations.group_by(&:to_package_name).transform_values(&:count)

        package_nodes << PackageNode.new(
          name: p.name,
          team_name: owner&.name || 'Unknown',
          violations_by_package: violations_by_package,
          dependencies: Set.new(p.dependencies)
        )
      end

      PackageGraph.new(package_nodes: package_nodes)
    end

    sig { params(name: String).returns(PackageNode) }
    def package_by_name(name)
      @index_by_name[name] ||= T.must(package_nodes.find { |node| node.name == name })
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
visualize_packwerk-0.0.6 lib/visualize_packwerk/package_graph.rb
visualize_packwerk-0.0.5 lib/visualize_packwerk/package_graph.rb