onlyoffice_language_helper 0.2.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 105111253f19a8664e8167c6c209b502b1b0b1ef26c13b87f5ba6810507f2f47
4
- data.tar.gz: 74b1fd7558c1e515d78fb3ef850e4abe9de650007354c2fb9a31b4d45c78d060
3
+ metadata.gz: 23f037370c055f1bb2705656ec0b7cddd5236c0725909a5c147053c46705f80a
4
+ data.tar.gz: 6899e8b66be0f46f2ffb2edb727f66f5d008e0322c5e5d59f3a09161782019c1
5
5
  SHA512:
6
- metadata.gz: b1664113d988f7915c2649037eededfdd60086e16456bd0de8399bef83fa67aea7cc178a4853ac633e68aca31364e4c21e6053a067f58201e0caca3f1ab2e179
7
- data.tar.gz: 9ad83dae4e4721e5c73fbea7c18005e6169e563c89fbfcbaa057a4459c2cdcdfdae26620af0ea400feb68649d7a59e21f8b9fbcf96fd0e80f3c8c7e7d88c233b
6
+ metadata.gz: 407a8dba3654b6e5a1210d0fda7027753236e0e3fb183454f4e387bfefd98013d32decc8e561d52c39c6ee111d777e10b33744def1a5709a503fb607fb9108ad
7
+ data.tar.gz: d3a308d417e561c8477abbd5eedd483acc643f893daa575d120d80016e05ca502337015d732cd6087a3bbb69370f4dc4b85c77a456d2399734d5a7a0561562fc
@@ -10,11 +10,15 @@ module OnlyofficeLanguageHelper
10
10
  # @return [Array, String] initialized keys
11
11
  attr_accessor :api_keys
12
12
 
13
+ # Detect language of text
14
+ # @param text [String] text to detect
15
+ # @return [String] possible language
13
16
  def detect_language(text)
14
17
  change_key_on_active
15
18
  DetectLanguage.detect(text)
16
19
  end
17
20
 
21
+ # @return [Array<String>] list of all possible languages
18
22
  def all_languages
19
23
  change_key_on_active
20
24
  DetectLanguage.languages
@@ -25,7 +29,7 @@ module OnlyofficeLanguageHelper
25
29
  # Set value to variable DetectLanguageWrapper.keys
26
30
  # @return [Array, String] list of keys
27
31
  def read_keys
28
- return [ENV['DETECT_LANGUAGE_KEY']] if ENV['DETECT_LANGUAGE_KEY']
32
+ return [ENV['DETECT_LANGUAGE_KEY']] if ENV.key?('DETECT_LANGUAGE_KEY')
29
33
 
30
34
  OnlyofficeFileHelper::FileHelper
31
35
  .read_array_from_file("#{Dir.home}/.detect_language/keys")
@@ -43,7 +47,7 @@ module OnlyofficeLanguageHelper
43
47
  end
44
48
  return true if DetectLanguage.user_status['status'] == 'ACTIVE'
45
49
  end
46
- raise 'All keys are non-active. '\
50
+ raise 'All keys are non-active. ' \
47
51
  'Please register more detectlanguage.com accounts'
48
52
  end
49
53
  end
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module OnlyofficeLanguageHelper
4
+ # @return [String] name of gem
4
5
  NAME = 'onlyoffice_language_helper'
5
6
  end
@@ -4,13 +4,16 @@ module OnlyofficeLanguageHelper
4
4
  module SpellChecker
5
5
  # Spellchecker config
6
6
  class Config
7
+ # @return [String] language to expect
7
8
  attr_accessor :expected_language
9
+ # @return [String] path to lang file
8
10
  attr_accessor :dictionaries_path
9
11
 
10
12
  def initialize
11
13
  default_configuration
12
14
  end
13
15
 
16
+ # @return [nil] default configuration for SpellChecker
14
17
  def default_configuration
15
18
  @expected_language = 'en_US'
16
19
  @dictionaries_path = File.dirname(__dir__)
@@ -1,12 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'hunspell-ffi'
3
+ require 'ffi/hunspell'
4
4
  require 'httparty'
5
5
  require 'json'
6
6
  require 'cgi'
7
7
  require 'whatlanguage'
8
8
  require_relative 'spell_checker/config'
