wovnrb 2.6.0 → 3.1.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.
Files changed (130) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +21 -10
  3. data/.rubocop_todo.yml +13 -43
  4. data/Gemfile +0 -5
  5. data/README.en.md +24 -0
  6. data/docker/docker-compose.yml +16 -0
  7. data/docker/rails/Dockerfile +6 -0
  8. data/docker/rails/TestSite/.browserslistrc +1 -0
  9. data/docker/rails/TestSite/.gitignore +63 -0
  10. data/docker/rails/TestSite/Gemfile +56 -0
  11. data/docker/rails/TestSite/README.md +24 -0
  12. data/docker/rails/TestSite/Rakefile +6 -0
  13. data/docker/rails/TestSite/app/assets/config/manifest.js +2 -0
  14. data/docker/rails/TestSite/app/assets/images/.keep +0 -0
  15. data/docker/rails/TestSite/app/assets/stylesheets/application.css +15 -0
  16. data/docker/rails/TestSite/app/assets/stylesheets/redirects.scss +3 -0
  17. data/docker/rails/TestSite/app/channels/application_cable/channel.rb +4 -0
  18. data/docker/rails/TestSite/app/channels/application_cable/connection.rb +4 -0
  19. data/docker/rails/TestSite/app/controllers/application_controller.rb +2 -0
  20. data/docker/rails/TestSite/app/controllers/concerns/.keep +0 -0
  21. data/docker/rails/TestSite/app/controllers/custom_response_controller.rb +16 -0
  22. data/docker/rails/TestSite/app/controllers/pages_controller.rb +7 -0
  23. data/docker/rails/TestSite/app/controllers/redirects_controller.rb +5 -0
  24. data/docker/rails/TestSite/app/helpers/application_helper.rb +2 -0
  25. data/docker/rails/TestSite/app/helpers/pages_helper.rb +2 -0
  26. data/docker/rails/TestSite/app/helpers/redirects_helper.rb +2 -0
  27. data/docker/rails/TestSite/app/javascript/channels/consumer.js +6 -0
  28. data/docker/rails/TestSite/app/javascript/channels/index.js +5 -0
  29. data/docker/rails/TestSite/app/javascript/packs/application.js +17 -0
  30. data/docker/rails/TestSite/app/jobs/application_job.rb +7 -0
  31. data/docker/rails/TestSite/app/mailers/application_mailer.rb +4 -0
  32. data/docker/rails/TestSite/app/models/application_record.rb +3 -0
  33. data/docker/rails/TestSite/app/models/concerns/.keep +0 -0
  34. data/docker/rails/TestSite/app/views/layouts/application.html.erb +15 -0
  35. data/docker/rails/TestSite/app/views/layouts/mailer.html.erb +13 -0
  36. data/docker/rails/TestSite/app/views/layouts/mailer.text.erb +1 -0
  37. data/docker/rails/TestSite/babel.config.js +72 -0
  38. data/docker/rails/TestSite/bin/bundle +114 -0
  39. data/docker/rails/TestSite/bin/rails +4 -0
  40. data/docker/rails/TestSite/bin/rake +4 -0
  41. data/docker/rails/TestSite/bin/setup +36 -0
  42. data/docker/rails/TestSite/bin/webpack +18 -0
  43. data/docker/rails/TestSite/bin/webpack-dev-server +18 -0
  44. data/docker/rails/TestSite/bin/yarn +11 -0
  45. data/docker/rails/TestSite/config/application.rb +26 -0
  46. data/docker/rails/TestSite/config/boot.rb +4 -0
  47. data/docker/rails/TestSite/config/cable.yml +10 -0
  48. data/docker/rails/TestSite/config/credentials.yml.enc +1 -0
  49. data/docker/rails/TestSite/config/database.yml +25 -0
  50. data/docker/rails/TestSite/config/environment.rb +5 -0
  51. data/docker/rails/TestSite/config/environments/development.rb +62 -0
  52. data/docker/rails/TestSite/config/environments/production.rb +112 -0
  53. data/docker/rails/TestSite/config/environments/test.rb +49 -0
  54. data/docker/rails/TestSite/config/initializers/application_controller_renderer.rb +8 -0
  55. data/docker/rails/TestSite/config/initializers/assets.rb +14 -0
  56. data/docker/rails/TestSite/config/initializers/backtrace_silencers.rb +7 -0
  57. data/docker/rails/TestSite/config/initializers/content_security_policy.rb +30 -0
  58. data/docker/rails/TestSite/config/initializers/cookies_serializer.rb +5 -0
  59. data/docker/rails/TestSite/config/initializers/filter_parameter_logging.rb +4 -0
  60. data/docker/rails/TestSite/config/initializers/inflections.rb +16 -0
  61. data/docker/rails/TestSite/config/initializers/mime_types.rb +4 -0
  62. data/docker/rails/TestSite/config/initializers/wrap_parameters.rb +14 -0
  63. data/docker/rails/TestSite/config/locales/en.yml +33 -0
  64. data/docker/rails/TestSite/config/puma.rb +38 -0
  65. data/docker/rails/TestSite/config/routes.rb +5 -0
  66. data/docker/rails/TestSite/config/spring.rb +6 -0
  67. data/docker/rails/TestSite/config/storage.yml +34 -0
  68. data/docker/rails/TestSite/config/webpack/development.js +5 -0
  69. data/docker/rails/TestSite/config/webpack/environment.js +3 -0
  70. data/docker/rails/TestSite/config/webpack/production.js +5 -0
  71. data/docker/rails/TestSite/config/webpack/test.js +5 -0
  72. data/docker/rails/TestSite/config/webpacker.yml +96 -0
  73. data/docker/rails/TestSite/config.ru +5 -0
  74. data/docker/rails/TestSite/db/seeds.rb +7 -0
  75. data/docker/rails/TestSite/lib/assets/.keep +0 -0
  76. data/docker/rails/TestSite/lib/tasks/.keep +0 -0
  77. data/docker/rails/TestSite/log/.keep +0 -0
  78. data/docker/rails/TestSite/package.json +15 -0
  79. data/docker/rails/TestSite/postcss.config.js +12 -0
  80. data/docker/rails/TestSite/public/index.html +9 -0
  81. data/docker/rails/TestSite/public/page.html +13 -0
  82. data/docker/rails/TestSite/public/pages/files/plaintext_unicode.txt +204 -0
  83. data/docker/rails/TestSite/public/pages/files/simple_css.css +8 -0
  84. data/docker/rails/TestSite/public/pages/files/simple_javascript.js +2 -0
  85. data/docker/rails/TestSite/public/pages/html5test.html +555 -0
  86. data/docker/rails/TestSite/public/pages/oldhtml.html +335 -0
  87. data/docker/rails/TestSite/public/pages/xhtml.xhtml +726 -0
  88. data/docker/rails/TestSite/public/redirection_target.html +10 -0
  89. data/docker/rails/TestSite/public/testdir/testpage-dir.html +9 -0
  90. data/docker/rails/TestSite/public/testdir/testpage-redirect-destination.html +9 -0
  91. data/docker/rails/TestSite/public/testpage.html +9 -0
  92. data/docker/rails/TestSite/public/wovn_index.html +24 -0
  93. data/docker/rails/TestSite/start.sh +13 -0
  94. data/docker/rails/TestSite/storage/.keep +0 -0
  95. data/docker/rails/TestSite/test/application_system_test_case.rb +5 -0
  96. data/docker/rails/TestSite/test/channels/application_cable/connection_test.rb +11 -0
  97. data/docker/rails/TestSite/test/controllers/.keep +0 -0
  98. data/docker/rails/TestSite/test/controllers/pages_controller_test.rb +7 -0
  99. data/docker/rails/TestSite/test/controllers/redirects_controller_test.rb +7 -0
  100. data/docker/rails/TestSite/test/fixtures/.keep +0 -0
  101. data/docker/rails/TestSite/test/fixtures/files/.keep +0 -0
  102. data/docker/rails/TestSite/test/helpers/.keep +0 -0
  103. data/docker/rails/TestSite/test/integration/.keep +0 -0
  104. data/docker/rails/TestSite/test/mailers/.keep +0 -0
  105. data/docker/rails/TestSite/test/models/.keep +0 -0
  106. data/docker/rails/TestSite/test/system/.keep +0 -0
  107. data/docker/rails/TestSite/test/test_helper.rb +13 -0
  108. data/docker/rails/TestSite/yarn.lock +7642 -0
  109. data/lib/wovnrb/api_translator.rb +1 -1
  110. data/lib/wovnrb/headers.rb +30 -39
  111. data/lib/wovnrb/helpers/nokogumbo_helper.rb +7 -9
  112. data/lib/wovnrb/lang.rb +15 -14
  113. data/lib/wovnrb/railtie.rb +3 -15
  114. data/lib/wovnrb/services/html_converter.rb +8 -8
  115. data/lib/wovnrb/store.rb +8 -14
  116. data/lib/wovnrb/version.rb +1 -1
  117. data/lib/wovnrb.rb +1 -3
  118. data/makefile +16 -0
  119. data/test/lib/api_translator_test.rb +3 -4
  120. data/test/lib/lang_test.rb +5 -136
  121. data/test/lib/services/html_converter_test.rb +14 -14
  122. data/test/lib/store_test.rb +8 -6
  123. data/test/lib/wovnrb_test.rb +16 -16
  124. data/wovnrb.gemspec +5 -4
  125. metadata +117 -16
  126. data/.travis.yml +0 -14
  127. data/lib/wovnrb/text_caches/cache_base.rb +0 -53
  128. data/lib/wovnrb/text_caches/memory_cache.rb +0 -51
  129. data/test/lib/text_caches/cache_base_test.rb +0 -31
  130. data/test/lib/text_caches/memory_cache_test.rb +0 -91
