ddd-ruby/rdm

View on GitHub
lib/rdm/handlers/diff_package_handler.rb

Summary

Maintainability
A
45 mins
Test Coverage
module Rdm
  module Handlers
    class DiffPackageHandler
      class << self
        def handle(path:, revision: 'HEAD')
          return Rdm::Handlers::DiffPackageHandler.new(path: path, revision: revision).handle
        end
      end

      attr_reader :path, :revision, :all_packages
      def initialize(path:, revision:)
        @path     = path
        @revision = revision

        source_path   = Rdm::SourceLocator.locate(path)
        @all_packages = Rdm::SourceParser.read_and_init_source(source_path).packages.values
      end

      def handle
        @revision = 'HEAD' if @revision.nil? || @revision.empty?

        modified_packages = Rdm::Git::DiffManager
          .run(path: path, revision: revision)
          .map { |file| Rdm::Packages::Locator.locate(file) rescue nil }
          .map { |path_to_package| Rdm::PackageParser.parse_file(path_to_package).name rescue nil }
          .reject(&:blank?)
          .uniq
        
        return get_dependencies(modified_packages) || []
      end

      private
        def get_dependencies(base_packages)
          base_packages.sort!

          new_packages = all_packages
            .select {|p| (p.local_dependencies & base_packages).any?}
            .map(&:name)
          
          extended_dependencies = (base_packages | new_packages).sort
          
          return extended_dependencies if extended_dependencies == base_packages

          get_dependencies(extended_dependencies) || []
        end
    end
  end
end