9
- require_relative 'spell_checker/dictionaries_threads'
10
9
 
11
10
  # Spellchecker stuff
12
11
  module OnlyofficeLanguageHelper
@@ -21,62 +20,101 @@ module OnlyofficeLanguageHelper
21
20
  include HTTParty
22
21
  attr_reader :config
23
22
 
23
+ # Configure Spellchecker
24
24
  def self.configure
25
25
  OnlyofficeLoggerHelper.log('Begin configuring SpellChecker')
26
26
  config
27
27
  yield(@config) if block_given?
28
28
  check_language
29
- @dictionary = Hunspell.new(path_to_dic_aff(:aff),
30
- path_to_dic_aff(:dic))
29
+ FFI::Hunspell.directories = all_languages_dictonaries
31
30
  OnlyofficeLoggerHelper.log('Configuring complete!')
32
31
  end
33
32
 
33
+ # Check in all known dictionaries
34
+ # @param string [String] string to check
35
+ # @return [Array<Hash>] result of check
34
36
  def self.check_in_all_dictionaries(string)
35
- check_configuration
36
- @dictionaries ||= DictionariesThreads.new
37
+ results = []
37
38
  split_text_by_words(string).map do |word|
38
- parse_spellcheck_result(word,
39
- @dictionaries.check_word(word))
39
+ word_hash = {}
40
+ word_hash[word] = check_word_in_all(word)
41
+ results << word_hash
40
42
  end
43
+ results
41
44
  end
42
45
 
46
+ # Check word in all dictionaries
47
+ # @param [String] word to check
48
+ # @return [Hash] word check result
49
+ def self.check_word_in_all(word)
50
+ word_results = {}
51
+
52
+ @threads = []
53
+ available_languages.each do |language|
54
+ @threads << Thread.new do
55
+ word_results[language] = check_single_word(word, language)
56
+ end
57
+ end
58
+ @threads.each(&:join)
59
+ word_results
60
+ end
61
+
62
+ # Check if word correct in single language
63
+ # @param [String] word to check
64
+ # @param [String] language to check
65
+ # @return [Boolean] result of check
66
+ def self.check_single_word(word, language)
67
+ dict = FFI::Hunspell.dict(language)
68
+ result = dict.check?(word)
69
+ dict.close
70
+ OnlyofficeLoggerHelper.log("Word `#{word}` in `#{language}` correct: #{result}")
71
+ result
72
+ end
73
+
74
+ # Get path to dic aff
75
+ # @param extension [String] extension of dictionaries
76
+ # @param language [String] language to get
77
+ # @return [String] path
43
78
  def self.path_to_dic_aff(extension, language = config.expected_language)
44
- "#{config.dictionaries_path}/dictionaries/"\
45
- "#{language}/#{language}.#{extension}"
79
+ "#{config.dictionaries_path}/dictionaries/" \
80
+ "#{language}/#{language}.#{extension}"
46
81
  end
47
82
 
83
+ # Split text by words
84
+ # @param string [String] multi-word text
85
+ # @return [Array<String>] uniq words
48
86
  def self.split_text_by_words(string)
