wovnrb 0.1.36 → 0.1.37

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
  SHA1:
3
- metadata.gz: eb6a923f625d953649b1de0242b1f477947d58c7
4
- data.tar.gz: 1e75041212f5da667742dde22913779a125b042c
3
+ metadata.gz: 48267e3d6147c0fa23c27a54e53895a0830e61a6
4
+ data.tar.gz: 47c15e957323c220e9348c0736247f3a2f67215d
5
5
  SHA512:
6
- metadata.gz: cae95611865c9f2b5e8aaa856c5644b36e6204bd5a4cdf2ab7063764c25f0739160372b3175cc66249f46f5a3a75f7f790b7a142ee6086bc4bd8d350f490c33d
7
- data.tar.gz: 61eea27872c4b496d83a45cafc6edbeb6291f1711deba5798a83baf1bf7bae6852682ad949e5a189f97895e8055a3dd3d31cc12697c1eca5e4d65b9ce90b332c
6
+ metadata.gz: 211018b6b73db62671b34a2d31b2455479f9af9652d56351291674def10ef63be24299df32049800708c26b03ef1fa3be3df79d345e0d3c029ad1eb14bb868ab
7
+ data.tar.gz: 71947f8e26a230990bb6cd2b1035d89ce6b029deb811dba1431498877fb8cad18f20967fae34f9a5fc770aadd7ac8fbd8e010f9ce767ce2e3dde60fb20bb88a7
@@ -22,12 +22,15 @@ module Wovnrb
22
22
  end
23
23
  @env = env
24
24
  headers = Headers.new(env, STORE.settings)
25
+ if STORE.settings.test_mode && STORE.settings.test_url != headers.url
26
+ return @app.call(env)
27
+ end
25
28
  # redirect if the path is set to the default language (for SEO purposes)
26
29
  if (headers.path_lang == STORE.settings['default_lang'])
27
30
  redirect_headers = headers.redirect(STORE.settings['default_lang'])
28
31
  return [307, redirect_headers, ['']]
29
32
  end
30
- lang = headers.lang
33
+ lang = headers.lang_code
31
34
 
32
35
  # pass to application
33
36
  status, res_headers, body = @app.call(headers.request_out)
@@ -1,4 +1,3 @@
1
- require 'pry'
2
1
  module Wovnrb
3
2
 
4
3
  class Headers
@@ -13,6 +12,7 @@ module Wovnrb
13
12
 
14
13
  def initialize(env, settings)
15
14
  @env = env
15
+ @settings = settings
16
16
  @protocol = @env['rack.url_scheme']
17
17
  @unmasked_host = @env['HTTP_HOST']
18
18
  unless @env.has_key?('REQUEST_URI')
@@ -27,11 +27,11 @@ module Wovnrb
27
27
  @unmasked_pathname = @env['REQUEST_URI'].split('?')[0]
28
28
  @unmasked_pathname += '/' unless @unmasked_pathname =~ /\/$/ || @unmasked_pathname =~ /\/[^\/.]+\.[^\/.]+$/
29
29
  @unmasked_url = "#{@protocol}://#{@unmasked_host}#{@unmasked_pathname}"
30
- @host = remove_lang(@env['HTTP_HOST'], self.lang)
30
+ @host = settings['url_pattern'] == 'subdomain' ? remove_lang(@env['HTTP_HOST'], self.lang_code) : @env['HTTP_HOST']
31
31
  @pathname, @query = @env['REQUEST_URI'].split('?')
32
- @pathname = remove_lang(@pathname, self.lang)
32
+ @pathname = settings['url_pattern'] == 'path' ? remove_lang(@pathname, self.lang_code) : @pathname
33
33
  @query = @query || ''
34
- @url = "#{@host}#{@pathname}#{(@query.length > 0 ? '?' : '') + remove_lang(@query, self.lang)}"
34
+ @url = "#{@host}#{@pathname}#{(@query.length > 0 ? '?' : '') + remove_lang(@query, self.lang_code)}"
35
35
  if settings['query'].length > 0
36
36
  query_vals = []
37
37
  settings['query'].each do |qv|
@@ -47,18 +47,21 @@ module Wovnrb
47
47
  else
48
48
  @query = ''
