opener-property-tagger 3.1.0 → 3.3.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 5c733650becb914d2974c844954ef3a53febf56e
4
- data.tar.gz: 5e42560d34a43e15786d743626d4b7518bdc705f
2
+ SHA256:
3
+ metadata.gz: 6483ef2a01a413e280ed9555566499496748cb0b8c25ddd9853fb50165ab03f9
4
+ data.tar.gz: eb0f85d3d82aed282d21a3b51a0c75867b62c547b49fd1ceeaac374baff86111
5
5
  SHA512:
6
- metadata.gz: 8cbb1e79839415fff83b68ad363175a5dead10ce9e4e814e10ced7878553c38a8ee0690b751e0aea4810e40638a23cdb1d8b1c5f83377b341c21049a2cf5be5d
7
- data.tar.gz: 4e8989a60251a2f712563e770574ac2638b3484abca7b123d4e988040dd5d7848b6d4158a5656547dfb123170dc5ac2ea9bd123fb89e167bfa1f2982e9a554ad
6
+ metadata.gz: fe31cb493644de7eaed474d9064e3f8880f229b8e05f0685aae18e730f5cd3d94c92aa403966904147b710f0e9589cffa840cf44ac83d64fc7f9c9211ffc6313
7
+ data.tar.gz: '0939965101de5ccd503bbdeae6b511552354d8f285e263b739b5d5f004ffdf03411fac5b4a97404f728bd1038f8320843c2dcb2f8ae70059eedc44e0682c4d71'
@@ -2,13 +2,18 @@ require 'open3'
2
2
  require 'slop'
3
3
  require 'oga'
4
4
  require 'monitor'
5
+ require 'httpclient'
6
+ require 'hashie'
7
+ require 'json'
8
+ require 'active_support/all'
5
9
 
6
10
  require 'rexml/document'
7
11
  require 'rexml/formatters/pretty'
8
12
 
9
13
  require_relative 'property_tagger/version'
10
14
  require_relative 'property_tagger/cli'
11
- require_relative 'property_tagger/aspects_cache'
15
+ require_relative 'property_tagger/remote_aspects_cache'
16
+ require_relative 'property_tagger/file_aspects_cache'
12
17
  require_relative 'property_tagger/processor'
13
18
 
14
19
  module Opener
@@ -43,14 +48,17 @@ module Opener
43
48
  # @return [String]
44
49
  #
45
50
  def path
46
- path = options[:resource_path] || ENV['RESOURCE_PATH'] ||
51
+ return @path if @path
52
+
53
+ @path = options[:resource_path] || ENV['RESOURCE_PATH'] ||
47
54
  ENV['PROPERTY_TAGGER_LEXICONS_PATH']
55
+ return unless @path
48
56
 
49
- unless path
50
- raise ArgumentError, 'No lexicon path provided'
51
- end
57
+ @path = File.expand_path @path
58
+ end
52
59
 
53
- return File.expand_path(path)
60
+ def remote_url
61
+ @remote_url ||= ENV['PROPERTY_TAGGER_LEXICONS_URL']
54
62
  end
55
63
 
56
64
  ##
@@ -59,11 +67,18 @@ module Opener
59
67
  # @param [String] input
60
68
  # @return [String]
61
69
  #
62
- def run(input)
70
+ def run input, params = {}
63
71
  timestamp = !options[:no_time]
64
72
 
65
- return Processor.new(input, path, timestamp, options[:pretty]).process
73
+ Processor.new(input,
74
+ params: params,
75
+ url: remote_url,
76
+ path: path,
77
+ timestamp: timestamp,
78
+ pretty: options[:pretty],
79
+ ).process
66
80
  end
67
- end # PolarityTagger
68
- end # Opener
81
+
82
+ end
83
+ end
69
84
 
@@ -3,7 +3,8 @@ module Opener
3
3
  ##
4
4
  # Thread-safe cache for storing the contents of aspect files.
5
5
  #
6
- class AspectsCache
6
+ class FileAspectsCache
7
+
7
8
  include MonitorMixin
8
9
 
9
10
  def initialize
@@ -22,8 +23,6 @@ module Opener
22
23
  synchronize do
23
24
  @cache[path] = load_aspects(path) unless @cache.key?(path)
24
25
  end
25
-
26
- return @cache[path]
27
26
  end
28
27
 
29
28
  alias_method :get, :[]
@@ -44,6 +43,7 @@ module Opener
44
43
 
45
44
  return mapping
46
45
  end
