opener-chained-daemon 2.2.1 → 3.0.6

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: 62fe03fff144aed01e4a993218ef09b23cf99171f7ee9e310bc337720a53f0e4
4
- data.tar.gz: dc3b6bd3537af53b3195b1f7f9f125efbf09c74780471fc13124514ad5dc93a1
3
+ metadata.gz: 3920c098f2410f265049d37ab9fe5d68bb29884987c51c117ea6ff7445b7ec2c
4
+ data.tar.gz: ccbc7b603bf3e7c7d840ebc52c8b30e9984f0e9b16f1724fc486ae975f854446
5
5
  SHA512:
6
- metadata.gz: 63b27c70aaf36690ad5f713aa7043841f2996bca881cee9491ed000dda8f7bae915b99e78751ca2b775776a1494c02c97c38b4ecc113730f28e23135be952f2f
7
- data.tar.gz: 67c5cd6a3eb2b26370cef3de302637f1a118574753f05dc6a3e0a99fd42ecea70eecd9d19e6e9b984584c1448d7dc01719cd729e2415c73fcb8fa67388ca2534
6
+ metadata.gz: 1ebd4d06c582fac7f857f8ea6975dee9a869557c8d457fe181a399a5266336e3b2e4b606740281be8977b367c7d0e3ac456de5ada10d23e67aa8f34aa4b71794
7
+ data.tar.gz: 1e1485573eb03d540519365d0c7b5feaf29b9a41ddb99b6f86f098409fdfde87c832f0c3b9b46bc44865457c2fc9bdde3e66dab23ab966d80cdf24148a24e749
@@ -0,0 +1,11 @@
1
+ APP_NAME = 'opener'
2
+ deploy_to = "/var/www/#{APP_NAME}"
3
+ run_path = "/var/run/#{APP_NAME}"
4
+ log_path = "/var/log/#{APP_NAME}"
5
+
6
+ workers ENV['WORKERS']&.to_i || 1 unless RUBY_ENGINE == 'jruby'
7
+ threads 0, ENV['THREADS']&.to_i || 16
8
+
9
+ bind 'tcp://0.0.0.0:9292'
10
+ #bind "unix://#{run_path}/chained-daemon-server.sock"
11
+
@@ -4,5 +4,8 @@ require 'opener/daemons'
4
4
 
5
5
  require_relative '../lib/opener/chained_daemon'
6
6
 
7
+ webservice = Rack::Server.new app: Opener::ChainedDaemon::Webservice.freeze.app
8
+ Thread.new{ webservice.start }
9
+
7
10
  daemon = Opener::Daemons::Daemon.new Opener::ChainedDaemon
8
11
  daemon.start
@@ -5,15 +5,20 @@ require 'google/cloud/translate'
5
5
 
6
6
  require 'opener/daemons'
7
7
 
8
+ require_relative 'chained_daemon/languages_cache'
8
9
  require 'opener/language_identifier'
9
10
  require 'opener/tokenizer'
10
- # require ner before pos_tagger for compatible opennlp
11
- require 'opener/pos_tagger'
11
+ require 'opener/pos_tagger' if RUBY_ENGINE == 'jruby'
12
12
  require 'opener/polarity_tagger'
13
13
  require 'opener/property_tagger'
14
14
  require 'opener/opinion_detector_basic'
15
+ require 'opener/stanza/tokenizer_pos'
15
16
 
16
17
  require_relative 'chained_daemon/chained_daemon'
17
18
  require_relative 'chained_daemon/cli'
18
19
  require_relative 'chained_daemon/microsoft_translator'
20
+ require_relative 'chained_daemon/webservice'
21
+
22
+ require_relative 'kaf/document'
23
+ require_relative 'kaf/term'
19
24
 
@@ -8,8 +8,9 @@ module Opener
8
8
  @options = DEFAULT_OPTIONS.merge options