49
49
  end
50
- @query = remove_lang(@query, self.lang)
50
+ @query = remove_lang(@query, self.lang_code)
51
51
  @pathname = @pathname.gsub(/\/$/, '')
52
52
  @redis_url = "#{@host}#{@pathname}#{@query}"
53
53
  end
54
54
 
55
- def lang
56
- (self.path_lang && self.path_lang.length > 0) ? self.path_lang : STORE.settings['default_lang']
55
+ # Get the language code of the current request
56
+ #
57
+ # @return [String] The lang code of the current page
58
+ def lang_code
59
+ (self.path_lang && self.path_lang.length > 0) ? self.path_lang : @settings['default_lang']
57
60
  end
58
61
 
59
62
  def path_lang
60
63
  if @path_lang.nil?
61
- rp = Regexp.new(STORE.settings['url_pattern_reg'])
64
+ rp = Regexp.new(@settings['url_pattern_reg'])
62
65
  match = "#{@env['SERVER_NAME']}#{@env['REQUEST_URI']}".match(rp)
63
66
  if match && match[:lang] && Lang::LANG[match[:lang]]
64
67
  @path_lang = match[:lang]
@@ -97,13 +100,13 @@ module Wovnrb
97
100
  end
98
101
 
99
102
  def redirect_location(lang)
100
- if lang == STORE.settings['default_lang']
103
+ if lang == @settings['default_lang']
101
104
  # IS THIS RIGHT??
102
105
  return "#{self.protocol}://#{self.url}"
103
106
  #return remove_lang("#{@env['HTTP_HOST']}#{@env['REQUEST_URI']}", lang)
104
107
  else
105
108
  location = self.url
106
- case STORE.settings['url_pattern']
109
+ case @settings['url_pattern']
107
110
  when 'query'
108
111
  if location !~ /\?/
109
112
  location = "#{location}?wovn=#{lang}"
@@ -120,8 +123,8 @@ module Wovnrb
120
123
  end
121
124
  end
122
125
 
123
- def request_out(def_lang=STORE.settings['default_lang'])
124
- case STORE.settings['url_pattern']
126
+ def request_out(def_lang=@settings['default_lang'])
127
+ case @settings['url_pattern']
125
128
  when 'query'
126
129
  @env['REQUEST_URI'] = remove_lang(@env['REQUEST_URI']) if @env.has_key?('REQUEST_URI')
127
130
  @env['QUERY_STRING'] = remove_lang(@env['QUERY_STRING']) if @env.has_key?('QUERY_STRING')
@@ -147,7 +150,7 @@ module Wovnrb
147
150
  end
148
151
 
149
152
  def remove_lang(uri, lang=self.path_lang)
150
- case STORE.settings['url_pattern']
153
+ case @settings['url_pattern']
151
154
  when 'query'
