Class: Kotoshu::ResourceManager

Inherits:
Object
  • Object
show all
Defined in:
lib/kotoshu/resource_manager.rb

Overview

Two-stage resource resolution.

Stage 1 — setup (slow, network-required, explicit):

Kotoshu.setup(:en)                            # download from kotoshu/dictionaries
Kotoshu.setup(:en, want: %i[spelling frequency])
Kotoshu.setup(:en, aff: "/path/to.en.aff", dic: "/path/to/en.dic")  # local files
Kotoshu.setup(:en, from: "/path/to/dict/dir/")                       # local directory

Stage 2 — resolve (instant, cache-only, raises on miss):

bundle = Kotoshu::ResourceManager.resolve(language: "en")
bundle.dictionary  # => #<Dictionary::Hunspell ...>

The hot path (Kotoshu.correct?, .check, .suggest, .spellchecker_for) calls resolve and lets ResourceNotSetupError propagate. Setup is never implicit.

Defined Under Namespace

Classes: SetupResult

Constant Summary collapse

DEFAULT_WANT =
%i[spelling].freeze

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.languages_setupObject



58
59
60
# File 'lib/kotoshu/resource_manager.rb', line 58

def languages_setup
  new.languages_setup
end

.resolve(language:, want: DEFAULT_WANT) ⇒ Object



50
51
52
# File 'lib/kotoshu/resource_manager.rb', line 50

def resolve(language:, want: DEFAULT_WANT)
  new.resolve(language: language, want: want)
end

.setup(language, want: DEFAULT_WANT, force: false, strict: false, **opts) ⇒ Object



42
43
44
# File 'lib/kotoshu/resource_manager.rb', line 42

def setup(language, want: DEFAULT_WANT, force: false, strict: false, **opts)
  new.setup(language: language, want: want, force: force, strict: strict, **opts)
end

.setup?(language, resource: nil) ⇒ Boolean

Returns:

  • (Boolean)


54
55
56
# File 'lib/kotoshu/resource_manager.rb', line 54

def setup?(language, resource: nil)
  new.setup?(language, resource: resource)
end

.setup_from_local(language:, aff:, dic:, frequency: nil, force: false) ⇒ Object



46
47
48
# File 'lib/kotoshu/resource_manager.rb', line 46

def setup_from_local(language:, aff:, dic:, frequency: nil, force: false)
  new.setup_from_local(language: language, aff: aff, dic: dic, frequency: frequency, force: force)
end

Instance Method Details

#languages_setupObject



142
143
144
145
146
147
# File 'lib/kotoshu/resource_manager.rb', line 142

def languages_setup
  spelling_cache_for(nil).cached_resources
    .map { |r| r.to_s.split(":").first }
    .uniq
    .sort
end

#resolve(language:, want: DEFAULT_WANT) ⇒ Object

—- Stage 2: resolve (cache-only) —-



107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
# File 'lib/kotoshu/resource_manager.rb', line 107

def resolve(language:, want: DEFAULT_WANT)
  lang = normalize_language(language)

  spelling_dict = want.include?(:spelling) ? resolve_spelling_cached(lang) : nil
  frequency_data = want.include?(:frequency) ? resolve_frequency_cached(lang) : nil
  model = want.include?(:model) ? resolve_model_cached(lang) : nil

  ResourceBundle.new(
    language: lang,
    dictionary: spelling_dict,
    frequency: frequency_data,
    model: model,
    rules: nil,
    cached: true,
    source_urls: []
  )
end

#setup(language:, want: DEFAULT_WANT, force: false, strict: false, aff: nil, dic: nil, from: nil, frequency: nil) ⇒ Object

—- Stage 1: setup —-



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

def setup(language:, want: DEFAULT_WANT, force: false, strict: false,
          aff: nil, dic: nil, from: nil, frequency: nil)
  lang = normalize_language(language)

  if aff || dic || from
    setup_from_local(language: lang, aff: aff, dic: dic, from: from,
                     frequency: frequency, force: force)
  else
    setup_from_remote(lang, want: want, force: force, strict: strict)
  end
end

#setup?(language, resource: nil) ⇒ Boolean

—- Predicates —-

Returns:

  • (Boolean)


127
128
129
130
131
132
133
134
135
136
137
138
139
140
# File 'lib/kotoshu/resource_manager.rb', line 127

def setup?(language, resource: nil)
  lang = normalize_language(language)
  case resource&.to_sym
  when nil, :spelling
    spelling_cache_for(lang).available?("#{lang}:spelling")
  when :frequency
    fc = frequency_cache_for
    fc.respond_to?(:supports_resource?) && fc.supports_resource?(lang) && fc.available?(lang)
  when :model
    model_cache_for.available?("#{lang}:onnx")
  else
    false
  end
end

#setup_from_local(language:, aff:, dic:, from: nil, frequency: nil, force: false) ⇒ Object

Raises:

  • (ArgumentError)


77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
# File 'lib/kotoshu/resource_manager.rb', line 77

def setup_from_local(language:, aff:, dic:, from: nil, frequency: nil, force: false)
  lang = normalize_language(language)

  aff_path, dic_path = resolve_local_paths(lang, aff: aff, dic: dic, from: from)
  raise ArgumentError, "aff file not found: #{aff_path}" unless File.exist?(aff_path)
  raise ArgumentError, "dic file not found: #{dic_path}" unless File.exist?(dic_path)

  spelling_cache = spelling_cache_for(lang)
  spelling_cache.install_local(lang, aff: aff_path, dic: dic_path, force: force)
  spelling_status = :local

  frequency_status = nil
  if frequency
    raise ArgumentError, "frequency file not found: #{frequency}" unless File.exist?(frequency)
    freq_cache = frequency_cache_for
    freq_cache.install_local(lang, path: frequency, force: force) if freq_cache.respond_to?(:install_local)
    frequency_status = :local
  end

  SetupResult.new(
    language: lang,
    spelling: spelling_status,
    frequency: frequency_status,
    model: nil,
    source: :local
  )
end