47
- end # AspectsCache
48
- end # PropertyTagger
49
- end # Opener
46
+
47
+ end
48
+ end
49
+ end
@@ -4,14 +4,18 @@ module Opener
4
4
  # Class that applies property tagging to a given input KAF file.
5
5
  #
6
6
  class Processor
7
- attr_accessor :document, :aspects_path, :timestamp, :pretty
7
+
8
+ attr_accessor :document
9
+ attr_accessor :aspects, :aspects_path, :aspects_url
10
+ attr_accessor :timestamp, :pretty
8
11
 
9
12
  ##
10
13
  # Global cache used for storing loaded aspects.
11
14
  #
12
- # @return [Opener::PropertyTagger::AspectsCache.new]
15
+ # @return [Opener::PropertyTagger::FileAspectsCache.new]
13
16
  #
14
- ASPECTS_CACHE = AspectsCache.new
17
+ FILE_ASPECTS_CACHE = FileAspectsCache.new
18
+ REMOTE_ASPECTS_CACHE = RemoteAspectsCache.new
15
19
 
16
20
  ##
17
21
  # @param [String|IO] file The KAF file/input to process.
@@ -20,13 +24,19 @@ module Opener
20
24
  # @param [TrueClass|FalseClass] pretty Enable pretty formatting, disabled
21
25
  # by default due to the performance overhead.
22
26
  #
23
- def initialize(file, aspects_path, timestamp = true, pretty = false)
24
- @document = Oga.parse_xml(file)
25
- @aspects_path = aspects_path
27
+ def initialize file, params: {}, url: nil, path: nil, timestamp: true, pretty: false
28
+ @document = Oga.parse_xml file
29
+ raise 'Error parsing input. Input is required to be KAF' unless is_kaf?
26
30
  @timestamp = timestamp
27
31
  @pretty = pretty
28
32
 
29
- raise 'Error parsing input. Input is required to be KAF' unless is_kaf?
33
+ @params = params
34
+ @cache_keys = params[:cache_keys] || {lang: language}
35
+ @remote = !url.nil?
36
+ @aspects_path = path
37
+ @aspects_url = url
38
+
39
+ @aspects = if @remote then REMOTE_ASPECTS_CACHE[**@cache_keys].aspects else FILE_ASPECTS_CACHE[aspects_file] end
30
40
  end
31
41
 
32
42
  ##
@@ -50,13 +60,6 @@ module Opener
50
60
  return pretty ? pretty_print(document) : document.to_xml
51
61
  end
52
62
 
53
- ##
54
- # @return [Hash]
55
- #
56
- def aspects
57
- return ASPECTS_CACHE[aspects_file]
58
- end
59
-
60
63
  ##
61
64
  # Get the language of the input file.
62
65
  #
@@ -228,9 +231,9 @@ module Opener
228
231
  # @return [String]
229
232
  #
230
233
  def aspects_file
231
- return @aspects_file ||=
232
- File.expand_path("#{aspects_path}/#{language}.txt", __FILE__)
234
+ @aspects_file ||= File.expand_path "#{aspects_path}/#{language}.txt", __FILE__
233
235
  end
234
- end # Processor
235
- end # PropertyTagger
236
- end # Opener
236
+
237
+ end
238
+ end
239
+ end
@@ -0,0 +1,60 @@
1
+ module Opener
2
+ class PropertyTagger
3
+ ##
4
+ # Thread-safe cache for storing the contents of remote aspects.
5
+ #
6
+ class RemoteAspectsCache
7
+
8
+ include MonitorMixin
9
+
10
+ UPDATE_INTERVAL = (ENV['CACHE_EXPIRE_MINS']&.to_i || 5).minutes
11
+
12
+ def initialize
13
+ super
14
+
15
+ @url = ENV['PROPERTY_TAGGER_LEXICONS_URL']
16
+ @cache = {}
17
+ end
18
+
19
+ def [] **params
20
+ synchronize do
21
+ existing = @cache[params]
22
+ break existing if existing and existing.from > UPDATE_INTERVAL.ago
23
+ @cache[params] = cache_update existing, **params
24
+ end
25
+ end
26
+ alias_method :get, :[]
27
+
28
+ def cache_update existing = nil, **params
29
+ from = Time.now
30
+ lexicons = load_aspects cache: existing, **params
31
+
32
+ if existing and lexicons.blank?
33
+ existing.from = from
34
+ return existing
35
+ end
36
+
37
+ Hashie::Mash.new(
38
+ aspects: lexicons,
39
+ from: from,
40
+ )
41
+ end
42
+
43
+ def load_aspects lang:, cache:, **params
44
+ url = "#{@url}&language_code=#{lang}&#{params.to_query}"
45
+ url += "&if_updated_since=#{cache.from.iso8601}" if cache
46
+ puts "#{lang}: loading aspects from #{url}"
47
+
48
+ lexicons = JSON.parse HTTPClient.new.get(url).body
49
+ lexicons = lexicons['data'].map{ |l| Hashie::Mash.new l }
50
+ mapping = Hash.new{ |hash, key| hash[key] = [] }
51
+ lexicons.each do |l|
52
+ mapping[l.lemma.to_sym] << l.aspect
53
+ end
54
+
55
+ mapping
56
+ end
57
+
58
+ end
59
+ end
60
+ end
@@ -1,5 +1,7 @@
1
1
  module Opener
