opener-property-tagger 3.0.6 → 3.3.1

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
- SHA1:
3
- metadata.gz: c3d36e45bbff187579cbb8f2275d53261ed13030
4
- data.tar.gz: 2850b27e9876336083dde1af17083658be60ef1c
2
+ SHA256:
3
+ metadata.gz: d732e35937583e6fbad1452c2dc72f894df668979a9259c19f4a84a9557b8971
4
+ data.tar.gz: 6999b3814921c0ec9cefd59b096c89b18c4ac4e9c5a9529f0fa3141c463ea306
5
5
  SHA512:
6
- metadata.gz: f95a22d030ff6dc1685ee117ddae2f0d104fce5b187e7bb2062b96dd98ba035dd55c6b9f21266a63e968ff42d9e0869ce762786c7a2d7f5b53b6cc63d5aff4a2
7
- data.tar.gz: be9bfed3bb90e26a111e03973a3ec543780e886be08d7102dad057e81917e1323c599198f81d79da58257d85e5adafaf507454a0fa6e30105fc8210698c94e17
6
+ metadata.gz: 0d1d7714bfeab24e5505ea3d442b423ab3fe6daa26dfe214b412add729e2544543d0ccadf078bec3d852bb3fa2b1ec541b131a064b9a2598e38bebbeb58a6061
7
+ data.tar.gz: 24a4b3b4dcd85edd9249b16e79673487a174c58e7c826820c4b1a67aed56a8f92ec4e228e0d773598b3ed6ce14b5196a2163b48c63646d3442014fcfc2af561c
@@ -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,58 @@
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
+ def initialize
11
+ super
12
+
13
+ @url = ENV['PROPERTY_TAGGER_LEXICONS_URL']
14
+ @cache = {}
15
+ end
16
+
17
+ def [] **params
18
+ synchronize do
19
+ if existing = @cache[params]
20
+ existing.tap do
21
+ Thread.new{ @cache[params] = cache_update existing, **params }
22
+ end
23
+ else
24
+ @cache[params] = cache_update **params
25
+ end
26
+ end
27
+ end
28
+ alias_method :get, :[]
29
+
30
+ def cache_update existing = nil, **params
31
+ from = Time.now
32
+ lexicons = load_aspects cache: existing, **params
33
+
34
+ return existing if existing and lexicons.blank?
35
+ Hashie::Mash.new(
36
+ aspects: lexicons,
37
+ from: from,
38
+ )
39
+ end
40
+
41
+ def load_aspects lang:, cache:, **params
42
+ url = "#{@url}&language_code=#{lang}&#{params.to_query}"
43
+ url += "&if_updated_since=#{cache.from.iso8601}" if cache
44
+ puts "#{lang}: loading aspects from #{url}"
45
+
46
+ lexicons = JSON.parse HTTPClient.new.get(url).body
47
+ lexicons = lexicons['data'].map{ |l| Hashie::Mash.new l }
48
+ mapping = Hash.new{ |hash, key| hash[key] = [] }
49
+ lexicons.each do |l|
50
+ mapping[l.lemma.to_sym] << l.aspect
51
+ end
52
+
53
+ mapping
54
+ end
55
+
56
+ end
57
+ end
58
+ end
@@ -1,5 +1,7 @@
1
1
  module Opener
2
2
  class PropertyTagger
3
- VERSION = '3.0.6'
4
- end # PropertyTagger
5
- end # Opener
3
+
4
+ VERSION = '3.3.1'
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'
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.0.6
4
+ version: 3.3.1
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-02-13 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
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '1.0'
61
+ - - ">="
62
+ - !ruby/object:Gem::Version
63
+ version: 1.3.1
56
64
  name: oga
65
+ prerelease: false
66
+ type: :runtime
67
+ version_requirements: !ruby/object:Gem::Requirement
68
+ requirements:
69
+ - - "~>"
70
+ - !ruby/object:Gem::Version
71
+ version: '1.0'
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: 1.3.1
75
+ - !ruby/object:Gem::Dependency
57
76
  requirement: !ruby/object:Gem::Requirement
58
77
  requirements:
59
78
  - - ">="
60
79
  - !ruby/object:Gem::Version
61
80
  version: '0'
81
+ name: httpclient
82
+ prerelease: false
62
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
63
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
64
112
  version_requirements: !ruby/object:Gem::Requirement
65
113
  requirements:
66
114
  - - ">="
67
115
  - !ruby/object:Gem::Version
68
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.2.2
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: