wovnrb 0.2.01 → 0.2.02

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 (36) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -6
  3. data/README.md +116 -12
  4. data/lib/wovnrb/api_data.rb +59 -0
  5. data/lib/wovnrb/headers.rb +30 -5
  6. data/lib/wovnrb/html_replacers/image_replacer.rb +44 -0
  7. data/lib/wovnrb/html_replacers/link_replacer.rb +18 -0
  8. data/lib/wovnrb/html_replacers/meta_replacer.rb +20 -0
  9. data/lib/wovnrb/html_replacers/replacer_base.rb +17 -0
  10. data/lib/wovnrb/html_replacers/script_replacer.rb +39 -0
  11. data/lib/wovnrb/html_replacers/text_replacer.rb +19 -0
  12. data/lib/wovnrb/lang.rb +133 -23
  13. data/lib/wovnrb/services/url.rb +2 -68
  14. data/lib/wovnrb/services/wovn_logger.rb +45 -0
  15. data/lib/wovnrb/store.rb +19 -38
  16. data/lib/wovnrb/text_caches/cache_base.rb +52 -0
  17. data/lib/wovnrb/text_caches/memory_cache.rb +52 -0
  18. data/lib/wovnrb/version.rb +1 -1
  19. data/lib/wovnrb.rb +19 -224
  20. data/test/lib/api_data_test.rb +62 -0
  21. data/test/lib/headers_test.rb +1221 -1212
  22. data/test/lib/html_replacers/image_replacer_test.rb +86 -0
  23. data/test/lib/html_replacers/link_replacer_test.rb +43 -0
  24. data/test/lib/html_replacers/meta_replacer_test.rb +105 -0
  25. data/test/lib/html_replacers/replacer_base_test.rb +31 -0
  26. data/test/lib/html_replacers/script_replacer_test.rb +90 -0
  27. data/test/lib/html_replacers/text_replacer_test.rb +57 -0
  28. data/test/lib/lang_test.rb +446 -33
  29. data/test/lib/services/wovn_logger_test.rb +40 -0
  30. data/test/lib/store_test.rb +39 -29
  31. data/test/lib/text_caches/cache_base_test.rb +31 -0
  32. data/test/lib/text_caches/memory_cache_test.rb +91 -0
  33. data/test/lib/wovnrb_test.rb +39 -886
  34. data/test/test_helper.rb +96 -1
  35. data/wovnrb.gemspec +4 -0
  36. metadata +89 -2
