wovnrb 3.11.0 → 3.13.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 +4 -4
- data/.rubocop.yml +3 -0
- data/README.en.md +256 -256
- data/README.ja.md +218 -218
- data/docker/rails/TestSite/config/application.rb +1 -2
- data/docker/rails/TestSite/yarn.lock +7449 -7353
- data/lib/wovnrb/api_translator.rb +186 -183
- data/lib/wovnrb/headers.rb +192 -192
- data/lib/wovnrb/lang.rb +260 -260
- data/lib/wovnrb/services/html_converter.rb +240 -222
- data/lib/wovnrb/services/html_replace_marker.rb +48 -48
- data/lib/wovnrb/settings.rb +2 -2
- data/lib/wovnrb/store.rb +230 -222
- data/lib/wovnrb/version.rb +3 -3
- data/lib/wovnrb.rb +146 -145
- data/test/lib/api_translator_test.rb +228 -217
- data/test/lib/custom_domain/custom_domain_langs_test.rb +2 -2
- data/test/lib/lang_test.rb +59 -59
- data/test/lib/services/html_converter_test.rb +570 -532
- data/test/lib/services/html_replace_marker_test.rb +149 -149
- data/test/lib/url_language_switcher_test.rb +1097 -1097
- data/test/lib/wovnrb_test.rb +477 -454
- data/test/test_helper.rb +1 -0
- metadata +6 -6
data/lib/wovnrb/store.rb
CHANGED
|
@@ -1,222 +1,230 @@
|
|
|
1
|
-
require 'net/http'
|
|
2
|
-
require 'uri'
|
|
3
|
-
require 'cgi'
|
|
4
|
-
require 'singleton'
|
|
5
|
-
require 'wovnrb/custom_domain/custom_domain_langs'
|
|
6
|
-
require 'wovnrb/services/wovn_logger'
|
|
7
|
-
require 'wovnrb/services/glob'
|
|
8
|
-
require 'wovnrb/settings'
|
|
9
|
-
require 'active_support'
|
|
10
|
-
require 'active_support/core_ext'
|
|
11
|
-
|
|
12
|
-
module Wovnrb
|
|
13
|
-
class Store
|
|
14
|
-
include Singleton
|
|
15
|
-
|
|
16
|
-
def self.default_settings
|
|
17
|
-
Settings.new.merge(
|
|
18
|
-
'project_token' => '',
|
|
19
|
-
'log_path' => 'log/wovn_error.log',
|
|
20
|
-
'ignore_paths' => [],
|
|
21
|
-
'ignore_globs' => [],
|
|
22
|
-
'url_pattern' => 'path',
|
|
23
|
-
'url_pattern_reg' => "/(?<lang>[^/.?]+)",
|
|
24
|
-
'lang_param_name' => 'wovn',
|
|
25
|
-
'query' => [],
|
|
26
|
-
'ignore_class' => [],
|
|
27
|
-
'api_url' => 'https://wovn.global.ssl.fastly.net',
|
|
28
|
-
'api_timeout_seconds' => 1.0,
|
|
29
|
-
'api_timeout_search_engine_bots' => 5.0,
|
|
30
|
-
'default_lang' => 'ja',
|
|
31
|
-
'supported_langs' => %w[en ja],
|
|
32
|
-
'test_mode' => false,
|
|
33
|
-
'test_url' => '',
|
|
34
|
-
'cache_megabytes' => nil,
|
|
35
|
-
'
|
|
36
|
-
'
|
|
37
|
-
'
|
|
38
|
-
'
|
|
39
|
-
'
|
|
40
|
-
'
|
|
41
|
-
'
|
|
42
|
-
'
|
|
43
|
-
'
|
|
44
|
-
'
|
|
45
|
-
'
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
#
|
|
55
|
-
#
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
@
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
#
|
|
65
|
-
#
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
#
|
|
72
|
-
#
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
if
|
|
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
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
#
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
@
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
#
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
when '
|
|
157
|
-
@settings['url_pattern_reg'] = "(
|
|
158
|
-
when '
|
|
159
|
-
@settings['url_pattern_reg'] = '
|
|
160
|
-
when '
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
@settings['
|
|
179
|
-
end
|
|
180
|
-
|
|
181
|
-
def
|
|
182
|
-
@settings['
|
|
183
|
-
end
|
|
184
|
-
|
|
185
|
-
def
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
end
|
|
197
|
-
|
|
198
|
-
def
|
|
199
|
-
@settings['
|
|
200
|
-
end
|
|
201
|
-
|
|
202
|
-
def
|
|
203
|
-
@settings['
|
|
204
|
-
end
|
|
205
|
-
|
|
206
|
-
def
|
|
207
|
-
@settings['
|
|
208
|
-
end
|
|
209
|
-
|
|
210
|
-
def
|
|
211
|
-
@
|
|
212
|
-
end
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
end
|
|
221
|
-
|
|
222
|
-
|
|
1
|
+
require 'net/http'
|
|
2
|
+
require 'uri'
|
|
3
|
+
require 'cgi'
|
|
4
|
+
require 'singleton'
|
|
5
|
+
require 'wovnrb/custom_domain/custom_domain_langs'
|
|
6
|
+
require 'wovnrb/services/wovn_logger'
|
|
7
|
+
require 'wovnrb/services/glob'
|
|
8
|
+
require 'wovnrb/settings'
|
|
9
|
+
require 'active_support'
|
|
10
|
+
require 'active_support/core_ext'
|
|
11
|
+
|
|
12
|
+
module Wovnrb
|
|
13
|
+
class Store
|
|
14
|
+
include Singleton
|
|
15
|
+
|
|
16
|
+
def self.default_settings
|
|
17
|
+
Settings.new.merge(
|
|
18
|
+
'project_token' => '',
|
|
19
|
+
'log_path' => 'log/wovn_error.log',
|
|
20
|
+
'ignore_paths' => [],
|
|
21
|
+
'ignore_globs' => [],
|
|
22
|
+
'url_pattern' => 'path',
|
|
23
|
+
'url_pattern_reg' => "/(?<lang>[^/.?]+)",
|
|
24
|
+
'lang_param_name' => 'wovn',
|
|
25
|
+
'query' => [],
|
|
26
|
+
'ignore_class' => [],
|
|
27
|
+
'api_url' => 'https://wovn.global.ssl.fastly.net',
|
|
28
|
+
'api_timeout_seconds' => 1.0,
|
|
29
|
+
'api_timeout_search_engine_bots' => 5.0,
|
|
30
|
+
'default_lang' => 'ja',
|
|
31
|
+
'supported_langs' => %w[en ja],
|
|
32
|
+
'test_mode' => false,
|
|
33
|
+
'test_url' => '',
|
|
34
|
+
'cache_megabytes' => nil,
|
|
35
|
+
'hreflang_x_default_lang' => nil,
|
|
36
|
+
'ttl_seconds' => nil,
|
|
37
|
+
'use_proxy' => false, # use env['HTTP_X_FORWARDED_HOST'] instead of env['HTTP_HOST'] and env['SERVER_NAME'] when this setting is true.
|
|
38
|
+
'custom_lang_aliases' => {},
|
|
39
|
+
'translate_fragment' => true,
|
|
40
|
+
'widget_url' => 'https://j.wovn.io/1',
|
|
41
|
+
'wovn_dev_mode' => false,
|
|
42
|
+
'compress_api_requests' => true,
|
|
43
|
+
'translate_canonical_tag' => true,
|
|
44
|
+
'custom_domain_langs' => {},
|
|
45
|
+
'insert_hreflangs' => true,
|
|
46
|
+
'use_cookie_lang' => false
|
|
47
|
+
)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def initialize
|
|
51
|
+
reset
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# Reset @settings and @config_loaded variables to default.
|
|
55
|
+
#
|
|
56
|
+
# @return [nil]
|
|
57
|
+
def reset
|
|
58
|
+
@settings = Store.default_settings
|
|
59
|
+
@custom_domain_langs = nil
|
|
60
|
+
# When Store is initialized, the Rails.configuration object is not yet initialized
|
|
61
|
+
@config_loaded = false
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# Returns true or false based on whether the token is valid or not
|
|
65
|
+
#
|
|
66
|
+
# @return [Boolean] Returns true if the token is valid, and false if it is not
|
|
67
|
+
def valid_token?(token)
|
|
68
|
+
!token.nil? && [5, 6].include?(token.length)
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
# Returns true or false based on whether the settings are valid or not, logs any invalid settings to ../error.log
|
|
72
|
+
#
|
|
73
|
+
# @return [Boolean] Returns true if the settings are valid, and false if they are not
|
|
74
|
+
def valid_settings?
|
|
75
|
+
valid = true
|
|
76
|
+
errors = []
|
|
77
|
+
# if valid_token?(!settings.has_key?('project_token') || settings['project_token'].length < 5 || settings['project_token'].length > 6
|
|
78
|
+
if !valid_token?(settings['project_token'])
|
|
79
|
+
errors.push("Project token #{settings['project_token']} is not valid.")
|
|
80
|
+
end
|
|
81
|
+
if settings.has_key?('ignore_paths') && !settings['ignore_paths'].kind_of?(Array)
|
|
82
|
+
errors.push("Ignore Paths #{settings['ignore_paths']} should be Array.")
|
|
83
|
+
end
|
|
84
|
+
if !settings.has_key?('url_pattern') || settings['url_pattern'].length == 0
|
|
85
|
+
errors.push("Url pattern #{settings['url_pattern']} is not valid.")
|
|
86
|
+
end
|
|
87
|
+
if !settings.has_key?('query') || !settings['query'].kind_of?(Array)
|
|
88
|
+
errors.push("query config #{settings['query']} is not valid.")
|
|
89
|
+
end
|
|
90
|
+
if !settings.has_key?('ignore_class') || !settings['ignore_class'].kind_of?(Array)
|
|
91
|
+
errors.push("ignore_class config #{settings['ignore_class']} should be Array.")
|
|
92
|
+
end
|
|
93
|
+
if !settings.has_key?('api_url') || settings['api_url'].length == 0
|
|
94
|
+
errors.push("API URL is not configured.")
|
|
95
|
+
end
|
|
96
|
+
if !settings.has_key?('default_lang') || settings['default_lang'].nil?
|
|
97
|
+
errors.push("Default lang #{settings['default_lang']} is not valid.")
|
|
98
|
+
end
|
|
99
|
+
if !settings.has_key?('supported_langs') || !settings['supported_langs'].kind_of?(Array) || settings['supported_langs'].size < 1
|
|
100
|
+
errors.push("Supported langs configuration is not valid.")
|
|
101
|
+
end
|
|
102
|
+
if !settings.has_key?('custom_lang_aliases') || !settings['custom_lang_aliases'].kind_of?(Hash)
|
|
103
|
+
errors.push("Custom lang aliases is not valid.")
|
|
104
|
+
end
|
|
105
|
+
# log errors
|
|
106
|
+
if errors.length > 0
|
|
107
|
+
valid = false
|
|
108
|
+
errors.each do |e|
|
|
109
|
+
WovnLogger.instance.error(e)
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
valid
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
# Returns the settings object, pulling from Rails config the first time this is called
|
|
116
|
+
#
|
|
117
|
+
def settings
|
|
118
|
+
load_settings unless @config_loaded
|
|
119
|
+
@settings
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
# Load Rails config.wovnrb
|
|
123
|
+
#
|
|
124
|
+
def load_settings
|
|
125
|
+
if Object.const_defined?(:Rails) && Rails.configuration.respond_to?(:wovnrb)
|
|
126
|
+
@config_loaded = true
|
|
127
|
+
update_settings(Rails.configuration.wovnrb)
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
def update_settings(new_settings)
|
|
132
|
+
load_settings unless @config_loaded
|
|
133
|
+
if !new_settings.nil?
|
|
134
|
+
@settings.merge!(new_settings.stringify_keys)
|
|
135
|
+
format_settings
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
def format_settings
|
|
140
|
+
if @settings.has_key?('custom_lang_aliases')
|
|
141
|
+
stringify_keys! @settings['custom_lang_aliases']
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
@settings['default_lang'] = Lang.get_code(@settings['default_lang'])
|
|
145
|
+
|
|
146
|
+
if !@settings.has_key?('supported_langs')
|
|
147
|
+
@settings['supported_langs'] = [@settings['default_lang']]
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
if @settings.has_key?('user_token') && @settings['project_token'].empty?
|
|
151
|
+
@settings['project_token'] = @settings['user_token']
|
|
152
|
+
end
|
|
153
|
+
@settings.delete('user_token')
|
|
154
|
+
|
|
155
|
+
case @settings['url_pattern']
|
|
156
|
+
when 'path'
|
|
157
|
+
@settings['url_pattern_reg'] = "/(?<lang>[^/.?]+)"
|
|
158
|
+
when 'query'
|
|
159
|
+
@settings['url_pattern_reg'] = "((\\?.*&)|\\?)#{@settings['lang_param_name']}=(?<lang>[^&]+)(&|$)"
|
|
160
|
+
when 'subdomain'
|
|
161
|
+
@settings['url_pattern_reg'] = '^(?<lang>[^.]+)\.'
|
|
162
|
+
when 'custom_domain'
|
|
163
|
+
# Do not use regex
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
@settings['test_mode'] = !(@settings['test_mode'] != true || @settings['test_mode'] != 'on')
|
|
167
|
+
|
|
168
|
+
if @settings['wovn_dev_mode']
|
|
169
|
+
if @settings['api_url'] == self.class.default_settings['api_url']
|
|
170
|
+
@settings['api_url'] = 'http://dev-wovn.io:3001'
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
if @settings['api_timeout_seconds'] == self.class.default_settings['api_timeout_seconds']
|
|
174
|
+
@settings['api_timeout_seconds'] = 3.0
|
|
175
|
+
end
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
@settings['hreflang_x_default_lang'] = Lang.get_code(@settings['hreflang_x_default_lang'])
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
def custom_lang_aliases
|
|
182
|
+
@settings['custom_lang_aliases'] || {}
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
def hreflang_x_default_lang_or_default
|
|
186
|
+
@settings['hreflang_x_default_lang'] || default_lang
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
def default_lang
|
|
190
|
+
@settings['default_lang']
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
def default_lang_alias
|
|
194
|
+
custom_alias = custom_lang_aliases[default_lang]
|
|
195
|
+
custom_alias || default_lang
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
def supported_langs
|
|
199
|
+
@settings['supported_langs'] || []
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
def compress_api_requests?
|
|
203
|
+
@settings['compress_api_requests']
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
def widget_url
|
|
207
|
+
@settings['widget_url'] || 'https://j.wovn.io/1'
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
def dev_mode?
|
|
211
|
+
@settings['wovn_dev_mode']
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
def url_pattern
|
|
215
|
+
@settings['url_pattern']
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
def custom_domain_langs
|
|
219
|
+
@custom_domain_langs ||= CustomDomainLangs.new(@settings['custom_domain_langs'])
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
private
|
|
223
|
+
|
|
224
|
+
def stringify_keys!(hash)
|
|
225
|
+
hash.keys.each do |k|
|
|
226
|
+
hash[k.to_s] = hash.delete(k)
|
|
227
|
+
end
|
|
228
|
+
end
|
|
229
|
+
end
|
|
230
|
+
end
|
data/lib/wovnrb/version.rb
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
module Wovnrb
|
|
2
|
-
VERSION = '3.
|
|
3
|
-
end
|
|
1
|
+
module Wovnrb
|
|
2
|
+
VERSION = '3.13.0'.freeze
|
|
3
|
+
end
|