152
155
  return uri.sub(/(^|\?|&)wovn=#{lang}(&|$)/, '\1').gsub(/(\?|&)$/, '')
153
156
  when 'subdomain'
@@ -161,19 +164,19 @@ module Wovnrb
161
164
 
162
165
  def out(headers)
163
166
  if headers.has_key?("Location")
164
- case STORE.settings['url_pattern']
167
+ case @settings['url_pattern']
165
168
  when 'query'
166
169
  if headers["Location"] =~ /\?/
167
170
  headers["Location"] += "&"
168
171
  else
169
172
  headers["Location"] += "?"
170
173
  end
171
- headers['Location'] += "wovn=#{self.lang}"
174
+ headers['Location'] += "wovn=#{self.lang_code}"
172
175
  when 'subdomain'
173
- headers["Location"] = headers["Location"].sub(/\/\/([^.]+)/, '//' + self.lang + '.\1')
176
+ headers["Location"] = headers["Location"].sub(/\/\/([^.]+)/, '//' + self.lang_code + '.\1')
174
177
  #when 'path'
175
178
  else
176
- headers["Location"] = headers['Location'].sub(/(\/\/[^\/]+)/, '\1/' + self.lang)
179
+ headers["Location"] = headers['Location'].sub(/(\/\/[^\/]+)/, '\1/' + self.lang_code)
177
180
  end
178
181
  end
179
182
  headers
@@ -1,12 +1,12 @@
1
1
  require 'redis'
2
2
  require 'net/http'
3
+ require 'Logger'
3
4
 
4
5
  module Wovnrb
5
6
 
6
7
  class Store
7
8
  attr_reader :settings
8
9
 
9
-
10
10
  def initialize
11
11
  @settings =
12
12
  {
@@ -23,33 +23,64 @@ module Wovnrb
23
23
  'backend_port' => '6379',
24
24
  'default_lang' => 'en',
25
25
  'supported_langs' => ['en'],
26
+ 'test_mode' => false,
27
+ 'test_url' => '',
26
28
  }
27
29
  # When Store is initialized, the Rails.configuration object is not yet initialized
28
30
  @config_loaded = false
29
31
  end
30
32
 
33
+ # Returns true or false based on whether the settings are valid or not, logs any invalid settings to ../error.log
34
+ #
35
+ # @return [Boolean] Returns true if the settings are valid, and false if they are not
31
36
  def valid_settings?
37
+ valid = true
38
+ errors = [];
32
39
  if !settings.has_key?('user_token') || settings['user_token'].length < 5 || settings['user_token'].length > 6
33
- return false
34
- elsif !settings.has_key?('secret_key') || settings['secret_key'].length == 0 #|| settings['secret_key'].length < 5 || settings['secret_key'].length > 6
35
- return false
36
- elsif !settings.has_key?('url_pattern') || settings['url_pattern'].length == 0
37
- return false
38
- elsif !settings.has_key?('query') || !settings['query'].kind_of?(Array)
39
- return false
40
- elsif !settings.has_key?('backend_host') || settings['backend_host'].length == 0
41
- return false
42
- elsif !settings.has_key?('backend_port') || settings['backend_port'].length == 0
43
- return false
44
- elsif !settings.has_key?('default_lang') || settings['default_lang'].length == 0
45
- return false
46
- elsif !settings.has_key?('supported_langs') || !settings['supported_langs'].kind_of?(Array) || settings['supported_langs'].size < 1
47
- return false
48
- else
49
- return true
40
+ valid = false
41
+ errors.push("User token #{settings['user_token']} is not valid.");
42
+ end
43
+ if !settings.has_key?('secret_key') || settings['secret_key'].length == 0 #|| settings['secret_key'].length < 5 || settings['secret_key'].length > 6
44
+ valid = false
45
+ errors.push("Secret key #{settings['secret_key']} is not valid.");
46
+ end
47
+ if !settings.has_key?('url_pattern') || settings['url_pattern'].length == 0
48
+ valid = false
49
+ errors.push("Url pattern #{settings['url_pattern']} is not valid.");
50
+ end
51
+ if !settings.has_key?('query') || !settings['query'].kind_of?(Array)
52
+ valid = false
53
+ errors.push("query config #{settings['query']} is not valid.");
54
+ end
55
+ if !settings.has_key?('backend_host') || settings['backend_host'].length == 0
56
+ valid = false
57
+ errors.push("Backend host is not configured.");
58
+ end
59
+ if !settings.has_key?('backend_port') || settings['backend_port'].length == 0
60
+ valid = false
61
+ errors.push("Backend port is not configured.");
62
+ end
63
+ if !settings.has_key?('default_lang') || settings['default_lang'].length == 0
64
+ valid = false
65
+ errors.push("Default lang #{settings['default_lang']} is not valid.");
50
66
  end
67
+ if !settings.has_key?('supported_langs') || !settings['supported_langs'].kind_of?(Array) || settings['supported_langs'].size < 1
68
+ valid = false
69
+ errors.push("Supported langs configuration is not valid.");
70
+ end
71
+ # log errors
72
+ if errors.length > 0
73
+ logger = Logger.new('../error.log')
74
+ errors.each do |e|
75
+ logger.error(e)
76
+ end
77
+ end
78
+ return valid
51
79
  end
52
80
 
81
+ # Returns the settings object, pulling from Rails config the first time this is called
82
+ #
83
+ # @return [Hash] The settings which are pulled from the config file given by the user and filled in by defaults
53
84
  def settings
54
85
  if !@config_loaded
55
86
  # get Rails config.wovnrb
@@ -77,70 +108,37 @@ module Wovnrb
77
108
  elsif @settings['url_pattern'] == 'subdomain'
78
109
  @settings['url_pattern_reg'] = "^(?<lang>[^.]+)\."
79
110
  end
80
- @config_loaded = true
81
- end
82
- @settings
83
- end
111
+ if @settings['test_mode'] != true || @settings['test_mode'] != 'on'
112
+ @settings['test_mode'] = false
113
+ else
114
+ @settings['test_mode'] = true
115
+ end
84
116
 
85
- def refresh_settings
86
- # add timer so this only accesses redis once every 5 minutes etc
87
- user_token = @settings['user_token']
88
- #user_token = 'lYWQ9'
89
- redis_key = 'WOVN:BACKEND:SETTING::' + user_token
90
- cli = Redis.new(host: @settings['backend_host'], port: @settings['backend_port'])
91
- begin
92
- vals = cli.hgetall(redis_key) || {}
93
- rescue
94
- vals = {}
95
- end
96
- if vals.has_key?('query')
97
- vals['query'] = JSON.parse(vals['query'])
98
- end
99
- if vals.has_key?('supported_langs')
100
- vals['supported_langs'] = JSON.parse(vals['supported_langs'])
101
- end
102
- @settings.merge!(vals)
103
- @settings['backend_port'] = @settings['backend_port'].to_s
104
- @settings['default_lang'] = Lang.get_code(@settings['default_lang'])
105
- if !vals.has_key?('supported_langs')
106
- @settings['supported_langs'] = [@settings['default_lang']]
107
- end
108
- if @settings['url_pattern'] == 'path'
109
- @settings['url_pattern_reg'] = "/(?<lang>[^/.?]+)"
110
- elsif @settings['url_pattern'] == 'query'
111
- @settings['url_pattern_reg'] = "((\\?.*&)|\\?)wovn=(?<lang>[^&]+)(&|$)"
117
+ @config_loaded = true
112
118
  end
113
119
  @settings
114
120
  end
115
121
 
122
+ # Get the values for the passed in url
123
+ #
124
+ # @param url [String] The url to get the values for
125
+ # @return [Hash] The values Hash for the passed in url
116
126
  def get_values(url)
117
- #url = 'http://wovn.io'
118
- user_token = @settings['user_token']
119
- #user_token = 'lYWQ9'
120
- redis_key = 'WOVN:BACKEND:STORAGE:' + url.gsub(/\/$/, '') + ':' + user_token
121
- vals = request_values(redis_key)
122
- if vals.empty?
123
- uri = URI.parse('http://api.wovn.io/v0/page/add')
124
- Net::HTTP.post_form(uri, :user_token => user_token, :secret_key => @settings['secret_key'], :url => url)
125
- end
126
- vals
127
- #f = File.open('./values/values', 'r')
128
- #return JSON.parse(f.read)
129
- #f.close
130
- end
131
-
132
- def request_values(key)
133
- Rails.logger.info("*******************************************************")
134
- Rails.logger.info(key)
135
- cli = Redis.new(host: @settings['backend_host'], port: @settings['backend_port'])
136
- Rails.logger.info(@settings['backend_host'])
137
- Rails.logger.info(@settings['backend_port'])
127
+ redis_key = 'WOVN:BACKEND:STORAGE:' + url.gsub(/\/$/, '') + ':' + settings['user_token']
128
+ cli = Redis.new(host: settings['backend_host'], port: settings['backend_port'])
138
129
  begin
139
- vals = cli.get(key) || '{}'
140
- vals = JSON.parse(vals)
130
+ vals = cli.get(redis_key) || '{}'
141
131
  rescue
132
+ logger = Logger.new('../error.log')
133
+ logger.error("Redis GET request failed with the following parameters:\nhost: #{settings['backend_host']}\nport: #{settings['backend_port']}\nkey: #{redis_key}")
142
134
  vals = {}
143
135
  end
136
+ # handle this on the widget
137
+ #if vals.empty?
138
+ # uri = URI.parse('http://api.wovn.io/v0/page/add')
139
+ # Net::HTTP.post_form(uri, :user_token => user_token, :secret_key => @settings['secret_key'], :url => url)
140
+ #end
141
+ JSON.parse(vals)
144
142
  end
145
143
 
146
144
  end
@@ -1,3 +1,3 @@
1
1
  module Wovnrb
2
- VERSION = "0.1.36"
2
+ VERSION = "0.1.37"
3
3
  end
@@ -1,50 +1,24 @@
1
- require 'wovnrb'
1
+ require 'wovnrb/headers'
2
2
  require 'minitest/autorun'
3
3
  require 'pry'
4
4
 
5
- class TestHeaders < Minitest::Test
5
+ class HeadersTest < Minitest::Test
6
6
 
7
7
  def test_initialize
8
8
  h = Wovnrb::Headers.new(get_env, get_settings)
9
9
  refute_nil(h)
10
10
  end
11
11
 
12
- def test_initialize_with_simple_url
13
- h = Wovnrb::Headers.new(get_env('url' => 'https://wovn.io'), get_settings)
12
+ def test_initialize_env
13
+ env = get_env
14
+ h = Wovnrb::Headers.new(env, {})
15
+ binding.pry
14
16
  #assert_equal(''
15
17
  end
16
18
 
17
- def test_keys_exist
18
- Wovnrb::Lang::LANG.each do |k, l|
19
- assert(l.has_key?(:name))
20
- assert(l.has_key?(:code))
21
- assert(l.has_key?(:en))
22
- assert_equal(k, l[:code])
23
- end
24
- end
25
-
26
- def test_get_code_with_valid_code
27
- assert_equal('ms', Wovnrb::Lang.get_code('ms'))
28
- end
29
-
30
- def test_get_code_with_valid_english_name
31
- assert_equal('pt', Wovnrb::Lang.get_code('Portuguese'))
32
- end
33
-
34
- def test_get_code_with_valid_native_name
35
- assert_equal('hi', Wovnrb::Lang.get_code('हिन्दी'))
36
- end
37
-
38
- def test_get_code_with_invalid_name
39
- assert_equal(nil, Wovnrb::Lang.get_code('WOVN4LYFE'))
40
- end
41
-
42
- def test_get_code_with_empty_string
43
- assert_equal(nil, Wovnrb::Lang.get_code(''))
44
- end
45
-
46
- def test_get_code_with_nil
47
- assert_equal(nil, Wovnrb::Lang.get_code(nil))
19
+ def test_initialize_with_simple_url
20
+ h = Wovnrb::Headers.new(get_env('url' => 'https://wovn.io'), get_settings)
21
+ #assert_equal(''
48
22
  end
49
23
 
50
24
  def get_settings(options={})
@@ -1,9 +1,7 @@
1
- require 'wovnrb'
2
- #require 'test/unit'
3
- #require 'test/unit/notify'
1
+ require 'wovnrb/lang'
4
2
  require 'minitest/autorun'
5
3
 
6
- class TestLang < Minitest::Test
4
+ class LangTest < Minitest::Test
7
5
 
8
6
  def test_langs_exist
9
7
  refute_nil(Wovnrb::Lang::LANG)
@@ -0,0 +1 @@
1
+ puts "HEYO"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wovnrb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.36
4
+ version: 0.1.37
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeff Sandford
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-07-24 00:00:00.000000000 Z
12
+ date: 2015-08-11 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: nokogumbo
@@ -243,8 +243,9 @@ files:
243
243
  - lib/wovnrb/version.rb
244
244
  - spec/spec_helper.rb
245
245
  - spec/wovnrb_spec.rb
246
- - test/lib/test_headers.rb
247
- - test/lib/test_lang.rb
246
+ - test/lib/headers_test.rb
247
+ - test/lib/lang_test.rb
248
+ - test/test_helper.rb
248
249
  - values/values
249
250
  - wovnrb.gemspec
250
251
  homepage: ''
@@ -274,5 +275,6 @@ summary: Gem for WOVN.io
274
275
  test_files:
275
276
  - spec/spec_helper.rb
276
277
  - spec/wovnrb_spec.rb
277
- - test/lib/test_headers.rb
278
- - test/lib/test_lang.rb
278
+ - test/lib/headers_test.rb
279
+ - test/lib/lang_test.rb
280
+ - test/test_helper.rb