Sha256: 7bebb33f31b7c5edff492efd55bbf88b1dd157e01c7d334a56361096e303497a

Contents?: true

Size: 1.6 KB

Versions: 2

Compression:

Stored size: 1.6 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, T.nilable(PackageNode)])
    end

    sig { returns(PackageGraph) }
    def self.construct
      package_nodes = Set.new
      Packs.all.each do |p|
        owner = CodeOwnership.for_package(p)

        # Here we need to load the package violations and dependencies,
        # so we need to use ParsePackwerk to parse that information.
        package_info = ParsePackwerk.find(p.name)
        next unless package_info # This should not happen unless packs/parse_packwerk change implementation

        violations = package_info.violations
        violations_by_package = violations.group_by(&:to_package_name).transform_values(&:count)

        dependencies = package_info.dependencies

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

      PackageGraph.new(package_nodes: package_nodes)
    end

    sig { params(name: String).returns(T.nilable(PackageNode)) }
    def package_by_name(name)
      @index_by_name[name] ||= 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.2.3 lib/visualize_packwerk/package_graph.rb
visualize_packwerk-0.2.1 lib/visualize_packwerk/package_graph.rb