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
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
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_setup ⇒ Object
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 —-
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
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 |