Class: Kotoshu::ResourceManager
- Inherits:
-
Object
- Object
- Kotoshu::ResourceManager
- 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
- .languages_setup ⇒ Object
- .resolve(language:, want: DEFAULT_WANT) ⇒ Object
- .setup(language, want: DEFAULT_WANT, force: false, strict: false, **opts) ⇒ Object
- .setup?(language, resource: nil) ⇒ Boolean
- .setup_from_local(language:, aff:, dic:, frequency: nil, force: false) ⇒ Object
Instance Method Summary collapse
- #languages_setup ⇒ Object
-
#resolve(language:, want: DEFAULT_WANT) ⇒ Object
---- Stage 2: resolve (cache-only) ----.
-
#setup(language:, want: DEFAULT_WANT, force: false, strict: false, aff: nil, dic: nil, from: nil, frequency: nil) ⇒ Object
---- Stage 1: setup ----.
-
#setup?(language, resource: nil) ⇒ Boolean
---- Predicates ----.
- #setup_from_local(language:, aff:, dic:, from: nil, frequency: nil, force: false) ⇒ Object
Class Method Details
.languages_setup ⇒ Object
51 52 53 |
# File 'lib/kotoshu/resource_manager.rb', line 51 def languages_setup new.languages_setup end |
.resolve(language:, want: DEFAULT_WANT) ⇒ Object
43 44 45 |
# File 'lib/kotoshu/resource_manager.rb', line 43 def resolve(language:, want: DEFAULT_WANT) new.resolve(language: language, want: want) end |
.setup(language, want: DEFAULT_WANT, force: false, strict: false, **opts) ⇒ Object
35 36 37 |
# File 'lib/kotoshu/resource_manager.rb', line 35 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
47 48 49 |
# File 'lib/kotoshu/resource_manager.rb', line 47 def setup?(language, resource: nil) new.setup?(language, resource: resource) end |
.setup_from_local(language:, aff:, dic:, frequency: nil, force: false) ⇒ Object
39 40 41 |
# File 'lib/kotoshu/resource_manager.rb', line 39 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_setup ⇒ Object
136 137 138 139 140 141 |
# File 'lib/kotoshu/resource_manager.rb', line 136 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) ----
101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 |
# File 'lib/kotoshu/resource_manager.rb', line 101 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 ----
58 59 60 61 62 63 64 65 66 67 68 |
# File 'lib/kotoshu/resource_manager.rb', line 58 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 ----
121 122 123 124 125 126 127 128 129 130 131 132 133 134 |
# File 'lib/kotoshu/resource_manager.rb', line 121 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.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
70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 |
# File 'lib/kotoshu/resource_manager.rb', line 70 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) frequency_status = :local end SetupResult.new( language: lang, spelling: spelling_status, frequency: frequency_status, model: nil, source: :local ) end |