49
87
  string.to_s.scan(/\b[[:word:]['-]]+\b/u).uniq
50
88
  end
51
89
 
52
- def self.parse_spellcheck_result(word, spellcheck_result)
53
- unless spellcheck_result[config.expected_language]
54
- warn("Word '#{word}' was not found in "\
55
- "'#{config.expected_language}' dictionary!")
56
- spellcheck_result['suggestions'] = @dictionary.suggest(word)
57
- end
58
- { word => spellcheck_result }
59
- end
60
-
90
+ # @return [Config] get current config
61
91
  def self.config
62
92
  @config ||= Config.new
63
93
  end
64
94
 
95
+ # @return [nil] Reset config to default
65
96
  def self.reset_config
66
97
  @config = Config.new
67
98
  end
68
99
 
69
- def self.check_configuration
70
- return if @dictionary
71
-
72
- raise 'Call SpellChecker.configure method before using it!'
73
- end
74
-
100
+ # @return [nil] check if current language has dictonaries
75
101
  def self.check_language
76
102
  unless File.exist?(path_to_dic_aff(:dic)) ||
77
103
  File.exist?(path_to_dic_aff(:aff))
78
104
  raise 'Incorrect language'
79
105
  end
80
106
  end
107
+
108
+ # @return [Array<String>] list of available dictonaries
109
+ def self.available_languages
110
+ all_languages_dictonaries.map { |dir| File.basename(dir) }
111
+ end
112
+
113
+ # @return [Array<String>] list of all dictionaries dir
114
+ def self.all_languages_dictonaries
115
+ Dir.glob("#{Dir.pwd}/lib/onlyoffice_language_helper/dictionaries/*").select do |fn|
116
+ File.directory?(fn)
117
+ end
118
+ end
81
119
  end
82
120
  end
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module OnlyofficeLanguageHelper
4
- VERSION = '0.2.0'
4
+ # @return [String] version of gem
5
+ VERSION = '0.5.0'
5
6
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: onlyoffice_language_helper
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - ONLYOFFICE
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2020-05-14 00:00:00.000000000 Z
12
+ date: 2022-08-17 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: detect_language
@@ -17,56 +17,56 @@ dependencies:
17
17
  requirements:
18
18
  - - "~>"
19
19
  - !ruby/object:Gem::Version
20
- version: '1.0'
20
+ version: '1'
21
21
  type: :runtime
22
22
  prerelease: false
23
23
  version_requirements: !ruby/object:Gem::Requirement
24
24
  requirements:
25
25
  - - "~>"
26
26
  - !ruby/object:Gem::Version
27
- version: '1.0'
27
+ version: '1'
28
28
  - !ruby/object:Gem::Dependency
29
- name: httparty
29
+ name: ffi-hunspell
30
30
  requirement: !ruby/object:Gem::Requirement
31
31
  requirements:
32
32
  - - "~>"
33
33
  - !ruby/object:Gem::Version
34
- version: '0.1'
34
+ version: '0'
35
35
  type: :runtime
36
36
  prerelease: false
37
37
  version_requirements: !ruby/object:Gem::Requirement
38
38
  requirements:
39
39
  - - "~>"
40
40
  - !ruby/object:Gem::Version
41
- version: '0.1'
41
+ version: '0'
42
42
  - !ruby/object:Gem::Dependency
43
- name: hunspell-ffi
43
+ name: httparty
44
44
  requirement: !ruby/object:Gem::Requirement
45
45
  requirements:
46
- - - "~>"
46
+ - - ">="
47
47
  - !ruby/object:Gem::Version
48
- version: '0.1'
48
+ version: 0.10.0
49
49
  type: :runtime
50
50
  prerelease: false
51
51
  version_requirements: !ruby/object:Gem::Requirement
52
52
  requirements:
53
- - - "~>"
53
+ - - ">="
54
54
  - !ruby/object:Gem::Version
55
- version: '0.1'
55
+ version: 0.10.0
56
56
  - !ruby/object:Gem::Dependency
57
57
  name: onlyoffice_file_helper
58
58
  requirement: !ruby/object:Gem::Requirement
59
59
  requirements:
60
- - - "~>"
60
+ - - "<"
61
61
  - !ruby/object:Gem::Version
62
- version: '0.1'
62
+ version: '2'
63
63
  type: :runtime
64
64
  prerelease: false
65
65
  version_requirements: !ruby/object:Gem::Requirement
66
66
  requirements:
67
- - - "~>"
67
+ - - "<"
68
68
  - !ruby/object:Gem::Version
69
- version: '0.1'
69
+ version: '2'
70
70
  - !ruby/object:Gem::Dependency
71
71
  name: onlyoffice_logger_helper
72
72
  requirement: !ruby/object:Gem::Requirement
@@ -87,28 +87,140 @@ dependencies:
87
87
  requirements:
88
88
  - - "~>"
89
89
  - !ruby/object:Gem::Version
90
- version: '1.0'
90
+ version: '1'
91
91
  type: :runtime
92
92
  prerelease: false
93
93
  version_requirements: !ruby/object:Gem::Requirement
94
94
  requirements:
95
95
  - - "~>"
96
96
  - !ruby/object:Gem::Version
97
- version: '1.0'
97
+ version: '1'
98
+ - !ruby/object:Gem::Dependency
99
+ name: codecov
100
+ requirement: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - "~>"
103
+ - !ruby/object:Gem::Version
104
+ version: '0'
105
+ type: :development
106
+ prerelease: false
107
+ version_requirements: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - "~>"
110
+ - !ruby/object:Gem::Version
111
+ version: '0'
112
+ - !ruby/object:Gem::Dependency
113
+ name: overcommit
114
+ requirement: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - "~>"
117
+ - !ruby/object:Gem::Version
118
+ version: '0'
119
+ type: :development
120
+ prerelease: false
121
+ version_requirements: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - "~>"
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
98
126
  - !ruby/object:Gem::Dependency
99
127
  name: rake
100
128
  requirement: !ruby/object:Gem::Requirement
101
129
  requirements:
102
130
  - - "~>"
103
131
  - !ruby/object:Gem::Version
104
- version: '13.0'
132
+ version: '13'
105
133
  type: :development
106
134
  prerelease: false
107
135
  version_requirements: !ruby/object:Gem::Requirement
108
136
  requirements:
109
137
  - - "~>"
110
138
  - !ruby/object:Gem::Version
111
- version: '13.0'
139
+ version: '13'
140
+ - !ruby/object:Gem::Dependency
141
+ name: rspec
142
+ requirement: !ruby/object:Gem::Requirement
143
+ requirements:
144
+ - - "~>"
145
+ - !ruby/object:Gem::Version
146
+ version: '3'
147
+ type: :development
148
+ prerelease: false
149
+ version_requirements: !ruby/object:Gem::Requirement
150
+ requirements:
151
+ - - "~>"
152
+ - !ruby/object:Gem::Version
153
+ version: '3'
154
+ - !ruby/object:Gem::Dependency
155
+ name: rubocop
156
+ requirement: !ruby/object:Gem::Requirement
157
+ requirements:
158
+ - - "~>"
159
+ - !ruby/object:Gem::Version
160
+ version: '1'
161
+ type: :development
162
+ prerelease: false
163
+ version_requirements: !ruby/object:Gem::Requirement
164
+ requirements:
165
+ - - "~>"
166
+ - !ruby/object:Gem::Version
167
+ version: '1'
168
+ - !ruby/object:Gem::Dependency
169
+ name: rubocop-performance
170
+ requirement: !ruby/object:Gem::Requirement
171
+ requirements:
172
+ - - "~>"
173
+ - !ruby/object:Gem::Version
174
+ version: '1'
175
+ type: :development
176
+ prerelease: false
177
+ version_requirements: !ruby/object:Gem::Requirement
178
+ requirements:
179
+ - - "~>"
180
+ - !ruby/object:Gem::Version
181
+ version: '1'
182
+ - !ruby/object:Gem::Dependency
183
+ name: rubocop-rake
184
+ requirement: !ruby/object:Gem::Requirement
185
+ requirements:
186
+ - - "~>"
187
+ - !ruby/object:Gem::Version
188
+ version: '0'
189
+ type: :development
190
+ prerelease: false
191
+ version_requirements: !ruby/object:Gem::Requirement
192
+ requirements:
193
+ - - "~>"
194
+ - !ruby/object:Gem::Version
195
+ version: '0'
196
+ - !ruby/object:Gem::Dependency
197
+ name: rubocop-rspec
198
+ requirement: !ruby/object:Gem::Requirement
199
+ requirements:
200
+ - - "~>"
201
+ - !ruby/object:Gem::Version
202
+ version: '2'
203
+ type: :development
204
+ prerelease: false
205
+ version_requirements: !ruby/object:Gem::Requirement
206
+ requirements:
207
+ - - "~>"
208
+ - !ruby/object:Gem::Version
209
+ version: '2'
210
+ - !ruby/object:Gem::Dependency
211
+ name: yard
212
+ requirement: !ruby/object:Gem::Requirement
213
+ requirements:
214
+ - - ">="
215
+ - !ruby/object:Gem::Version
216
+ version: 0.9.20
217
+ type: :development
218
+ prerelease: false
219
+ version_requirements: !ruby/object:Gem::Requirement
220
+ requirements:
221
+ - - ">="
222
+ - !ruby/object:Gem::Version
223
+ version: 0.9.20
112
224
  description: ONLYOFFICE Helper Gem for language operation. Used in QA
113
225
  email:
114
226
  - shockwavenn@gmail.com
@@ -223,17 +335,17 @@ files:
223
335
  - lib/onlyoffice_language_helper/name.rb
224
336
  - lib/onlyoffice_language_helper/spell_checker.rb
225
337
  - lib/onlyoffice_language_helper/spell_checker/config.rb
226
- - lib/onlyoffice_language_helper/spell_checker/dictionaries_threads.rb
227
338
  - lib/onlyoffice_language_helper/version.rb
228
- homepage: https://github.com/onlyoffice-testing-robot/onlyoffice_language_helper
339
+ homepage: https://github.com/ONLYOFFICE-QA/onlyoffice_language_helper
229
340
  licenses:
230
341
  - AGPL-3.0
231
342
  metadata:
232
- bug_tracker_uri: https://github.com/onlyoffice-testing-robot/onlyoffice_language_helper/issues
233
- changelog_uri: https://github.com/onlyoffice-testing-robot/onlyoffice_language_helper/blob/master/CHANGELOG.md
343
+ bug_tracker_uri: https://github.com/ONLYOFFICE-QA/onlyoffice_language_helper/issues
344
+ changelog_uri: https://github.com/ONLYOFFICE-QA/onlyoffice_language_helper/blob/master/CHANGELOG.md
234
345
  documentation_uri: https://www.rubydoc.info/gems/onlyoffice_language_helper
235
- homepage_uri: https://github.com/onlyoffice-testing-robot/onlyoffice_language_helper
236
- source_code_uri: https://github.com/onlyoffice-testing-robot/onlyoffice_language_helper
346
+ homepage_uri: https://github.com/ONLYOFFICE-QA/onlyoffice_language_helper
347
+ source_code_uri: https://github.com/ONLYOFFICE-QA/onlyoffice_language_helper
348
+ rubygems_mfa_required: 'true'
237
349
  post_install_message:
238
350
  rdoc_options: []
239
351
  require_paths:
@@ -242,14 +354,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
242
354
  requirements:
243
355
  - - ">="
244
356
  - !ruby/object:Gem::Version
245
- version: '0'
357
+ version: '2.7'
246
358
  required_rubygems_version: !ruby/object:Gem::Requirement
247
359
  requirements:
248
360
  - - ">="
249
361
  - !ruby/object:Gem::Version
250
362
  version: '0'
251
363
  requirements: []
252
- rubygems_version: 3.1.2
364
+ rubygems_version: 3.3.20
253
365
  signing_key:
254
366
  specification_version: 4
255
367
  summary: ONLYOFFICE Helper Gem for language operation
@@ -1,62 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module OnlyofficeLanguageHelper
4
- module SpellChecker
5
- # Threads for spellchecker
6
- class DictionariesThreads
7
- attr_accessor :word
8
-
9
- Thread.abort_on_exception = true
10
-
11
- def initialize
12
- @dictionaries = {}
13
- Dir.glob("#{SpellChecker.config.dictionaries_path}/dictionaries/*")
14
- .select { |f| File.directory?(f) }.each do |lang|
15
- @dictionaries[File.basename(lang)] =
16
- Hunspell.new(SpellChecker.path_to_dic_aff(:aff,
17
- File.basename(lang)),
18
- SpellChecker.path_to_dic_aff(:dic,
19
- File.basename(lang)))
20
- end
21
- init_threads_data
22
- end
23
-
24
- def threads
25
- @threads ||= init_threads
26
- end
27
-
28
- def check_word(word)
29
- @result = {}
30
- @word = word.to_s
31
- start_threads
32
- end
33
-
34
- def start_threads
35
- threads.each(&:run)
36
- until @result.length == @dictionaries.length
37
- end
38
- @result
39
- end
40
-
41
- private
42
-
43
- def init_threads_data
44
- @result = {}
45
- threads
46
- end
47
-
48
- def init_threads
49
- @threads = []
50
- @dictionaries.each do |key, value|
51
- @threads << Thread.new do
52
- loop do
53
- @result[key] = value.check(@word.to_s)
54
- Thread.stop
55
- end
56
- end
57
- end
58
- @threads
59
- end
60
- end
61
- end
62
- end