2
2
  class PropertyTagger
3
- VERSION = '3.1.0'
4
- end # PropertyTagger
5
- end # Opener
3
+
4
+ VERSION = '3.3.2'
5
+
6
+ end
7
+ end
@@ -28,7 +28,10 @@ Gem::Specification.new do |gem|
28
28
  gem.add_dependency 'opener-webservice', '~> 2.1'
29
29
  gem.add_dependency 'opener-core', '~> 2.2'
30
30
 
31
- gem.add_dependency 'oga', '~> 1.3.0'
31
+ gem.add_dependency 'oga', ['~> 1.0', '>= 1.3.1']
32
+ gem.add_dependency 'httpclient'
33
+ gem.add_dependency 'hashie'
34
+ gem.add_dependency 'activesupport'
32
35
 
33
36
  gem.add_development_dependency 'rspec', '~> 3.0'
34
37
  gem.add_development_dependency 'cucumber'
metadata CHANGED
@@ -1,129 +1,177 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: opener-property-tagger
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.1.0
4
+ version: 3.3.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - development@olery.com
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-09-07 00:00:00.000000000 Z
11
+ date: 2020-10-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: opener-daemons
15
14
  requirement: !ruby/object:Gem::Requirement
16
15
  requirements:
17
16
  - - "~>"
18
17
  - !ruby/object:Gem::Version
19
18
  version: '2.2'
20
- type: :runtime
19
+ name: opener-daemons
21
20
  prerelease: false
21
+ type: :runtime
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '2.2'
27
27
  - !ruby/object:Gem::Dependency
28
- name: opener-webservice
29
28
  requirement: !ruby/object:Gem::Requirement
30
29
  requirements:
31
30
  - - "~>"
32
31
  - !ruby/object:Gem::Version
33
32
  version: '2.1'
34
- type: :runtime
33
+ name: opener-webservice
35
34
  prerelease: false
35
+ type: :runtime
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '2.1'
41
41
  - !ruby/object:Gem::Dependency
42
- name: opener-core
43
42
  requirement: !ruby/object:Gem::Requirement
44
43
  requirements:
45
44
  - - "~>"
46
45
  - !ruby/object:Gem::Version
47
46
  version: '2.2'
48
- type: :runtime
47
+ name: opener-core
49
48
  prerelease: false
49
+ type: :runtime
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '2.2'
55
55
  - !ruby/object:Gem::Dependency
56
- name: oga
57
56
  requirement: !ruby/object:Gem::Requirement
58
57
  requirements:
59
58
  - - "~>"
60
59
  - !ruby/object:Gem::Version
61
- version: 1.3.0
62
- type: :runtime
60
+ version: '1.0'
61
+ - - ">="
62
+ - !ruby/object:Gem::Version
63
+ version: 1.3.1
64
+ name: oga
63
65
  prerelease: false
66
+ type: :runtime
64
67
  version_requirements: !ruby/object:Gem::Requirement
65
68
  requirements:
66
69
  - - "~>"
67
70
  - !ruby/object:Gem::Version
68
- version: 1.3.0
71
+ version: '1.0'
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: 1.3.1
75
+ - !ruby/object:Gem::Dependency
76
+ requirement: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - ">="
79
+ - !ruby/object:Gem::Version
80
+ version: '0'
81
+ name: httpclient
82
+ prerelease: false
83
+ type: :runtime
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ - !ruby/object:Gem::Dependency
90
+ requirement: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - ">="
93
+ - !ruby/object:Gem::Version
94
+ version: '0'
95
+ name: hashie
96
+ prerelease: false
97
+ type: :runtime
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ - !ruby/object:Gem::Dependency
104
+ requirement: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - ">="
107
+ - !ruby/object:Gem::Version
108
+ version: '0'
109
+ name: activesupport
110
+ prerelease: false
111
+ type: :runtime
112
+ version_requirements: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - ">="
115
+ - !ruby/object:Gem::Version
116
+ version: '0'
69
117
  - !ruby/object:Gem::Dependency