@@ -109,7 +109,7 @@ module Wovnrb
109
109
  end
110
110
 
111
111
  def api_uri
112
- Addressable::URI.parse(@store.settings['api_url'] + '/v0/')
112
+ Addressable::URI.parse("#{@store.settings['api_url']}/v0/")
113
113
  end
114
114
 
115
115
  def api_timeout
@@ -1,17 +1,10 @@
1
1
  module Wovnrb
2
2
  class Headers
3
- attr_reader :unmasked_url
4
- attr_reader :url
5
- attr_reader :protocol
6
- attr_reader :unmasked_host
7
- attr_reader :host
8
- attr_reader :unmasked_pathname
9
- attr_reader :pathname
10
- attr_reader :pathname_with_trailing_slash_if_present
3
+ attr_reader :unmasked_url, :url, :protocol, :unmasked_host, :host, :unmasked_pathname, :pathname, :pathname_with_trailing_slash_if_present
11
4
 
12
5
  # Generates new instance of Wovnrb::Headers.
13
6
  # Its parameters are set by parsing env variable.
14
- #
7
+
15
8
  def initialize(env, settings)
16
9
  request = Rack::Request.new(env)
17
10
 
@@ -42,21 +35,21 @@ module Wovnrb
42
35
  @pathname, @query = @env['REQUEST_URI'].split('?')
