ajax-cat 1.0.0 → 2.0.1
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.
- data/Gemfile +2 -1
- data/Gemfile.lock +4 -3
- data/README.rdoc +1 -1
- data/VERSION +1 -1
- data/ajax-cat.gemspec +10 -5
- data/ajax-cat_old.ini.json +15 -0
- data/lib/ajax-cat.rb +5 -0
- data/lib/ajax-cat/ajax_cat_server.rb +39 -16
- data/lib/ajax-cat/pairs.rb +3 -1
- data/lib/ajax-cat/public/AjaxCatList.coffee +11 -3
- data/lib/ajax-cat/public/AjaxCatTranslation.coffee +36 -12
- data/lib/ajax-cat/public/Suggestions.coffee +12 -3
- data/lib/ajax-cat/public/TranslationTable.coffee +20 -1
- data/lib/ajax-cat/public/Utils.coffee +16 -0
- data/lib/ajax-cat/public/ajax-cat.js +111 -16
- data/lib/ajax-cat/public/cookie.js +72 -0
- data/lib/ajax-cat/public/index.html +1 -1
- data/lib/ajax-cat/public/translation.html +13 -7
- data/lib/ajax-cat/request/suggestion.rb +12 -2
- data/lib/ajax-cat/views/admin.erb +65 -16
- data/lib/ajax-cat/views/experiment.erb +62 -7
- data/test/unit/test_suggestion_request.rb +18 -6
- metadata +39 -26
@@ -35,33 +35,82 @@
|
|
35
35
|
|
36
36
|
<div class="container-fluid">
|
37
37
|
<div class="row-fluid">
|
38
|
-
<h1>
|
38
|
+
<h1>A/B tests</h1>
|
39
39
|
|
40
40
|
<table class="table table-bordered table-striped table-condensed" id="translation-list">
|
41
|
-
<tr><th
|
41
|
+
<tr><th>Test</th><th></th></tr>
|
42
42
|
<% Task.all.each do |task| %>
|
43
43
|
<tr>
|
44
|
-
<td
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
44
|
+
<td>
|
45
|
+
<a href="/experiment/<%= task.id %>">
|
46
|
+
<%= task.name %> (<%= task.pair %>)
|
47
|
+
</a>
|
48
|
+
</td>
|
49
|
+
<td><form method="post" action="/admin/remove_task?id=<%= task.id %>">
|
50
|
+
<input type="submit" class="btn btn-danger" value="Delete" onclick="return confirm('Really want to delete this test?')">
|
50
51
|
</form>
|
51
52
|
</td>
|
52
53
|
</tr>
|
53
54
|
<% end %>
|
54
55
|
</table>
|
55
56
|
|
57
|
+
<h1>Create new A/B test</h1>
|
56
58
|
|
57
|
-
<form class="well form-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
59
|
+
<form class="well form-horizontal" method="post" action="/admin/add_task">
|
60
|
+
|
61
|
+
<div class="control-group">
|
62
|
+
<label class="control-label" for="new-translation-name">Name of test: </label>
|
63
|
+
<div class="controls">
|
64
|
+
<input id="new-experiment-name" name="name">
|
65
|
+
</div>
|
66
|
+
</div>
|
67
|
+
|
68
|
+
<div class="control-group">
|
69
|
+
<label class="control-label" for="new-experiment-pair">Language: </label>
|
70
|
+
<div class="controls">
|
71
|
+
<select id="new-experiment-pair" name="pair">
|
72
|
+
<% @pairs.each do |pair| %>
|
73
|
+
<option values="<%= pair %>"><%= pair %></option>
|
74
|
+
<% end %>
|
75
|
+
</select>
|
76
|
+
</div>
|
77
|
+
</div>
|
78
|
+
|
79
|
+
<div class="control-group">
|
80
|
+
<label class="control-label" for="new-experiment-sentence">Sentences: </label>
|
81
|
+
<div class="controls">
|
82
|
+
<span id="sentences-stack">
|
83
|
+
<input id="new-experiment-sentence" name="sentences[]">
|
84
|
+
</span>
|
85
|
+
<br>
|
86
|
+
<a href="#" onclick="$('#sentences-stack').append('<br><input name=\'sentences[]\'>')">add sentence</a>
|
87
|
+
</div>
|
88
|
+
</div>
|
89
|
+
|
90
|
+
<div class="control-group">
|
91
|
+
<label class="control-label">A/B groups: </label>
|
92
|
+
<div class="controls">
|
93
|
+
<table class="table table-bordered">
|
94
|
+
<tr><th></th><th>A</th><th>B</th></tr>
|
95
|
+
|
96
|
+
<tr><td>Test user group size<br>(use even numbers)</td>
|
97
|
+
<td colspan="2">
|
98
|
+
<center><input type="number" name="users" value="6" step="2" min="2" max="1000000"></center>
|
99
|
+
</td>
|
100
|
+
</tr>
|
101
|
+
|
102
|
+
<tr><td>Suggestion box present</td>
|
103
|
+
<td><input type="checkbox" checked name="suggestion-a"></td>
|
104
|
+
<td><input type="checkbox" checked name="suggestion-b"></td>
|
105
|
+
</tr>
|
106
|
+
|
107
|
+
</table>
|
108
|
+
</div>
|
109
|
+
</div>
|
110
|
+
|
111
|
+
<div class="form-actions">
|
112
|
+
<button type="submit" class="btn btn-success">Create A/B test</button>
|
113
|
+
</div>
|
65
114
|
</form>
|
66
115
|
|
67
116
|
</div><!--/row-->
|
@@ -35,14 +35,69 @@
|
|
35
35
|
|
36
36
|
<div class="container-fluid">
|
37
37
|
<div class="row-fluid">
|
38
|
-
<h1><%= @task.
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
38
|
+
<h1><%= @task.id %> - <%= @task.name %> <small><%= @task.pair %></small></h1>
|
39
|
+
<%
|
40
|
+
finished_a = 0
|
41
|
+
finished_b = 0
|
42
|
+
count_a = 0
|
43
|
+
count_b = 0
|
44
|
+
time_a = 0
|
45
|
+
time_b = 0
|
46
|
+
%>
|
47
|
+
<% @task.logs.each_with_index do |log, i| %>
|
48
|
+
<h2>#<%= i+1 %> (<%= log.id %>)
|
49
|
+
<% parsed = JSON.parse(log.log) if log.log %>
|
50
|
+
<% if log.log %>
|
51
|
+
completed by <%= parsed['email'] %>
|
52
|
+
<% else %>
|
53
|
+
<small>not completed yet</small>
|
54
|
+
<% end %>
|
55
|
+
</h2>
|
56
|
+
<% options = JSON.parse(log.options) %>
|
57
|
+
<% sentences = JSON.parse(log.sentences) %>
|
58
|
+
<% sentences.each_with_index do |sentence, j| %>
|
59
|
+
<%
|
60
|
+
type = options[j]['type']
|
61
|
+
count_a += 1 if type == "a"
|
62
|
+
count_b += 1 if type == "b"
|
63
|
+
%>
|
64
|
+
<h3><%= (j + 1)%>) <%= sentence %><small><%= options[j] %></small></h3>
|
65
|
+
<% if parsed %>
|
66
|
+
finished in
|
67
|
+
<%
|
68
|
+
time = (parsed['log'][j].last['time'] - parsed['log'][j].first['time'])
|
69
|
+
finished_a += 1 if type == "a"
|
70
|
+
finished_b += 1 if type == "b"
|
71
|
+
time_a += time if type == "a"
|
72
|
+
time_b += time if type == "b"
|
73
|
+
%>
|
74
|
+
<%= time / 1000.to_f %>
|
75
|
+
seconds<br>
|
76
|
+
<textarea style="width: 600px; height: 200px;">
|
77
|
+
<% parsed['log'][j].each_with_index do |l, k| %>
|
78
|
+
<%= l %>
|
79
|
+
<% end %>
|
80
|
+
</textarea>
|
81
|
+
<% end %>
|
44
82
|
<% end %>
|
45
|
-
|
83
|
+
<% end %>
|
84
|
+
|
85
|
+
|
86
|
+
<hr>
|
87
|
+
<h2>Results</h2>
|
88
|
+
|
89
|
+
<table class="table table-bordered table-striped">
|
90
|
+
<tr><th>Group</th><th width="50%">A</th><th width="50%">B</th></tr>
|
91
|
+
<tr><th nowrap>Finished sentences:</th>
|
92
|
+
<td><%= finished_a %> / <%= count_a %></td>
|
93
|
+
<td><%= finished_b %> / <%= count_b %></td>
|
94
|
+
</tr>
|
95
|
+
<tr><th nowrap>Average time per sentence:</th>
|
96
|
+
<td><%= time_a / 1000.to_f %> seconds</td>
|
97
|
+
<td><%= time_b / 1000.to_f %> seconds</td>
|
98
|
+
</tr>
|
99
|
+
</table>
|
100
|
+
|
46
101
|
</div><!--/row-->
|
47
102
|
|
48
103
|
<hr>
|
@@ -11,18 +11,30 @@ module AjaxCat
|
|
11
11
|
|
12
12
|
should "parse suggestions right" do
|
13
13
|
request = Request::Suggestion.new("das ist ein kleines haus", "11000", " tohle je")
|
14
|
-
request.process_line("0 ||| tohle je a small house ||| d: 0 lm: -25.9604 w: -3 tm: -1.60944 ||| -27.5698 ||| 2=2
|
15
|
-
request.process_line("0 ||| tohle je a little house ||| d: 0 lm: -25.9604 w: -3 tm: -1.60944 ||| -27.5698 ||| 2=
|
16
|
-
request.process_line("0 ||| tohle je an small house ||| d: 0 lm: -25.9604 w: -3 tm: -1.60944 ||| -27.5698 ||| 2=2 3=3 4=4")
|
14
|
+
request.process_line("0 ||| tohle je a small house ||| d: 0 lm: -25.9604 w: -3 tm: -1.60944 ||| -27.5698 ||| 2-4=2-4")
|
15
|
+
request.process_line("0 ||| tohle je a little house ||| d: 0 lm: -25.9604 w: -3 tm: -1.60944 ||| -27.5698 ||| 2-3=3 3=3 4=4")
|
17
16
|
request.process_line("0 ||| tohle je an small house ||| d: 0 lm: -25.9604 w: -3 tm: -1.60944 ||| -27.5698 ||| 2=2 3=3 4=4")
|
17
|
+
request.process_line("0 ||| tohle je a small house ||| d: 0 lm: -25.9604 w: -3 tm: -1.60944 ||| -27.5698 ||| 2-4=2-4")
|
18
18
|
|
19
19
|
|
20
20
|
assert_equal(
|
21
21
|
{
|
22
22
|
"suggestions" => [
|
23
|
-
|
24
|
-
|
25
|
-
|
23
|
+
{
|
24
|
+
"text" => "a small house",
|
25
|
+
"from" => 2,
|
26
|
+
"to" => 4
|
27
|
+
},
|
28
|
+
{
|
29
|
+
"text" => "little",
|
30
|
+
"from" => 2,
|
31
|
+
"to" => 3
|
32
|
+
},
|
33
|
+
{
|
34
|
+
"text" => "an",
|
35
|
+
"from" => 2,
|
36
|
+
"to" => 2
|
37
|
+
}
|
26
38
|
]
|
27
39
|
}, request.result)
|
28
40
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ajax-cat
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-08-22 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: sinatra
|
16
|
-
requirement: &
|
16
|
+
requirement: &2169646220 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: 1.3.2
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *2169646220
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: colorize
|
27
|
-
requirement: &
|
27
|
+
requirement: &2169632960 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ~>
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: 0.5.8
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *2169632960
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: thin
|
38
|
-
requirement: &
|
38
|
+
requirement: &2169629220 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ~>
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: 1.3.1
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *2169629220
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: thor
|
49
|
-
requirement: &
|
49
|
+
requirement: &2169628260 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ~>
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: 0.15.2
|
55
55
|
type: :runtime
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *2169628260
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: sqlite3
|
60
|
-
requirement: &
|
60
|
+
requirement: &2169627120 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ~>
|
@@ -65,21 +65,32 @@ dependencies:
|
|
65
65
|
version: 1.3.3
|
66
66
|
type: :runtime
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *2169627120
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: activerecord
|
71
|
-
requirement: &
|
71
|
+
requirement: &2169626380 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
74
|
- - ! '>='
|
75
75
|
- !ruby/object:Gem::Version
|
76
|
-
version:
|
76
|
+
version: 3.2.3
|
77
77
|
type: :runtime
|
78
78
|
prerelease: false
|
79
|
-
version_requirements: *
|
79
|
+
version_requirements: *2169626380
|
80
|
+
- !ruby/object:Gem::Dependency
|
81
|
+
name: activesupport
|
82
|
+
requirement: &2169625680 !ruby/object:Gem::Requirement
|
83
|
+
none: false
|
84
|
+
requirements:
|
85
|
+
- - ! '>='
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: 3.2.3
|
88
|
+
type: :runtime
|
89
|
+
prerelease: false
|
90
|
+
version_requirements: *2169625680
|
80
91
|
- !ruby/object:Gem::Dependency
|
81
92
|
name: rdoc
|
82
|
-
requirement: &
|
93
|
+
requirement: &2169625180 !ruby/object:Gem::Requirement
|
83
94
|
none: false
|
84
95
|
requirements:
|
85
96
|
- - ~>
|
@@ -87,10 +98,10 @@ dependencies:
|
|
87
98
|
version: '3.12'
|
88
99
|
type: :development
|
89
100
|
prerelease: false
|
90
|
-
version_requirements: *
|
101
|
+
version_requirements: *2169625180
|
91
102
|
- !ruby/object:Gem::Dependency
|
92
103
|
name: bundler
|
93
|
-
requirement: &
|
104
|
+
requirement: &2169624700 !ruby/object:Gem::Requirement
|
94
105
|
none: false
|
95
106
|
requirements:
|
96
107
|
- - ~>
|
@@ -98,10 +109,10 @@ dependencies:
|
|
98
109
|
version: 1.0.0
|
99
110
|
type: :development
|
100
111
|
prerelease: false
|
101
|
-
version_requirements: *
|
112
|
+
version_requirements: *2169624700
|
102
113
|
- !ruby/object:Gem::Dependency
|
103
114
|
name: jeweler
|
104
|
-
requirement: &
|
115
|
+
requirement: &2169624180 !ruby/object:Gem::Requirement
|
105
116
|
none: false
|
106
117
|
requirements:
|
107
118
|
- - ~>
|
@@ -109,10 +120,10 @@ dependencies:
|
|
109
120
|
version: 1.8.3
|
110
121
|
type: :development
|
111
122
|
prerelease: false
|
112
|
-
version_requirements: *
|
123
|
+
version_requirements: *2169624180
|
113
124
|
- !ruby/object:Gem::Dependency
|
114
125
|
name: shoulda
|
115
|
-
requirement: &
|
126
|
+
requirement: &2169623680 !ruby/object:Gem::Requirement
|
116
127
|
none: false
|
117
128
|
requirements:
|
118
129
|
- - ~>
|
@@ -120,10 +131,10 @@ dependencies:
|
|
120
131
|
version: 3.0.1
|
121
132
|
type: :development
|
122
133
|
prerelease: false
|
123
|
-
version_requirements: *
|
134
|
+
version_requirements: *2169623680
|
124
135
|
- !ruby/object:Gem::Dependency
|
125
136
|
name: curb
|
126
|
-
requirement: &
|
137
|
+
requirement: &2169623080 !ruby/object:Gem::Requirement
|
127
138
|
none: false
|
128
139
|
requirements:
|
129
140
|
- - ~>
|
@@ -131,7 +142,7 @@ dependencies:
|
|
131
142
|
version: 0.8.0
|
132
143
|
type: :development
|
133
144
|
prerelease: false
|
134
|
-
version_requirements: *
|
145
|
+
version_requirements: *2169623080
|
135
146
|
description: computer-aided translation backed by machine translation
|
136
147
|
email: odchazel@gmail.com
|
137
148
|
executables:
|
@@ -149,6 +160,7 @@ files:
|
|
149
160
|
- Rakefile
|
150
161
|
- VERSION
|
151
162
|
- ajax-cat.gemspec
|
163
|
+
- ajax-cat_old.ini.json
|
152
164
|
- bin/ajax-cat
|
153
165
|
- lib/.DS_Store
|
154
166
|
- lib/ajax-cat.rb
|
@@ -166,6 +178,7 @@ files:
|
|
166
178
|
- lib/ajax-cat/public/ajax-cat.js
|
167
179
|
- lib/ajax-cat/public/bootstrap.css
|
168
180
|
- lib/ajax-cat/public/bootstrap.js
|
181
|
+
- lib/ajax-cat/public/cookie.js
|
169
182
|
- lib/ajax-cat/public/index.html
|
170
183
|
- lib/ajax-cat/public/index.js
|
171
184
|
- lib/ajax-cat/public/jquery.js
|
@@ -211,7 +224,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
211
224
|
version: '0'
|
212
225
|
segments:
|
213
226
|
- 0
|
214
|
-
hash:
|
227
|
+
hash: -353594361952857068
|
215
228
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
216
229
|
none: false
|
217
230
|
requirements:
|