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.
- checksums.yaml +4 -4
- data/.gitignore +3 -6
- data/README.md +116 -12
- data/lib/wovnrb/api_data.rb +59 -0
- data/lib/wovnrb/headers.rb +30 -5
- data/lib/wovnrb/html_replacers/image_replacer.rb +44 -0
- data/lib/wovnrb/html_replacers/link_replacer.rb +18 -0
- data/lib/wovnrb/html_replacers/meta_replacer.rb +20 -0
- data/lib/wovnrb/html_replacers/replacer_base.rb +17 -0
- data/lib/wovnrb/html_replacers/script_replacer.rb +39 -0
- data/lib/wovnrb/html_replacers/text_replacer.rb +19 -0
- data/lib/wovnrb/lang.rb +133 -23
- data/lib/wovnrb/services/url.rb +2 -68
- data/lib/wovnrb/services/wovn_logger.rb +45 -0
- data/lib/wovnrb/store.rb +19 -38
- data/lib/wovnrb/text_caches/cache_base.rb +52 -0
- data/lib/wovnrb/text_caches/memory_cache.rb +52 -0
- data/lib/wovnrb/version.rb +1 -1
- data/lib/wovnrb.rb +19 -224
- data/test/lib/api_data_test.rb +62 -0
- data/test/lib/headers_test.rb +1221 -1212
- data/test/lib/html_replacers/image_replacer_test.rb +86 -0
- data/test/lib/html_replacers/link_replacer_test.rb +43 -0
- data/test/lib/html_replacers/meta_replacer_test.rb +105 -0
- data/test/lib/html_replacers/replacer_base_test.rb +31 -0
- data/test/lib/html_replacers/script_replacer_test.rb +90 -0
- data/test/lib/html_replacers/text_replacer_test.rb +57 -0
- data/test/lib/lang_test.rb +446 -33
- data/test/lib/services/wovn_logger_test.rb +40 -0
- data/test/lib/store_test.rb +39 -29
- data/test/lib/text_caches/cache_base_test.rb +31 -0
- data/test/lib/text_caches/memory_cache_test.rb +91 -0
- data/test/lib/wovnrb_test.rb +39 -886
- data/test/test_helper.rb +96 -1
- data/wovnrb.gemspec +4 -0
- 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¤tLang=#{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
|