@@ -0,0 +1,86 @@
1
+ require 'test_helper'
2
+ require 'webmock/minitest'
3
+
4
+ module Wovnrb
5
+ class ImageReplacerTest < WovnMiniTest
6
+ def test_replace
7
+ url = {
8
+ :protocol => 'http',
9
+ :host => 'www.example.com',
10
+ :pathname => 'hello/index.html'
11
+ }
12
+ text_index = {
13
+ 'Hello' => {'ja' => [{'data' => 'こんにちは'}]}
14
+ }
15
+ src_index = {
16
+ 'http://www.example.com/test.img' => {'ja' => [{'data' => 'http://test.com/ttt.img'}]}
17
+ }
18
+ img_src_prefix = 'prefix::'
19
+ replacer = ImageReplacer.new(url, text_index, src_index, img_src_prefix)
20
+
21
+ dom = Wovnrb.get_dom('<img src="http://www.example.com/test.img" alt="Hello"')
22
+ replacer.replace(dom, Lang.new('ja'))
23
+
24
+ img = dom.xpath('//img')[0]
25
+ assert_equal('prefix::http://test.com/ttt.img', img.get_attribute('src'))
26
+ assert_equal('こんにちは', img.get_attribute('alt'))
27
+ end
28
+
29
+ def test_replace_relative_path
30
+ url = {
31
+ :protocol => 'http',
32
+ :host => 'www.example.com',
33
+ :path => '/hello/'
34
+ }
35
+ text_index = {}
36
+ src_index = {
37
+ 'http://www.example.com/hello/test.img' => {'ja' => [{'data' => 'http://test.com/ttt.img'}]}
38
+ }
39
+ replacer = ImageReplacer.new(url, text_index, src_index, '')
40
+
41
+ dom = Wovnrb.get_dom('<img src="test.img"')
42
+ replacer.replace(dom, Lang.new('ja'))
43
+
44
+ img = dom.xpath('//img')[0]
45
+ assert_equal('http://test.com/ttt.img', img.get_attribute('src'))
46
+ end
47
+
48
+ def test_replace_root_path
49
+ url = {
50
+ :protocol => 'http',
51
+ :host => 'www.example.com',
52
+ :path => '/hello/'
53
+ }
54
+ text_index = {}
55
+ src_index = {
56
+ 'http://www.example.com/test.img' => {'ja' => [{'data' => 'http://test.com/ttt.img'}]}
57
+ }
58
+ replacer = ImageReplacer.new(url, text_index, src_index, '')
59
+
60
+ dom = Wovnrb.get_dom('<img src="/test.img"')
61
+ replacer.replace(dom, Lang.new('ja'))
62
+
63
+ img = dom.xpath('//img')[0]
64
+ assert_equal('http://test.com/ttt.img', img.get_attribute('src'))
65
+ end
66
+
67
+ def test_replace_absolute_path
68
+ url = {
69
+ :protocol => 'http',
70
+ :host => 'www.example.com',
71
+ :path => '/hello/'
72
+ }
73
+ text_index = {}
74
+ src_index = {
75
+ 'http://www.test.com/test.img' => {'ja' => [{'data' => 'http://test.com/ttt.img'}]}
76
+ }
77
+ replacer = ImageReplacer.new(url, text_index, src_index, '')
78
+
79
+ dom = Wovnrb.get_dom('<img src="http://www.test.com/test.img"')
80
+ replacer.replace(dom, Lang.new('ja'))
81
+
82
+ img = dom.xpath('//img')[0]
83
+ assert_equal('http://test.com/ttt.img', img.get_attribute('src'))
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,43 @@
1
+ require 'test_helper'
2
+ require 'webmock/minitest'
3
+
4
+ module Wovnrb
5
+ class ReplacerBaseTest < WovnMiniTest
6
+ def test_replace
7
+ replacer = LinkReplacer.new('query', get_header)
8
+ dom = Wovnrb.get_dom('<a href="/index.html">link text</a>')
9
+ replacer.replace(dom, Lang.new('en'))
10
+
11
+ link = dom.xpath('//a')[0].get_attribute('href')
12
+ assert_equal('/index.html?wovn=en', link)
13
+ end
14
+
15
+ def test_replace_multiple
16
+ replacer = LinkReplacer.new('query', get_header)
17
+ dom = Wovnrb.get_dom('<a href="/index.html">link text</a><div>aaa</div><a href="/index2.html">link text</a>')
18
+ replacer.replace(dom, Lang.new('en'))
19
+
20
+ link = dom.xpath('//a')[0].get_attribute('href')
21
+ link2 = dom.xpath('//a')[1].get_attribute('href')
22
+
23
+ assert_equal('/index.html?wovn=en', link)
24
+ assert_equal('/index2.html?wovn=en', link2)
25
+ end
26
+
27
+ def test_replace_ignore
28
+ replacer = LinkReplacer.new('query', get_header)
29
+ dom = Wovnrb.get_dom('<a wovn-ignore href="/index.html">link text</a>')
30
+ replacer.replace(dom, Lang.new('en'))
31
+
32
+ link = dom.xpath('//a')[0].get_attribute('href')
33
+ assert_equal('/index.html', link)
34
+ end
35
+
36
+
37
+
38
+ def get_header
39
+ h = Wovnrb::Headers.new(Wovnrb.get_env('url' => 'http://favy.tips'), Wovnrb.get_settings('url_pattern' => 'query', 'url_pattern_reg' => '^(?<lang>[^.]+).'))
40
+ end
41
+ end
42
+ end
43
+
@@ -0,0 +1,105 @@
1
+ require 'test_helper'
2
+ require 'webmock/minitest'
3
+
4
+ module Wovnrb
5
+ class MetaReplacerTest < WovnMiniTest
6
+ def test_replace_description
7
+ replacer = MetaReplacer.new({
8
+ 'Hello' => {'ja' => [{'data' => 'こんにちは'}]}
9
+ })
10
+
11
+ dom = Wovnrb.get_dom('<meta name="description" content="Hello">')
12
+ replacer.replace(dom, Lang.new('ja'))
13
+
14
+ content = dom.xpath('//meta')[0].get_attribute('content')
15
+ assert_equal('こんにちは', content)
16
+ end
17
+
18
+ def test_replace_og_description
19
+ replacer = MetaReplacer.new({
20
+ 'Hello' => {'ja' => [{'data' => 'こんにちは'}]}
21
+ })
22
+
23
+ dom = Wovnrb.get_dom('<meta property="og:description" content="Hello">')
24
+ replacer.replace(dom, Lang.new('ja'))
25
+
26
+ content = dom.xpath('//meta')[0].get_attribute('content')
27
+ assert_equal('こんにちは', content)
28
+ end
29
+
30
+ def test_replace_og_title
31
+ replacer = MetaReplacer.new({
32
+ 'Hello' => {'ja' => [{'data' => 'こんにちは'}]}
33
+ })
34
+
35
+ dom = Wovnrb.get_dom('<meta property="og:title" content="Hello">')
36
+ replacer.replace(dom, Lang.new('ja'))
37
+
38
+ content = dom.xpath('//meta')[0].get_attribute('content')
39
+ assert_equal('こんにちは', content)
40
+ end
41
+
42
+ def test_replace_twitter_title
43
+ replacer = MetaReplacer.new({
44
+ 'Hello' => {'ja' => [{'data' => 'こんにちは'}]}
45
+ })
46
+
47
+ dom = Wovnrb.get_dom('<meta property="twitter:title" content="Hello">')
48
+ replacer.replace(dom, Lang.new('ja'))
49
+
50
+ content = dom.xpath('//meta')[0].get_attribute('content')
51
+ assert_equal('こんにちは', content)
52
+ end
53
+
54
+ def test_replace_twitter_description
55
+ replacer = MetaReplacer.new({
56
+ 'Hello' => {'ja' => [{'data' => 'こんにちは'}]}
57
+ })
58
+
59
+ dom = Wovnrb.get_dom('<meta property="twitter:description" content="Hello">')
60
+ replacer.replace(dom, Lang.new('ja'))
61
+
62
+ content = dom.xpath('//meta')[0].get_attribute('content')
63
+ assert_equal('こんにちは', content)
64
+ end
65
+
66
+ def test_replace_multi
67
+ replacer = MetaReplacer.new({
68
+ 'Hello' => {'ja' => [{'data' => 'こんにちは'}]},
69
+ 'Bye' => {'ja' => [{'data' => 'さようなら'}]}
70
+ })
71
+
72
+ dom = Wovnrb.get_dom('<meta property="title" content="Hello"><meta property="title" content="Bye">')
73
+ replacer.replace(dom, Lang.new('ja'))
74
+
75
+ content = dom.xpath('//meta')[0].get_attribute('content')
76
+ content2 = dom.xpath('//meta')[1].get_attribute('content')
77
+ assert_equal('こんにちは', content)
78
+ assert_equal('さようなら', content2)
79
+ end
80
+
81
+ def test_replace_with_space
82
+ replacer = MetaReplacer.new({
83
+ 'Hello' => {'ja' => [{'data' => 'こんにちは'}]},
84
+ })
85
+
86
+ dom = Wovnrb.get_dom('<meta property="title" content=" Hello ">')
87
+ replacer.replace(dom, Lang.new('ja'))
88
+
89
+ content = dom.xpath('//meta')[0].get_attribute('content')
90
+ assert_equal(' こんにちは ', content)
91
+ end
92
+
93
+ def test_replace_wovn_ignore
94
+ replacer = MetaReplacer.new({
95
+ 'Hello' => {'ja' => [{'data' => 'こんにちは'}]},
96
+ })
97
+
98
+ dom = Wovnrb.get_dom('<meta wovn-ignore property="title" content="Hello">')
99
+ replacer.replace(dom, Lang.new('ja'))
100
+
101
+ content = dom.xpath('//meta')[0].get_attribute('content')
102
+ assert_equal('Hello', content)
103
+ end
104
+ end
105
+ end
@@ -0,0 +1,31 @@
1
+ require 'test_helper'
2
+ require 'webmock/minitest'
3
+
4
+ module Wovnrb
5
+ class ReplacerBaseTest < WovnMiniTest
6
+ def test_wovn_ignore
7
+ replacer = ReplacerBase.new
8
+ dom = Wovnrb.to_dom('<html><body><div wovn-ignore></div></body></html>')
9
+ actual = replacer.send(:wovn_ignore?, dom.xpath('//div')[0])
10
+
11
+ assert(actual)
12
+ end
13
+
14
+ def test_wovn_ignore_parent
15
+ replacer = ReplacerBase.new
16
+ dom = Wovnrb.to_dom('<html wovn-ignore><body><div wovn-ignore></div></body></html>')
17
+ actual = replacer.send(:wovn_ignore?, dom.xpath('//div')[0])
18
+
19
+ assert(actual)
20
+ end
21
+
22
+ def test_wovn_ignore_without_attribute
23
+ replacer = ReplacerBase.new
24
+ dom = Wovnrb.to_dom('<html><body><div></div></body></html>')
25
+ actual = replacer.send(:wovn_ignore?, dom.xpath('//div')[0])
26
+
27
+ assert_equal(false, actual)
28
+ end
29
+ end
30
+ end
31
+
@@ -0,0 +1,90 @@
1
+ require 'test_helper'
2
+ require 'webmock/minitest'
3
+
4
+ module Wovnrb
5
+ class ScriptReplacerTest < WovnMiniTest
6
+ def test_replace
7
+ store = Store.instance
8
+ store.settings['user_token'] = 'test_token'
9
+ store.settings['default_lang'] = 'en'
10
+ store.settings['url_pattern'] = 'domain'
11
+
12
+ replacer = ScriptReplacer.new(store)
13
+ dom = to_head_dom('<script src="test/test.js"></script>')
14
+ replacer.replace(dom, Lang.new('ja'))
15
+
16
+ scripts = dom.xpath('//script')
17
+ assert_equal(2, scripts.length)
18
+
19
+ wovn_script = scripts[0]
20
+ other_script = scripts[1]
21
+
22
+ check_wovn_script(wovn_script, 'test_token', 'ja', 'en', 'domain')
23
+ assert_equal('test/test.js', other_script.get_attribute('src'))
24
+ end
25
+
26
+ def test_with_embed_wovn
27
+ store = Store.instance
28
+ store.settings['user_token'] = 'test_token'
29
+ store.settings['default_lang'] = 'en'
30
+ store.settings['url_pattern'] = 'domain'
31
+
32
+ replacer = ScriptReplacer.new(store)
33
+ dom = to_head_dom('<script src="//j.wovn.io/aaaa" data-wovnio="key=test_token" async></script>')
34
+ replacer.replace(dom, Lang.new('ja'))
35
+
36
+ scripts = dom.xpath('//script')
37
+ assert_equal(1, scripts.length)
38
+
39
+ check_wovn_script(scripts[0], 'test_token', 'ja', 'en', 'domain')
40
+ end
41
+
42
+ def test_with_multiple_embed_wovn
43
+ store = Store.instance
44
+ store.settings['user_token'] = 'test_token'
45
+ store.settings['default_lang'] = 'en'
46
+ store.settings['url_pattern'] = 'domain'
47
+
48
+ replacer = ScriptReplacer.new(store)
49
+ dom = to_head_dom('<script src="//j.wovn.io/aaaa" data-wovnio="key=test_token" async></script><script src="//j.wovn.io/bbb" data-wovnio="key=test_token" async></script>')
50
+ replacer.replace(dom, Lang.new('ja'))
51
+
52
+ scripts = dom.xpath('//script')
53
+ assert_equal(1, scripts.length)
54
+
55
+ check_wovn_script(scripts[0], 'test_token', 'ja', 'en', 'domain')
56
+ end
57
+
58
+ def test_with_embed_wovn_at_body
59
+ store = Store.instance
60
+ store.settings['user_token'] = 'test_token'
61
+ store.settings['default_lang'] = 'en'
62
+ store.settings['url_pattern'] = 'domain'
63
+
64
+ replacer = ScriptReplacer.new(store)
65
+ dom = Wovnrb.get_dom('<script src="//j.wovn.io/aaaa" data-wovnio="key=test_token" async></script>')
66
+ replacer.replace(dom, Lang.new('ja'))
67
+
68
+ scripts = dom.xpath('//script')
69
+ assert_equal(1, scripts.length)
70
+
71
+ check_wovn_script(scripts[0], 'test_token', 'ja', 'en', 'domain')
72
+ end
73
+
74
+ def check_wovn_script(node, user_token, current_lang, default_lang, url_pattern)
75
+ wovn_data = [
76
+ ['src', '//j.wovn.io/1'],
77
+ ['async', 'true'],
78
+ ['data-wovnio', "key=#{user_token}&backend=true&currentLang=#{current_lang}&defaultLang=#{default_lang}&urlPattern=#{url_pattern}&version=0.2.01"]
79
+ ]
80
+ wovn_data.each do |data|
81
+ assert_equal(data[1], node.get_attribute(data[0]))
82
+ end
83
+ assert_equal(wovn_data.length, node.attributes.length)
84
+ end
85
+
86
+ def to_head_dom(html)
87
+ Wovnrb.to_dom("<html><head>#{html}</head></html>")
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,57 @@
1
+ require 'test_helper'
2
+ require 'webmock/minitest'
3
+
4
+ module Wovnrb
5
+ class TextReplacerTest < WovnMiniTest
6
+ def test_replace
7
+ replacer = TextReplacer.new({
8
+ 'Hello' => {'ja' => [{'data' => 'こんにちは'}]}
9
+ })
10
+
11
+ dom = Wovnrb.get_dom('Hello')
12
+ replacer.replace(dom, Lang.new('ja'))
13
+
14
+ content = dom.xpath('//text()')[0].content
15
+ assert_equal('こんにちは', content)
16
+ end
17
+
18
+ def test_replace_multiple
19
+ replacer = TextReplacer.new({
20
+ 'Hello' => {'ja' => [{'data' => 'こんにちは'}]},
21
+ 'Bye' => {'ja' => [{'data' => 'さようなら'}]}
22
+ })
23
+
24
+ dom = Wovnrb.get_dom('<span>Hello</span><span>Bye</span>')
25
+ replacer.replace(dom, Lang.new('ja'))
26
+
27
+ content = dom.xpath('//text()')[0].content
28
+ content2 = dom.xpath('//text()')[1].content
29
+ assert_equal('こんにちは', content)
30
+ assert_equal('さようなら', content2)
31
+ end
32
+
33
+ def test_replace_with_space
34
+ replacer = TextReplacer.new({
35
+ 'Hello' => {'ja' => [{'data' => 'こんにちは'}]}
36
+ })
37
+
38
+ dom = Wovnrb.get_dom(' Hello ')
39
+ replacer.replace(dom, Lang.new('ja'))
40
+
41
+ content = dom.xpath('//text()')[0].content
42
+ assert_equal(' こんにちは ', content)
43
+ end
44
+
45
+ def test_replace_wovn_ignore
46
+ replacer = TextReplacer.new({
47
+ 'Hello' => {'ja' => [{'data' => 'こんにちは'}]}
48
+ })
49
+
50
+ dom = Wovnrb.get_dom('<div wovn-ignore>Hello</div>')
51
+ replacer.replace(dom, Lang.new('ja'))
52
+
53
+ content = dom.xpath('//text()')[0].content
54
+ assert_equal('Hello', content)
55
+ end
56
+ end
57
+ end