43
36
  @pathname = settings['url_pattern'] == 'path' ? remove_lang(@pathname, lang_code) : @pathname
44
37
  @query ||= ''
45
- @url = "#{@host}#{@pathname}#{(!@query.empty? ? '?' : '') + remove_lang(@query, lang_code)}"
46
- if !settings['query'].empty?
38
+ @url = "#{@host}#{@pathname}#{(@query.empty? ? '' : '?') + remove_lang(@query, lang_code)}"
39
+ if settings['query'].empty?
40
+ @query = ''
41
+ else
47
42
  query_vals = []
48
43
  settings['query'].each do |qv|
49
44
  rx = Regexp.new("(^|&)(?<query_val>#{qv}[^&]+)(&|$)")
50
45
  m = @query.match(rx)
51
46
  query_vals.push(m[:query_val]) if m && m[:query_val]
52
47
  end
53
- @query = if !query_vals.empty?
54
- "?#{query_vals.sort.join('&')}"
55
- else
48
+ @query = if query_vals.empty?
56
49
  ''
50
+ else
51
+ "?#{query_vals.sort.join('&')}"
57
52
  end
58
- else
59
- @query = ''
60
53
  end
61
54
  @query = remove_lang(@query, lang_code)
62
55
  @pathname_with_trailing_slash_if_present = @pathname
@@ -115,11 +108,11 @@ module Wovnrb
115
108
  case @settings['url_pattern']
116
109
  when 'query'
117
110
  lang_param_name = @settings['lang_param_name']
118
- if location !~ /\?/
119
- location = "#{location}?#{lang_param_name}=#{lang_code}"
120
- else @env['REQUEST_URI'] !~ /(\?|&)#{lang_param_name}=/
121
- location = "#{location}&#{lang_param_name}=#{lang_code}"
122
- end
111
+ location = if location =~ /\?/
112
+ "#{location}&#{lang_param_name}=#{lang_code}"
113
+ else
114
+ "#{location}?#{lang_param_name}=#{lang_code}"
115
+ end
123
116
  when 'subdomain'
124
117
  location = "#{lang_code.downcase}.#{location}"
125
118
  # when 'path'
@@ -173,7 +166,7 @@ module Wovnrb
173
166
  lang_param_name = @settings['lang_param_name']