9
9
  @queue_map = {
10
10
  'opener-language-identifier': Opener::LanguageIdentifier.new,
11
- 'opener-tokenizer': Opener::Tokenizer.new,
12
- 'opener-pos-tagger': Opener::POSTagger.new,
11
+ 'stanza-tokenizer-pos': Stanza::TokenizerPos.new, # replace this tokenizer-pos with both below with you dont have a stanza server
12
+ #'opener-tokenizer': Opener::Tokenizer.new,
13
+ #'opener-pos-tagger': Opener::POSTagger.new,
13
14
  'opener-polarity-tagger': Opener::PolarityTagger.new,
14
15
  'opener-property-tagger': Opener::PropertyTagger.new,
15
16
  'opener-opinion-detector-basic': Opener::OpinionDetectorBasic.new,
@@ -18,15 +19,16 @@ module Opener
18
19
 
19
20
  def run input, params = {}
20
21
  params ||= {}
21
- params.symbolize_keys!
22
+ params.deep_symbolize_keys!
22
23
  params[:translate_languages] ||= []
24
+ params[:cache_keys] = params[:cache_keys]&.sort&.to_h || {}
23
25
 
24
26
  lang = nil
25
27
  output = nil
26
28
  @queue_map.each do |queue, component|
27
29
  debug_print queue, input if ENV['DEBUG']
28
30
 
29
- output = component.run input
31
+ output = component.run input, params
30
32
  input = output
31
33
 
32
34
  rescue Core::UnsupportedLanguageError
@@ -0,0 +1,45 @@
1
+ module Opener
2
+ class ChainedDaemon
3
+ class LanguagesCache
4
+
5
+ include MonitorMixin
6
+
7
+ UPDATE_INTERVAL = (ENV['CACHE_EXPIRE_MINS']&.to_i || 5).minutes
8
+
9
+ def initialize
10
+ super #MonitorMixin
11
+
12
+ @url = ENV['SUPPORTED_LANGUAGES_URL']
13
+ @cache = []
14
+ @last_updated = nil
15
+ end
16
+
17
+ def get
18
+ synchronize do
19
+ break @cache if @last_updated and @last_updated > UPDATE_INTERVAL.ago
20
+ cache_update
21
+ end
22
+ @cache
23
+ end
24
+
25
+ def cache_update
26
+ puts "loading supported languages from url #{@url}" if ENV['DEBUG']
27
+
28
+ languages = JSON.parse http.get(@url).body
29
+ @cache = languages['data'].map { |l| l['code'] }
30
+ @last_updated = Time.now
31
+ end
32
+
33
+ def http
34
+ return @http if @http
35
+
36
+ @http = HTTPClient.new
37
+ @http.send_timeout = 120
38
+ @http.receive_timeout = 120
39
+ @http.connect_timeout = 120
40
+ @http
41
+ end
42
+
43
+ end
44
+ end
45
+ end
@@ -1,7 +1,7 @@
1
1
  module Opener
2
2
  class ChainedDaemon
3
3
 
4
- VERSION = '2.2.1'
4
+ VERSION = '3.0.6'
5
5
 
6
6
  end
7
7
  end
@@ -0,0 +1,29 @@
1
+ require 'roda'
2
+
3
+ module Opener
4
+ class ChainedDaemon
5
+ class Webservice < Roda
6
+
7
+ TOKEN = ENV['PRIVATE_TOKEN']
8
+
9
+ class_attribute :processor
10
+ self.processor = ChainedDaemon.new
11
+
12
+ route do |r|
13
+ response.status = 403 and r.halt if r.params['auth_token'] != TOKEN
14
+
15
+ sentiment = -> do
16
+ r.params.deep_symbolize_keys!
17
+ kaf = processor.run r.params[:input], **r.params.except(:input)
18
+
19
+ response['Content-Type'] = 'text/xml'
20
+ kaf
21
+ end
22
+
23
+ r.get 'sentiment.kaf', &sentiment
24
+ r.post 'sentiment.kaf', &sentiment
25
+ end
26
+
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,89 @@
1
+ require_relative 'term'
2
+
3
+ module Opener
4
+ module KAF
5
+ class Document
6
+
7
+ attr_reader :document
8
+ attr_reader :lexicons
9
+
10
+ attr_accessor :map
11
+
12
+ def initialize xml
13
+ @document = xml
14
+ end
15
+
16
+ def self.from_xml xml
17
+ new Nokogiri::XML xml
18
+ end
19
+
20
+ def language
21
+ @language ||= @document.at_xpath('KAF').attr 'xml:lang'
22
+ end
23
+
24
+ def terms
25
+ @terms ||= collection 'KAF/terms/term', Term
26
+ end
27
+
28
+ def texts
29
+ @texts ||= collection 'KAF/texts/wf', Text
30
+ end
31
+
32
+ def raw
33
+ @document.at('raw').text
34
+ end
35
+
36
+ def add_linguistic_processor name, version, layer, timestamp: false
37
+ header = @document.at('kafHeader') || @document.root.add_child('<kafHeader/>').first
38
+ procs = header.css('linguisticProcessors').find{ |l| l.attr(:layer) == layer }
39
+ procs ||= header.add_child("<linguisticProcessors layer='#{layer}'/>").first
40
+ lp = procs.add_child('<lp/>')
41
+ lp.attr(
42
+ timestamp: if timestamp then Time.now.iso8601 else '*' end,
43
+ version: version,
44
+ name: name,
45
+ )
46
+ lp
47
+ end
48
+
49
+ def add_word_form params
50
+ text = @document.at('text') || @document.root.add_child('<text/>').first
51
+ wf = text.add_child("<wf>#{params[:text]}</wf>")
52
+ attrs = {
53
+ wid: "w#{params[:wid]}",
54
+ sent: params[:sid],
55
+ para: params[:para],
56
+ offset: params[:offset],
57
+ length: params[:length],
58
+ }
59
+ wf.attr attrs
60
+ end
61
+
62
+ def add_term params
63
+ text = @document.at('terms') || @document.root.add_child('<terms/>').first
64
+ term = text.add_child("<term/>")
65
+ attrs = {
66
+ tid: "t#{params[:tid]}",
67
+ type: params[:type],
68
+ lemma: params[:lemma],
69
+ text: params[:text],
70
+ pos: params[:pos],
71
+ morphofeat: params[:morphofeat],
72
+ }
73
+ term.attr attrs
74
+ term.first.add_child("<span><target id='w#{params[:wid]}' /></span>")
75
+ end
76
+
77
+ def to_xml
78
+ @document.to_xml indent: 2
79
+ end
80
+
81
+ protected
82
+
83
+ def collection query, wrapper
84
+ @document.xpath(query).map{ |node| wrapper.new self, node }
85
+ end
86
+
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,35 @@
1
+ module Opener
2
+ module KAF
3
+ class Term
4
+
5
+ attr_reader :document
6
+ attr_reader :node
7
+
8
+ def initialize document, node
9
+ @document = document
10
+ @node = node
11
+ end
12
+
13
+ def id
14
+ @id ||= @node.attr :tid
15
+ end
16
+
17
+ def lemma
18
+ @node.attr :lemma
19
+ end
20
+
21
+ def pos
22
+ @node.attr :pos
23
+ end
24
+
25
+ def setPolarity attrs, polarity_pos
26
+ #In case there is no pos info, we use the polarityPos
27
+ @node[:pos] = polarity_pos if !pos and polarity_pos
28
+
29
+ sentiment = @node.add_child('<sentiment/>')
30
+ sentiment.attr attrs
31
+ end
32
+
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,30 @@
1
+ module Opener
2
+ module KAF
3
+ class WordForm
4
+ def initialize(document, xml_node)
5
+ @document = document
6
+ @xml_node = xml_node
7
+ end
8
+
9
+ def id
10
+ return @id ||= @xml_node.attr('wid')
11
+ end
12
+
13
+ def text
14
+ return @text ||= @xml_node.text
15
+ end
16
+
17
+ def length
18
+ return @length ||= @xml_node.attr('length').to_i
19
+ end
20
+
21
+ def offset
22
+ return @offset ||= @xml_node.attr('offset').to_i
23
+ end
24
+
25
+ def paragraph
26
+ return @paragraph ||= @xml_node.attr('para').to_i
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,86 @@
1
+ module Opener
2
+ module Stanza
3
+ class TokenizerPos
4
+
5
+ DESC = 'Tokenizer / POS by Stanza'
6
+ VERSION = '1.0'
7
+
8
+ BASE_URL = ENV['STANZA_SERVER']
9
+ LANGUAGES_CACHE = Opener::ChainedDaemon::LanguagesCache.new
10
+
11
+ POS = {
12
+ 'DET' => 'D',
13
+ 'ADJ' => 'G',
14
+ 'NOUN' => 'N',
15
+ 'VERB' => 'V',
16
+ 'AUX' => 'V',
17
+ 'ADV' => 'A',
18
+ 'CCONJ' => 'J',
19
+ 'PUNCT' => '.',
20
+ 'ADP' => 'P',
21
+ 'PRON' => 'Q',
22
+ 'PROPN' => 'R',
23
+ 'PART' => 'P',
24
+ 'NUM' => 'O',
25
+ 'X' => 'O',
26
+ 'SYM' => 'O',
27
+ 'SCONJ' => 'P',
28
+ 'INTJ' => 'O',
29
+ }
30
+
31
+ POS_OPEN = %w[N R G V A O]
32
+
33
+ def run input, params
34
+ raise 'missing Stanza server' if ENV['STANZA_SERVER'].blank?
35
+
36
+ kaf = KAF::Document.from_xml input
37
+
38
+ unless LANGUAGES_CACHE.get.include? kaf.language
39
+ raise Core::UnsupportedLanguageError.new kaf.language
40
+ end
41
+
42
+ response = Faraday.post BASE_URL, {lang: kaf.language, input: kaf.raw}.to_query
43
+ raise Core::UnsupportedLanguageError, kaf.language if response.status == 406
44
+ raise response.body if response.status >= 400
45
+ tokens = JSON.parse response.body
46
+
47
+ w_index = 0
48
+ tokens.each_with_index do |sentence, s_index|
49
+ sentence.each_with_index do |word|
50
+ w_index += 1
51
+ misc = word['misc']
52
+ offset = misc.match(/start_char=(\d+)|/)[1].to_i
53
+ length = misc.match(/end_char=(\d+)/)[1].to_i - offset
54
+
55
+ u_pos = word['upos']
56
+ pos = POS[u_pos]
57
+ raise "Didn't find a map for #{u_pos}" if pos.nil?
58
+ type = if POS_OPEN.include? pos then 'open' else 'close' end
59
+
60
+ params = {
61
+ wid: w_index,
62
+ sid: s_index + 1,
63
+ tid: w_index,
64
+ para: 1,
65
+ offset: offset,
66
+ length: length,
67
+ text: word['text'],
68
+ lemma: word['lemma'],
69
+ morphofeat: u_pos,
70
+ pos: pos,
71
+ type: type,
72
+ }
73
+
74
+ kaf.add_word_form params
75
+ kaf.add_term params
76
+ end
77
+ end
78
+
79
+ kaf.add_linguistic_processor DESC, "#{VERSION}", 'text', timestamp: true
80
+
81
+ kaf.to_xml
82
+ end
83
+
84
+ end
85
+ end
86
+ end
@@ -10,6 +10,7 @@ Gem::Specification.new do |spec|
10
10
  spec.license = 'Apache 2.0'
11
11
 
12
12
  spec.files = Dir.glob([
13
+ 'config/**/*',
13
14
  'exec/**/*',
14
15
  'lib/**/*',
15
16
  '*.gemspec',
@@ -18,22 +19,25 @@ Gem::Specification.new do |spec|
18
19
  ]).select{ |file| File.file? file }
19
20
 
20
21
  spec.bindir = 'bin'
21
- spec.executables = Dir.glob('bin/*').map { |file| File.basename(file) }
22
+ spec.executables = Dir.glob('bin/*').map{ |file| File.basename(file) }
22
23
 
23
24
  spec.add_dependency 'activesupport'
24
25
  spec.add_dependency 'google-cloud-translate', '~> 1.0'
25
26
  spec.add_dependency 'httpclient'
26
27
  spec.add_dependency 'hashie'
27
28
 
28
- spec.add_dependency 'opener-daemons', '~> 2.7.1'
29
+ spec.add_dependency 'roda'
30
+ spec.add_dependency 'rack-timeout'
31
+ spec.add_dependency 'faraday'
32
+ spec.add_dependency 'opener-daemons', '~> 2.7.2'
29
33
  spec.add_dependency 'opener-callback-handler', '~> 1.0'
30
34
 
31
- spec.add_dependency 'opener-language-identifier'
32
- spec.add_dependency 'opener-tokenizer'
33
- spec.add_dependency 'opener-pos-tagger'
34
- spec.add_dependency 'opener-polarity-tagger', '>= 3.1.2'
35
- spec.add_dependency 'opener-property-tagger', '>= 3.2.1'
36
- spec.add_dependency 'opener-opinion-detector-basic'
35
+ spec.add_dependency 'opener-language-identifier', '>= 4.4.0'
36
+ spec.add_dependency 'opener-tokenizer', '>= 2.2.0'
37
+ spec.add_dependency 'opener-pos-tagger', '>= 3.2.0'
38
+ spec.add_dependency 'opener-polarity-tagger', '>= 3.2.7'
39
+ spec.add_dependency 'opener-property-tagger', '>= 3.3.4'
40
+ spec.add_dependency 'opener-opinion-detector-basic', '>= 3.2.3'
37
41
 
38
42
  spec.add_development_dependency 'bundler', '~> 1.3'
39
43
  spec.add_development_dependency 'rake'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: opener-chained-daemon
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.1
4
+ version: 3.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - development@olery.com
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-09-23 00:00:00.000000000 Z
11
+ date: 2020-11-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -66,20 +66,62 @@ dependencies:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: roda
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rack-timeout
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: faraday
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
69
111
  - !ruby/object:Gem::Dependency
70
112
  name: opener-daemons
71
113
  requirement: !ruby/object:Gem::Requirement
72
114
  requirements:
73
115
  - - "~>"
74
116
  - !ruby/object:Gem::Version
75
- version: 2.7.1
117
+ version: 2.7.2
76
118
  type: :runtime
77
119
  prerelease: false
78
120
  version_requirements: !ruby/object:Gem::Requirement
79
121
  requirements:
80
122
  - - "~>"
81
123
  - !ruby/object:Gem::Version
82
- version: 2.7.1
124
+ version: 2.7.2
83
125
  - !ruby/object:Gem::Dependency
84
126
  name: opener-callback-handler
85
127
  requirement: !ruby/object:Gem::Requirement
@@ -100,84 +142,84 @@ dependencies:
100
142
  requirements:
101
143
  - - ">="
102
144
  - !ruby/object:Gem::Version
103
- version: '0'
145
+ version: 4.4.0
104
146
  type: :runtime
105
147
  prerelease: false
106
148
  version_requirements: !ruby/object:Gem::Requirement
107
149
  requirements:
108
150
  - - ">="
109
151
  - !ruby/object:Gem::Version
110
- version: '0'
152
+ version: 4.4.0
111
153
  - !ruby/object:Gem::Dependency
112
154
  name: opener-tokenizer
113
155
  requirement: !ruby/object:Gem::Requirement
114
156
  requirements:
115
157
  - - ">="
116
158
  - !ruby/object:Gem::Version
117
- version: '0'
159
+ version: 2.2.0
118
160
  type: :runtime
119
161
  prerelease: false
120
162
  version_requirements: !ruby/object:Gem::Requirement
121
163
  requirements:
122
164
  - - ">="
123
165
  - !ruby/object:Gem::Version
124
- version: '0'
166
+ version: 2.2.0
125
167
  - !ruby/object:Gem::Dependency
126
168
  name: opener-pos-tagger
127
169
  requirement: !ruby/object:Gem::Requirement
128
170
  requirements:
129
171
  - - ">="
130
172
  - !ruby/object:Gem::Version
131
- version: '0'
173
+ version: 3.2.0
132
174
  type: :runtime
133
175
  prerelease: false
134
176
  version_requirements: !ruby/object:Gem::Requirement
135
177
  requirements:
136
178
  - - ">="
137
179
  - !ruby/object:Gem::Version
138
- version: '0'
180
+ version: 3.2.0
139
181
  - !ruby/object:Gem::Dependency
140
182
  name: opener-polarity-tagger
141
183
  requirement: !ruby/object:Gem::Requirement
142
184
  requirements:
143
185
  - - ">="
144
186
  - !ruby/object:Gem::Version
145
- version: 3.1.2
187
+ version: 3.2.7
146
188
  type: :runtime
147
189
  prerelease: false
148
190
  version_requirements: !ruby/object:Gem::Requirement
149
191
  requirements:
150
192
  - - ">="
151
193
  - !ruby/object:Gem::Version
152
- version: 3.1.2
194
+ version: 3.2.7
153
195
  - !ruby/object:Gem::Dependency
154
196
  name: opener-property-tagger
155
197
  requirement: !ruby/object:Gem::Requirement
156
198
  requirements:
157
199
  - - ">="
158
200
  - !ruby/object:Gem::Version
159
- version: 3.2.1
201
+ version: 3.3.4
160
202
  type: :runtime
161
203
  prerelease: false
162
204
  version_requirements: !ruby/object:Gem::Requirement
163
205
  requirements:
164
206
  - - ">="
165
207
  - !ruby/object:Gem::Version
166
- version: 3.2.1
208
+ version: 3.3.4
167
209
  - !ruby/object:Gem::Dependency
168
210
  name: opener-opinion-detector-basic
169
211
  requirement: !ruby/object:Gem::Requirement
170
212
  requirements:
171
213
  - - ">="
172
214
  - !ruby/object:Gem::Version
173
- version: '0'
215
+ version: 3.2.3
174
216
  type: :runtime
175
217
  prerelease: false
176
218
  version_requirements: !ruby/object:Gem::Requirement
177
219
  requirements:
178
220
  - - ">="
179
221
  - !ruby/object:Gem::Version
180
- version: '0'
222
+ version: 3.2.3
181
223
  - !ruby/object:Gem::Dependency
182
224
  name: bundler
183
225
  requirement: !ruby/object:Gem::Requirement
@@ -276,12 +318,19 @@ files:
276
318
  - bin/chained-daemon-csv
277
319
  - bin/chained-daemon-daemon
278
320
  - bin/console
321
+ - config/puma.rb
279
322
  - exec/chained-daemon.rb
280
323
  - lib/opener/chained_daemon.rb
281
324
  - lib/opener/chained_daemon/chained_daemon.rb
282
325
  - lib/opener/chained_daemon/cli.rb
326
+ - lib/opener/chained_daemon/languages_cache.rb
283
327
  - lib/opener/chained_daemon/microsoft_translator.rb
284
328
  - lib/opener/chained_daemon/version.rb
329
+ - lib/opener/chained_daemon/webservice.rb
330
+ - lib/opener/kaf/document.rb
331
+ - lib/opener/kaf/term.rb
332
+ - lib/opener/kaf/text.rb
333
+ - lib/opener/stanza/tokenizer_pos.rb
285
334
  - opener-chained-daemon.gemspec
286
335
  homepage:
287
336
  licenses:
@@ -303,7 +352,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
303
352
  version: '0'
304
353
  requirements: []
305
354
  rubyforge_project:
306
- rubygems_version: 2.7.8
355
+ rubygems_version: 2.7.6.2
307
356
  signing_key:
308
357
  specification_version: 4
309
358
  summary: OpeNER daemon for processing multiple queues at once