70 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Ruby
		
	
	
	
			
		
		
	
	
			70 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Ruby
		
	
	
	
# frozen_string_literal: true
 | 
						|
 | 
						|
module Gitlab
 | 
						|
  class LanguageDetection
 | 
						|
    MAX_LANGUAGES = 5
 | 
						|
 | 
						|
    def initialize(repository, repository_languages)
 | 
						|
      @repository = repository
 | 
						|
      @repository_languages = repository_languages
 | 
						|
    end
 | 
						|
 | 
						|
    def languages
 | 
						|
      detection.keys
 | 
						|
    end
 | 
						|
 | 
						|
    def language_color(name)
 | 
						|
      detection.dig(name, :color)
 | 
						|
    end
 | 
						|
 | 
						|
    # Newly detected languages, returned in a structure accepted by
 | 
						|
    # ApplicationRecord.legacy_bulk_insert
 | 
						|
    def insertions(programming_languages)
 | 
						|
      lang_to_id = programming_languages.to_h { |p| [p.name, p.id] }
 | 
						|
 | 
						|
      (languages - previous_language_names).map do |new_lang|
 | 
						|
        {
 | 
						|
          project_id: @repository.project.id,
 | 
						|
          share: detection[new_lang][:value],
 | 
						|
          programming_language_id: lang_to_id[new_lang]
 | 
						|
        }
 | 
						|
      end
 | 
						|
    end
 | 
						|
 | 
						|
    # updates analyses which records only require updating of their share
 | 
						|
    def updates
 | 
						|
      to_update = @repository_languages.select do |lang|
 | 
						|
        detection.key?(lang.name) && detection[lang.name][:value] != lang.share
 | 
						|
      end
 | 
						|
 | 
						|
      to_update.map do |lang|
 | 
						|
        { programming_language_id: lang.programming_language_id, share: detection[lang.name][:value] }
 | 
						|
      end
 | 
						|
    end
 | 
						|
 | 
						|
    # Returns the ids of the programming languages that do not occur in the detection
 | 
						|
    # as current repository languages
 | 
						|
    def deletions
 | 
						|
      @repository_languages.filter_map do |repo_lang|
 | 
						|
        next if detection.key?(repo_lang.name)
 | 
						|
 | 
						|
        repo_lang.programming_language_id
 | 
						|
      end
 | 
						|
    end
 | 
						|
 | 
						|
    private
 | 
						|
 | 
						|
    def previous_language_names
 | 
						|
      @previous_language_names ||= @repository_languages.map(&:name)
 | 
						|
    end
 | 
						|
 | 
						|
    def detection
 | 
						|
      @detection ||=
 | 
						|
        @repository
 | 
						|
        .languages
 | 
						|
        .first(MAX_LANGUAGES)
 | 
						|
        .index_by { |l| l[:label] }
 | 
						|
    end
 | 
						|
  end
 | 
						|
end
 |