Class: BetterTranslate::Analyzer::KeyScanner

Inherits:
Object
  • Object
show all
Defined in:
lib/better_translate/analyzer/key_scanner.rb

Overview

Scans YAML translation files and extracts all keys in flatten format

Examples:

Basic usage

scanner = KeyScanner.new("config/locales/en.yml")
keys = scanner.scan
#=> { "users.greeting" => "Hello", "users.welcome" => "Welcome %{name}" }

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(file_path) ⇒ KeyScanner

Initialize scanner with YAML file path

Parameters:

  • file_path (String)

    Path to YAML file



25
26
27
28
# File 'lib/better_translate/analyzer/key_scanner.rb', line 25

def initialize(file_path)
  @file_path = file_path
  @keys = {}
end

Instance Attribute Details

#file_pathString (readonly)

Returns Path to the YAML file.

Returns:

  • (String)

    Path to the YAML file



16
17
18
# File 'lib/better_translate/analyzer/key_scanner.rb', line 16

def file_path
  @file_path
end

#keysHash (readonly)

Returns Flatten keys extracted from YAML.

Returns:

  • (Hash)

    Flatten keys extracted from YAML



19
20
21
# File 'lib/better_translate/analyzer/key_scanner.rb', line 19

def keys
  @keys
end

Instance Method Details

#flatten_keys(hash, prefix = nil) ⇒ Object (private)

Flatten nested hash into dot-notation keys

Examples:

flatten_keys({ "users" => { "greeting" => "Hello" } })
#=> { "users.greeting" => "Hello" }

Parameters:

  • hash (Hash)

    Nested hash to flatten

  • prefix (String) (defaults to: nil)

    Prefix for current level



96
97
98
99
100
101
102
103
104
105
106
# File 'lib/better_translate/analyzer/key_scanner.rb', line 96

def flatten_keys(hash, prefix = nil)
  hash.each do |key, value|
    current_key = prefix ? "#{prefix}.#{key}" : key.to_s

    if value.is_a?(Hash)
      flatten_keys(value, current_key)
    else
      @keys[current_key] = value
    end
  end
end

#key_countInteger

Get total count of keys

Returns:

  • (Integer)

    Number of keys



68
69
70
# File 'lib/better_translate/analyzer/key_scanner.rb', line 68

def key_count
  @keys.size
end

#scanHash

Scan YAML file and extract all flatten keys

Examples:

scanner = KeyScanner.new("en.yml")
keys = scanner.scan
#=> { "users.greeting" => "Hello" }

Returns:

  • (Hash)

    Flatten keys with their values

Raises:



41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/better_translate/analyzer/key_scanner.rb', line 41

def scan
  validate_file!

  begin
    content = YAML.load_file(file_path)

    # Skip root language key (en, it, fr, etc.) and start from its content
    if content.is_a?(Hash) && content.size == 1
      root_key = content.keys.first.to_s
      content = content[root_key] || {} if root_key.match?(/^[a-z]{2}(-[A-Z]{2})?$/)
    end

    flatten_keys(content)
  rescue Psych::SyntaxError => e
    raise YamlError.new(
      "Invalid YAML syntax in #{file_path}",
      context: { file: file_path, error: e.message }
    )
  end

  @keys
end

#validate_file!Object (private)

Validate that file exists

Raises:



78
79
80
81
82
83
84
85
# File 'lib/better_translate/analyzer/key_scanner.rb', line 78

def validate_file!
  return if File.exist?(file_path)

  raise FileError.new(
    "Translation file does not exist: #{file_path}",
    context: { file: file_path }
  )
end