Sha256: c754335370dd7397fb88feff72e330f58ea0c6498f8341dfd437466e39a3668c

Contents?: true

Size: 1.3 KB

Versions: 3

Compression:

Stored size: 1.3 KB

Contents

# frozen_string_literal: true

require 'abbrev'
require 'pathname'

module Rake
  module Funnel
    module Extensions
      module CommonPath
        def common_path
          list = to_a
                 .compact
                 .map { |x| components(x) }

          min = list.min_by(&:length)

          matches = find_matches(list, min)
          matches.min_by(&:length) || ''
        end

        private

        def components(path)
          paths = []
          Pathname.new(path).descend do |p|
            paths << p
          end

          paths = paths.inject([]) do |components, p|
            relative = p.relative_path_from(components.last[:absolute]) if components.any?

            components << { absolute: p, relative: relative || p }
          end

          paths.map { |component| component[:relative].to_s }
        end

        def find_matches(list, min)
          list.map do |path|
            longest_prefix = []

            path.zip(min).each do |left, right|
              next if left != right

              longest_prefix << right
            end

            File.join(longest_prefix)
          end
        end
      end
    end
  end
end

class Array
  include Rake::Funnel::Extensions::CommonPath
end

module Rake
  class FileList
    include Rake::Funnel::Extensions::CommonPath
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
rake-funnel-0.24.0 lib/rake/funnel/extensions/common_path.rb
rake-funnel-0.23.0 lib/rake/funnel/extensions/common_path.rb
rake-funnel-0.22.3 lib/rake/funnel/extensions/common_path.rb