174
167
  uri.sub(/(^|\?|&)#{lang_param_name}=#{lang_code}(&|$)/, '\1').gsub(/(\?|&)$/, '')
175
168
  when 'subdomain'
176
- rp = Regexp.new('(^|(//))' + lang_code + '\.', 'i')
169
+ rp = Regexp.new("(^|(//))#{lang_code}\\.", 'i')
177
170
  uri.sub(rp, '\1')
178
171
  # when 'path'
179
172
  else
@@ -182,24 +175,22 @@ module Wovnrb
182
175
  end
183
176
 
184
177
  def out(headers)
185
- r = Regexp.new('//' + @host)
178
+ r = Regexp.new("//#{@host}")
186
179
  lang_code = Store.instance.settings['custom_lang_aliases'][self.lang_code] || self.lang_code
187
- if lang_code != @settings['default_lang'] && headers.key?('Location') && headers['Location'] =~ r
188
- unless @settings['ignore_globs'].ignore?(headers['Location'])
189
- case @settings['url_pattern']
190
- when 'query'
191
- headers['Location'] += if headers['Location'] =~ /\?/
192
- '&'
193
- else
194
- '?'
195
- end
196
- headers['Location'] += "#{@settings['lang_param_name']}=#{lang_code}"
197
- when 'subdomain'
198
- headers['Location'] = headers['Location'].sub(/\/\/([^.]+)/, '//' + lang_code + '.\1')
199
- # when 'path'
200
- else
201
- headers['Location'] = headers['Location'].sub(/(\/\/[^\/]+)/, '\1/' + lang_code)
202
- end
180
+ if lang_code != @settings['default_lang'] && headers.key?('Location') && headers['Location'] =~ r && !@settings['ignore_globs'].ignore?(headers['Location'])
181
+ case @settings['url_pattern']
182
+ when 'query'
183
+ headers['Location'] += if headers['Location'] =~ /\?/
184
+ '&'
185
+ else
186
+ '?'
187
+ end
188
+ headers['Location'] += "#{@settings['lang_param_name']}=#{lang_code}"
189
+ when 'subdomain'
190
+ headers['Location'] = headers['Location'].sub(/\/\/([^.]+)/, "//#{lang_code}.\\1")
191
+ # when 'path'
192
+ else
193
+ headers['Location'] = headers['Location'].sub(/(\/\/[^\/]+)/, "\\1/#{lang_code}")
203
194
  end
204
195
  end
205
196
  headers
@@ -2,15 +2,13 @@ module Wovnrb
2
2
  module Helpers
3
3
  module NokogumboHelper
4
4
  def parse_html(html_string, encoding = 'UTF-8')
5
- dom = if html_string.strip[0..999] =~ /<html/i
6
- d = Nokogiri::HTML5(html_string)
7
- d.encoding = encoding
8
- d
9
- else
10
- parse_fragment(html_string, encoding)
11
- end
12
-
13
- dom
5
+ if html_string.strip[0..999] =~ /<html/i
6
+ d = Nokogiri::HTML5(html_string)
7
+ d.encoding = encoding
8
+ d
9
+ else
10
+ parse_fragment(html_string, encoding)
11
+ end
14
12
  end
15
13
 
16
14
  # https://www.rubydoc.info/gems/nokogumbo/Nokogiri/HTML5#fragment-class_method
data/lib/wovnrb/lang.rb CHANGED
@@ -146,46 +146,47 @@ module Wovnrb
146
146
  if uri.host.downcase === headers.host.downcase
147
147
  case pattern
148
148
  when 'subdomain'
149
- sub_d = href.match(/\/\/([^\.]*)\./)[1]
149
+ sub_d = href.match(/\/\/([^.]*)\./)[1]
150
150
  sub_code = Lang.get_code(sub_d)
151
151
  new_href = if sub_code && sub_code.casecmp(code_to_add).zero?
152
152
  href.sub(Regexp.new(code_to_add, 'i'), code_to_add.downcase)
153
153
  else
154
- href.sub(/(\/\/)([^\.]*)/, '\1' + code_to_add.downcase + '.' + '\2')
154
+ href.sub(/(\/\/)([^.]*)/, "\\1#{code_to_add.downcase}.\\2")
155
155
  end
156
156
  when 'query'
157
157
  new_href = add_query_lang_code(href, code_to_add, lang_param_name)
158
158
  else # path
159
- new_href = href.sub(/([^\.]*\.[^\/]*)(\/|$)/, '\1/' + code_to_add + '/')
159
+ new_href = href.sub(/([^.]*\.[^\/]*)(\/|$)/, "\\1/#{code_to_add}/")
160
160
  end
161
161
  end
162
162
  elsif href
163
163
  case pattern
164
164
  when 'subdomain'
165
- lang_url = headers.protocol + '://' + code_to_add.downcase + '.' + headers.host
166
- current_dir = headers.pathname.sub(/[^\/]*\.[^\.]{2,6}$/, '')
167
- new_href = if href =~ /^\.\..*$/
165
+ lang_url = "#{headers.protocol}://#{code_to_add.downcase}.#{headers.host}"
166
+ current_dir = headers.pathname.sub(/[^\/]*\.[^.]{2,6}$/, '')
167
+ new_href = case href
168
+ when /^\.\..*$/
168
169
  # ../path
169
- lang_url + '/' + href.gsub(/^\.\.\//, '')
170
- elsif href =~ /^\..*$/
170
+ "#{lang_url}/#{href.gsub(/^\.\.\//, '')}"
171
+ when /^\..*$/
171
172
  # ./path
172
- lang_url + current_dir + '/' + href.gsub(/^\.\//, '')
173
- elsif href =~ /^\/.*$/
173
+ "#{lang_url}#{current_dir}/#{href.gsub(/^\.\//, '')}"
174
+ when /^\/.*$/
174
175
  # /path
175
176
  lang_url + href
176
177
  else
177
178
  # path
178
- lang_url + current_dir + '/' + href
179
+ "#{lang_url}#{current_dir}/#{href}"
179
180
  end
180
181
  when 'query'
181
182
  new_href = add_query_lang_code(href, code_to_add, lang_param_name)
182
183
  else # path
183
184
  if href =~ /^\//
184
- new_href = '/' + code_to_add + href
185
+ new_href = "/#{code_to_add}#{href}"
185
186
  else
186
- current_dir = headers.pathname.sub(/[^\/]*\.[^\.]{2,6}$/, '')
187
+ current_dir = headers.pathname.sub(/[^\/]*\.[^.]{2,6}$/, '')
187
188
  current_dir = '/' if current_dir == ''
188
- new_href = '/' + code_to_add + current_dir + href
189
+ new_href = "/#{code_to_add}#{current_dir}#{href}"
189
190
  end
190
191
  end
191
192
  end
@@ -1,21 +1,9 @@
1
1
  module Wovnrb
2
- def self.middleware_inserted?(app, middleware)
3
- app.middleware.send(:operations).each do |_, middlewares, _|
4
- return true if middlewares&.include?(middleware)
5
- end
6
-
7
- false
8
- end
9
-
10
2
  class Railtie < Rails::Railtie
11
3
  initializer 'wovnrb.configure_rails_initialization' do |app|
12
- unless Wovnrb.middleware_inserted?(app, Wovnrb::Interceptor)
13
- if defined?(Rack::Deflater) && Wovnrb.middleware_inserted?(app, Rack::Deflater)
14
- app.middleware.insert_after(Rack::Deflater, Wovnrb::Interceptor)
15
- else
16
- app.middleware.insert_before(0, Wovnrb::Interceptor)
17
- end
18
- end
4
+ install_middleware = Rails.configuration.wovnrb.fetch(:install_middleware, true)
5
+
6
+ app.middleware.insert_before(0, Wovnrb::Interceptor) if install_middleware
19
7
  end
20
8
  end
21
9
  end
@@ -41,7 +41,7 @@ module Wovnrb
41
41
 
42
42
  @dom.traverse { |node| transform_node(node, marker) }
43
43
 
44
- insert_snippet(true)
44
+ insert_snippet(adds_backend_error_mark: true)
45
45
  insert_hreflang_tags
46
46
  inject_lang_html_tag
47
47
 
@@ -79,7 +79,7 @@ module Wovnrb
79
79
  return unless classes.present?
80
80
 
81
81
  ignored_classes = @store.settings['ignore_class']
82
- should_be_ignored = (ignored_classes & classes.split(' ')).present?
82
+ should_be_ignored = (ignored_classes & classes.split).present?
83
83
 
84
84
  put_replace_marker(node, marker) if should_be_ignored
85
85
  end
@@ -147,25 +147,25 @@ module Wovnrb
147
147
  end
148
148
 
149
149
  def widget_urls
150
- [@store.settings['api_url'] + '/widget', 'j.wovn.io', 'j.dev-wovn.io:3000']
150
+ ["#{@store.settings['api_url']}/widget", 'j.wovn.io', 'j.dev-wovn.io:3000']
151
151
  end
152
152
 
153
- def insert_snippet(adds_backend_error_mark = true)
153
+ def insert_snippet(adds_backend_error_mark: true)
154
154
  parent_node = @dom.at_css('head') || @dom.at_css('body') || @dom.at_css('html')
155
155
  return unless parent_node
156
156
 
157
157
  insert_node = Nokogiri::XML::Node.new('script', @dom)
158
- insert_node['src'] = "//j.#{@store.wovn_host}/1"
158
+ insert_node['src'] = @store.widget_url
159
159
  insert_node['async'] = true
160
160
  insert_node['data-wovnio'] = data_wovnio
161
161
  insert_node['data-wovnio-type'] = 'fallback_snippet' if adds_backend_error_mark
162
162
  # do this so that there will be a closing tag (better compatibility with browsers)
163
163
  insert_node.content = ''
164
164
 
165
- if !parent_node.children.empty?
166
- parent_node.children.first.add_previous_sibling(insert_node)
167
- else
165
+ if parent_node.children.empty?
168
166
  parent_node.add_child(insert_node)
167
+ else
168
+ parent_node.children.first.add_previous_sibling(insert_node)
169
169
  end
170
170
  end
171
171
 
data/lib/wovnrb/store.rb CHANGED
@@ -34,6 +34,7 @@ module Wovnrb
34
34
  'use_proxy' => false, # use env['HTTP_X_FORWARDED_HOST'] instead of env['HTTP_HOST'] and env['SERVER_NAME'] when this setting is true.
35
35
  'custom_lang_aliases' => {},
36
36
  'translate_fragment' => true,
37
+ 'widget_url' => 'https://j.wovn.io/1',
37
38
  'wovn_dev_mode' => false
38
39
  )
39
40
  end
@@ -141,19 +142,16 @@ module Wovnrb
141
142
  end
142
143
  @settings.delete('user_token')
143
144
 
144
- if @settings['url_pattern'] == 'path'
145
+ case @settings['url_pattern']
146
+ when 'path'
145
147
  @settings['url_pattern_reg'] = "/(?<lang>[^/.?]+)"
146
- elsif @settings['url_pattern'] == 'query'
148
+ when 'query'
147
149
  @settings['url_pattern_reg'] = "((\\?.*&)|\\?)#{@settings['lang_param_name']}=(?<lang>[^&]+)(&|$)"
148
- elsif @settings['url_pattern'] == 'subdomain'
150
+ when 'subdomain'
149
151
  @settings['url_pattern_reg'] = "^(?<lang>[^.]+)\."
150
152
  end
151
153
 
152
- @settings['test_mode'] = if @settings['test_mode'] != true || @settings['test_mode'] != 'on'
153
- false
154
- else
155
- true
156
- end
154
+ @settings['test_mode'] = !(@settings['test_mode'] != true || @settings['test_mode'] != 'on')
157
155
 
158
156
  if @settings['wovn_dev_mode']
159
157
  if @settings['api_url'] == self.class.default_settings['api_url']
@@ -183,12 +181,8 @@ module Wovnrb
183
181
  @settings['supported_langs'] || []
184
182
  end
185
183
 
186
- def wovn_host
187
- if @settings['wovn_dev_mode']
188
- 'dev-wovn.io'
189
- else
190
- 'wovn.io'
191
- end
184
+ def widget_url
185
+ @settings['widget_url'] || 'https://j.wovn.io/1'
192
186
  end
193
187
 
194
188
  def dev_mode?
@@ -1,3 +1,3 @@
1
1
  module Wovnrb
2
- VERSION = '2.6.0'.freeze
2
+ VERSION = '3.1.0'.freeze
3
3
  end
data/lib/wovnrb.rb CHANGED
@@ -9,7 +9,6 @@ require 'nokogumbo'
9
9
  require 'active_support'
10
10
  require 'json'
11
11
  require 'wovnrb/helpers/nokogumbo_helper'
12
- require 'wovnrb/text_caches/cache_base'
13
12
  require 'wovnrb/railtie' if defined?(Rails)
14
13
  require 'wovnrb/version'
15
14
 
@@ -18,9 +17,8 @@ module Wovnrb
18
17
  def initialize(app, opts = {})
19
18
  @app = app
20
19
  @store = Store.instance
21
- opts = opts.each_with_object({}) { |(k, v), memo| memo[k.to_s] = v }
20
+ opts = opts.transform_keys(&:to_s)
22
21
  @store.update_settings(opts)
23
- CacheBase.set_single(@store.settings)
24
22
  end
25
23
 
26
24
  def call(env)
data/makefile ADDED
@@ -0,0 +1,16 @@
1
+ DOCKER_COMPOSE_YML = docker/docker-compose.yml
2
+
3
+ .PHONY: build stop start clean
4
+
5
+ build:
6
+ docker-compose -f $(DOCKER_COMPOSE_YML) build
7
+
8
+ stop:
9
+ docker-compose -f $(DOCKER_COMPOSE_YML) rm -sf
10
+
11
+ start:
12
+ docker-compose -f $(DOCKER_COMPOSE_YML) up
13
+
14
+ clean:
15
+ docker-compose -f $(DOCKER_COMPOSE_YML) down --rmi all --volumes
16
+
@@ -85,11 +85,10 @@ module Wovnrb
85
85
  compress(stub_response_json)
86
86
  end
87
87
  response_headers = { 'Content-Encoding' => response[:encoding] || 'gzip' }
88
- stub = stub_request(:post, api_url)
89
- .with(body: compressed_data, headers: headers)
90
- .to_return(status: response[:status_code] || 200, body: stub_response, headers: response_headers)
88
+ stub_request(:post, api_url)
89
+ .with(body: compressed_data, headers: headers)
90
+ .to_return(status: response[:status_code] || 200, body: stub_response, headers: response_headers)
91
91
 
92
- stub
93
92
  end
94
93
  end
95
94
 
@@ -21,9 +21,10 @@ module Wovnrb
21
21
 
22
22
  def test_iso_639_1_normalization
23
23
  Wovnrb::Lang::LANG.each do |_, l|
24
- if l[:code] == 'zh-CHS'
24
+ case l[:code]
25
+ when 'zh-CHS'
25
26
  assert_equal('zh-Hans', Lang.iso_639_1_normalization('zh-CHS'))
26
- elsif l[:code] == 'zh-CHT'
27
+ when 'zh-CHT'
27
28
  assert_equal('zh-Hant', Lang.iso_639_1_normalization('zh-CHT'))
28
29
  else
29
30
  assert_equal(l[:code], Lang.iso_639_1_normalization(l[:code]))
@@ -89,7 +90,7 @@ module Wovnrb
89
90
  assert_equal('http://zh-cht.wovn.io/topics/31', lang.add_lang_code('http://wovn.io/topics/31', 'subdomain', h))
90
91
  end
91
92
 
92
- def test_add_lang_code_trad_chinese_2
93
+ def test_add_lang_code_trad_chinese2
93
94
  lang = Lang.new('zh-cht')
94
95
  h = Wovnrb::Headers.new(Wovnrb.get_env('url' => 'http://zh-cht.wovn.io'), Wovnrb.get_settings('url_pattern' => 'subdomain', 'url_pattern_reg' => '^(?<lang>[^.]+).'))
95
96
  assert_equal('http://zh-cht.wovn.io/topics/31', lang.add_lang_code('/topics/31', 'subdomain', h))
@@ -107,7 +108,7 @@ module Wovnrb
107
108
  assert_equal('//zh-cht.google.com', lang.add_lang_code('//google.com', 'subdomain', h))
108
109
  end
109
110
 
110
- def test_add_lang_code_no_protocol_2
111
+ def test_add_lang_code_no_protocol2
111
112
  lang = Lang.new('zh-cht')
112
113
  h = Wovnrb::Headers.new(Wovnrb.get_env('url' => 'https://zh-cht.wovn.io'), Wovnrb.get_settings('url_pattern' => 'subdomain', 'url_pattern_reg' => '^(?<lang>[^.]+).'))
113
114
  assert_equal('//google.com', lang.add_lang_code('//google.com', 'subdomain', h))
@@ -311,138 +312,6 @@ module Wovnrb
311
312
  assert_equal('/fr/index.html', lang.add_lang_code('index.html', 'path', headers))
312
313
  end
313
314
 
314
- def generate_body(param = '')
315
- body = case param
316
- when 'ignore_parent'
317
- "<html><body><h1>Mr. Belvedere Fan Club</h1>
318
- <div wovn-ignore><p>Hello</p></div>
319
- </body></html>"
320
- when 'ignore_everything'
321
- "<html><body wovn-ignore><h1>Mr. Belvedere Fan Club</h1>
322
- <div><p>Hello</p></div>
323
- </body></html>"
324
- when 'ignore_parent_translated_in_japanese'
325
- "<html lang=\"ja\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><script src=\"//j.wovn.io/1\" async=\"true\" data-wovnio=\"key=&amp;backend=true&amp;currentLang=ja&amp;defaultLang=en&amp;urlPattern=path&amp;langCodeAliases={}&amp;version=#{Wovnrb::VERSION}\"> </script><link rel=\"alternate\" hreflang=\"ja\" href=\"http://ja.ignore-page.com/\"><link rel=\"alternate\" hreflang=\"en\" href=\"http://ignore-page.com/\"></head><body><h1><!--wovn-src:Mr. Belvedere Fan Club-->ベルベデアさんファンクラブ</h1>
326
- <div wovn-ignore=\"\"><p>Hello</p></div>
327
- </body></html>
328
- "
329
- when 'translated_in_japanese'
330
- "<html lang=\"ja\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><script src=\"//j.wovn.io/1\" async=\"true\" data-wovnio=\"key=&amp;backend=true&amp;currentLang=ja&amp;defaultLang=en&amp;urlPattern=path&amp;langCodeAliases={}&amp;version=#{Wovnrb::VERSION}\"> </script><link rel=\"alternate\" hreflang=\"ja\" href=\"http://ja.page.com/\"><link rel=\"alternate\" hreflang=\"en\" href=\"http://page.com/\"></head><body><h1><!--wovn-src:Mr. Belvedere Fan Club-->ベルベデアさんファンクラブ</h1>
331
- <div><p><!--wovn-src:Hello-->こんにちは</p></div>
332
- </body></html>
333
- "
334
- when 'ignore_everything_translated'
335
- "<html lang=\"ja\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><script src=\"//j.wovn.io/1\" async=\"true\" data-wovnio=\"key=&amp;backend=true&amp;currentLang=ja&amp;defaultLang=en&amp;urlPattern=path&amp;langCodeAliases={}&amp;version=#{Wovnrb::VERSION}\"> </script><link rel=\"alternate\" hreflang=\"ja\" href=\"http://ja.ignore-page.com/\"><link rel=\"alternate\" hreflang=\"en\" href=\"http://ignore-page.com/\"></head><body wovn-ignore=\"\"><h1>Mr. Belvedere Fan Club</h1>
336
- <div><p>Hello</p></div>
337
- </body></html>
338
- "
339
- when 'empty'
340
- '<html><body><h1>Mr.BelvedereFanClub</h1><div wovn-ignore><p>Hello</p></div></body></html>'
341
- when 'empty_single_quote'
342
- "<html><body><h1>Mr.BelvedereFanClub</h1><div wovn-ignore=''><p>Hello</p></div></body></html>"
343
- when 'empty_double_quote'
344
- '<html><body><h1>Mr.BelvedereFanClub</h1><div wovn-ignore=''><p>Hello</p></div></body></html>'
345
- when 'value_single_quote'
346
- "<html><body><h1>Mr.BelvedereFanClub</h1><div wovn-ignore='value'><p>Hello</p></div></body></html>"
347
- when 'value_double_quote'
348
- '<html><body><h1>Mr.BelvedereFanClub</h1><div wovn-ignore="value"><p>Hello</p></div></body></html>'
349
- when 'empty_translated'
350
- "<html lang=\"ja\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><script src=\"//j.wovn.io/1\" async=\"true\" data-wovnio=\"key=&amp;backend=true&amp;currentLang=ja&amp;defaultLang=en&amp;urlPattern=path&amp;langCodeAliases={}&amp;version=#{Wovnrb::VERSION}\"> </script><link rel=\"alternate\" hreflang=\"ja\" href=\"http://ja.ignore-page.com/\"><link rel=\"alternate\" hreflang=\"en\" href=\"http://ignore-page.com/\"></head><body><h1>Mr.BelvedereFanClub</h1><div wovn-ignore=\"\"><p>Hello</p></div></body></html>\n"
351
- when 'empty_single_quote_translated'
352
- "<html lang=\"ja\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><script src=\"//j.wovn.io/1\" async=\"true\" data-wovnio=\"key=&amp;backend=true&amp;currentLang=ja&amp;defaultLang=en&amp;urlPattern=path&amp;langCodeAliases={}&amp;version=#{Wovnrb::VERSION}\"> </script><link rel=\"alternate\" hreflang=\"ja\" href=\"http://ja.ignore-page.com/\"><link rel=\"alternate\" hreflang=\"en\" href=\"http://ignore-page.com/\"></head><body><h1>Mr.BelvedereFanClub</h1><div wovn-ignore=\"\"><p>Hello</p></div></body></html>\n"
353
- when 'empty_double_quote_translated'
354
- "<html lang=\"ja\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><script src=\"//j.wovn.io/1\" async=\"true\" data-wovnio=\"key=&amp;backend=true&amp;currentLang=ja&amp;defaultLang=en&amp;urlPattern=path&amp;langCodeAliases={}&amp;version=#{Wovnrb::VERSION}\"> </script><link rel=\"alternate\" hreflang=\"ja\" href=\"http://ja.ignore-page.com/\"><link rel=\"alternate\" hreflang=\"en\" href=\"http://ignore-page.com/\"></head><body><h1>Mr.BelvedereFanClub</h1><div wovn-ignore=\"\"><p>Hello</p></div></body></html>\n"
355
- when 'value_single_quote_translated'
356
- "<html lang=\"ja\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><script src=\"//j.wovn.io/1\" async=\"true\" data-wovnio=\"key=&amp;backend=true&amp;currentLang=ja&amp;defaultLang=en&amp;urlPattern=path&amp;langCodeAliases={}&amp;version=#{Wovnrb::VERSION}\"> </script><link rel=\"alternate\" hreflang=\"ja\" href=\"http://ja.ignore-page.com/\"><link rel=\"alternate\" hreflang=\"en\" href=\"http://ignore-page.com/\"></head><body><h1>Mr.BelvedereFanClub</h1><div wovn-ignore=\"value\"><p>Hello</p></div></body></html>\n"
357
- when 'value_double_quote_translated'
358
- "<html lang=\"ja\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><script src=\"//j.wovn.io/1\" async=\"true\" data-wovnio=\"key=&amp;backend=true&amp;currentLang=ja&amp;defaultLang=en&amp;urlPattern=path&amp;langCodeAliases={}&amp;version=#{Wovnrb::VERSION}\"> </script><link rel=\"alternate\" hreflang=\"ja\" href=\"http://ja.ignore-page.com/\"><link rel=\"alternate\" hreflang=\"en\" href=\"http://ignore-page.com/\"></head><body><h1>Mr.BelvedereFanClub</h1><div wovn-ignore=\"value\"><p>Hello</p></div></body></html>\n"
359
- when 'meta_img_alt_tags_translated'
360
- "<html lang=\"ja\"><head><script src=\"//j.wovn.io/1\" async=\"true\" data-wovnio=\"key=&amp;backend=true&amp;currentLang=ja&amp;defaultLang=en&amp;urlPattern=path&amp;langCodeAliases={}&amp;version=#{Wovnrb::VERSION}\"> </script><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta name=\"description\" content=\"こんにちは\">\n<meta name=\"title\" content=\"こんにちは\">\n<meta property=\"og:title\" content=\"こんにちは\">\n<meta property=\"og:description\" content=\"こんにちは\">\n<meta property=\"twitter:title\" content=\"こんにちは\">\n<meta property=\"twitter:description\" content=\"こんにちは\"><link rel=\"alternate\" hreflang=\"ja\" href=\"http://ja.page.com/\"><link rel=\"alternate\" hreflang=\"en\" href=\"http://page.com/\"></head>\n<body><h1><!--wovn-src:Mr. Belvedere Fan Club-->ベルベデアさんファンクラブ</h1>\n<div><p><!--wovn-src:Hello-->こんにちは</p></div>\n<!--wovn-src:Hello--><img src=\"http://example.com/photo.png\" alt=\"こんにちは\">\n</body></html>\n"
361
- when 'meta_img_alt_tags'
362
- "<html><head><meta name =\"description\" content=\"Hello\">\n<meta name=\"title\" content=\"Hello\">\n<meta property=\"og:title\" content=\"Hello\">\n<meta property=\"og:description\" content=\"Hello\">\n<meta property=\"twitter:title\" content=\"Hello\">\n<meta property=\"twitter:description\" content=\"Hello\"></head>
363
- <body><h1>Mr. Belvedere Fan Club</h1>
364
- <div><p>Hello</p></div>
365
- <img src=\"http://example.com/photo.png\" alt=\"Hello\">
366
- </body></html>"
367
- when 'a_href_javascript'
368
- "<html><body><h1>Mr. Belvedere Fan Club</h1>
369
- <div><p><a href=\"javascript:void(0)\">Hello</a></p></div>
370
- </body></html>"
371
- when 'a_href_javascript_translated'
372
- "<html lang=\"ja\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><script src=\"//j.wovn.io/1\" async=\"true\" data-wovnio=\"key=&amp;backend=true&amp;currentLang=ja&amp;defaultLang=en&amp;urlPattern=path&amp;langCodeAliases={}&amp;version=#{Wovnrb::VERSION}\"> </script><link rel=\"alternate\" hreflang=\"ja\" href=\"http://ja.page.com/\"><link rel=\"alternate\" hreflang=\"en\" href=\"http://page.com/\"></head><body><h1><!--wovn-src:Mr. Belvedere Fan Club-->ベルベデアさんファンクラブ</h1>
373
- <div><p><a href=\"javascript:void(0)\"><!--wovn-src:Hello-->こんにちは</a></p></div>
374
- </body></html>
375
- "
376
- when 'unified_values'
377
- <<-HTML
378
- <html><body>
379
- <div>
380
- a <span>b</span> c
381
- </div>
382
- <div>
383
- a<span>b</span>
384
- </div>
385
- <div>
386
- <span> b </span>c
387
- </div>
388
- </body></html>
389
- HTML
390
-
391
- when 'unified_values_ja'
392
- <<-HTML
393
- <html lang=\"ja\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><script src=\"//j.wovn.io/1\" async=\"true\" data-wovnio=\"key=&amp;backend=true&amp;currentLang=ja&amp;defaultLang=en&amp;urlPattern=path&amp;langCodeAliases={}&amp;version=#{Wovnrb::VERSION}\"> </script><link rel=\"alternate\" hreflang=\"en\" href=\"http://page.com/\"></head><body>
394
- <div><!--wovn-src:
395
- a -->\u3042<span><!--wovn-src:b-->\u3044</span><!--wovn-src: c
396
- -->\u3046</div>
397
- <div><!--wovn-src:
398
- a-->\u200B<span><!--wovn-src:b-->\u3044</span><!--wovn-src:-->\u3046
399
- </div>
400
- <div>
401
- <!--wovn-src:-->\u3042<span><!--wovn-src: b -->\u3044</span><!--wovn-src:c
402
- -->\u200B</div>
403
-
404
- </body></html>
405
- HTML
406
-
407
- else # "" case
408
- "<html><body><h1>Mr. Belvedere Fan Club</h1>
409
- <div><p>Hello</p></div>
410
- </body></html>"
411
- end
412
-
413
- body
414
- end
415
-
416
- def generate_dom(param = '')
417
- Wovnrb.to_dom(generate_body(param))
418
- end
419
-
420
- def generate_values
421
- values = {}
422
- values['text_vals'] = {
423
- 'Hello' => { 'ja' => [{ 'data' => 'こんにちは' }] },
424
- 'Mr. Belvedere Fan Club' => { 'ja' => [{ 'data' => 'ベルベデアさんファンクラブ' }] }
425
- }
426
- values
427
- end
428
-
429
- def generate_unified_values
430
- {
431
- 'html_text_vals' => {
432
- 'a<span>b</span>c' =>
433
- { 'ja' =>
434
- [{ 'data' => 'あ<span>い</span>う' }] },
435
- 'a<span>b</span>' =>
436
- { 'ja' =>
437
- [{ 'data' => '<span>い</span>う' }] },
438
- '<span>b</span>c' =>
439
- { 'ja' =>
440
- [{ 'data' => 'あ<span>い</span>' }] }
441
-
442
- }
443
- }
444
- end
445
-
446
315
  def test_get_code_from_custom_lang
447
316
  store = Store.instance
448
317
  store.settings['custom_lang_aliases'] = { 'ja' => 'staging-ja' }