70
- name: rspec
71
118
  requirement: !ruby/object:Gem::Requirement
72
119
  requirements:
73
120
  - - "~>"
74
121
  - !ruby/object:Gem::Version
75
122
  version: '3.0'
76
- type: :development
123
+ name: rspec
77
124
  prerelease: false
125
+ type: :development
78
126
  version_requirements: !ruby/object:Gem::Requirement
79
127
  requirements:
80
128
  - - "~>"
81
129
  - !ruby/object:Gem::Version
82
130
  version: '3.0'
83
131
  - !ruby/object:Gem::Dependency
84
- name: cucumber
85
132
  requirement: !ruby/object:Gem::Requirement
86
133
  requirements:
87
134
  - - ">="
88
135
  - !ruby/object:Gem::Version
89
136
  version: '0'
90
- type: :development
137
+ name: cucumber
91
138
  prerelease: false
139
+ type: :development
92
140
  version_requirements: !ruby/object:Gem::Requirement
93
141
  requirements:
94
142
  - - ">="
95
143
  - !ruby/object:Gem::Version
96
144
  version: '0'
97
145
  - !ruby/object:Gem::Dependency
98
- name: rake
99
146
  requirement: !ruby/object:Gem::Requirement
100
147
  requirements:
101
148
  - - ">="
102
149
  - !ruby/object:Gem::Version
103
150
  version: '0'
104
- type: :development
151
+ name: rake
105
152
  prerelease: false
153
+ type: :development
106
154
  version_requirements: !ruby/object:Gem::Requirement
107
155
  requirements:
108
156
  - - ">="
109
157
  - !ruby/object:Gem::Version
110
158
  version: '0'
111
159
  - !ruby/object:Gem::Dependency
112
- name: benchmark-ips
113
160
  requirement: !ruby/object:Gem::Requirement
114
161
  requirements:
115
162
  - - "~>"
116
163
  - !ruby/object:Gem::Version
117
164
  version: '2.0'
118
- type: :development
165
+ name: benchmark-ips
119
166
  prerelease: false
167
+ type: :development
120
168
  version_requirements: !ruby/object:Gem::Requirement
121
169
  requirements:
122
170
  - - "~>"
123
171
  - !ruby/object:Gem::Version
124
172
  version: '2.0'
125
173
  description: Property tagger for hotels in Dutch and English.
126
- email:
174
+ email:
127
175
  executables:
128
176
  - property-tagger
129
177
  - property-tagger-daemon
@@ -139,10 +187,11 @@ files:
139
187
  - config.ru
140
188
  - exec/property-tagger.rb
141
189
  - lib/opener/property_tagger.rb
142
- - lib/opener/property_tagger/aspects_cache.rb
143
190
  - lib/opener/property_tagger/cli.rb
191
+ - lib/opener/property_tagger/file_aspects_cache.rb
144
192
  - lib/opener/property_tagger/processor.rb
145
193
  - lib/opener/property_tagger/public/markdown.css
194
+ - lib/opener/property_tagger/remote_aspects_cache.rb
146
195
  - lib/opener/property_tagger/server.rb
147
196
  - lib/opener/property_tagger/version.rb
148
197
  - lib/opener/property_tagger/views/index.erb
@@ -154,7 +203,7 @@ homepage: http://opener-project.github.com/
154
203
  licenses:
155
204
  - Apache 2.0
156
205
  metadata: {}
157
- post_install_message:
206
+ post_install_message:
158
207
  rdoc_options: []
159
208
  require_paths:
160
209
  - lib
@@ -169,10 +218,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
169
218
  - !ruby/object:Gem::Version
170
219
  version: '0'
171
220
  requirements: []
172
- rubyforge_project:
173
- rubygems_version: 2.4.8
174
- signing_key:
221
+ rubyforge_project:
222
+ rubygems_version: 2.7.9
223
+ signing_key:
175
224
  specification_version: 4
176
225
  summary: Property tagger for hotels in Dutch and English.
177
226
  test_files: []
178
- has_rdoc: