Class: Parabot::LanguageDetector

Inherits:
Object
  • Object
show all
Defined in:
lib/parabot/language_detector.rb

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.create_full_language_config(project_root) ⇒ Object



23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/parabot/language_detector.rb', line 23

def self.create_full_language_config(project_root)
  # Load all available language configs
  config_dir = File.join(__dir__, "../../config")
  languages = {}

  Dir.glob(File.join(config_dir, "languages/*.yml")).each do |lang_file|
    lang_name = File.basename(lang_file, ".yml")
    languages[lang_name] = YAML.load_file(lang_file)
  end

  # Create a minimal config object that supports language detection
  Class.new do
    def initialize(languages, project_root)
      @languages = languages
      @project_root = project_root
    end

    attr_reader :project_root

    def all_language_extensions
      @languages.transform_values { |lang_config| lang_config["file_extensions"] }
    end

    def all_language_project_files
      result = {}
      @languages.each do |lang, lang_config|
        project_files = lang_config["project_files"] || []
        result[lang] = project_files unless project_files.empty?
      end
      result
    end

    def detect_language_from_extensions(extensions)
      all_language_extensions.each do |lang, lang_extensions|
        next if lang_extensions.nil?
        return lang if (lang_extensions & extensions).any?
      end
      nil
    end
  end.new(languages, project_root)
end

.detect_with_all_languages(project_root = Dir.pwd) ⇒ Object

Class method for detecting languages with all available language configs loaded Used by init command and other contexts that need complete language detection



17
18
19
20
21
# File 'lib/parabot/language_detector.rb', line 17

def self.detect_with_all_languages(project_root = Dir.pwd)
  config = create_full_language_config(project_root)
  detector = new(config)
  detector.detect_all_languages(project_root)
end

Instance Method Details

#detect_all_languages(path = project_root) ⇒ Object



65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/parabot/language_detector.rb', line 65

def detect_all_languages(path = project_root)
  detected_languages = Set.new

  # 1. Check for definitive project files first (always included)
  detected_languages.merge(detect_from_project_files(path))

  # 2. Get extensions with counts, filter by threshold to avoid fixture noise
  detected_languages.merge(detect_from_extensions_with_threshold(path))

  # 3. Return sorted array or [:unknown] if empty
  detected_languages.empty? ? [:unknown] : detected_languages.to_a.sort
end

#find_language_from_extensions(extensions) ⇒ Object

Find language from file extensions



79
80
81
82
83
84
85
86
87
88
# File 'lib/parabot/language_detector.rb', line 79

def find_language_from_extensions(extensions)
  return nil if extensions.empty?

  config.all_language_extensions.each do |lang, lang_extensions|
    next if lang_extensions.empty?
    return lang.to_s if (lang_extensions & extensions).any?
  end

  nil
end