ajax-cat 1.0.0 → 2.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -35,33 +35,82 @@
35
35
 
36
36
  <div class="container-fluid">
37
37
  <div class="row-fluid">
38
- <h1>Experiments</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>#</th><th>Pair</th><th>Sentence</th><th></th><th></th></tr>
41
+ <tr><th>Test</th><th></th></tr>
42
42
  <% Task.all.each do |task| %>
43
43
  <tr>
44
- <td><%= task.id %></td>
45
- <td><%= task.pair %></td>
46
- <td><%= task.sentence %></td>
47
- <td><a href="/experiment/<%= task.id %>">detail</a></td>
48
- <td><form class="form-inline" method="post" action="/admin/remove_task?id=<%= task.id %>">
49
- <input type="submit" class="btn btn-danger" value="Delete">
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-inline" method="post" action="/admin/add_task">
58
- <select id="new-translation-pair" name="pair">
59
- <% @pairs.each do |pair| %>
60
- <option values="<%= pair %>"><%= pair %></option>
61
- <% end %>
62
- </select>
63
- <input type="text" name="sentence" class="input-small" placeholder="New experiment task sentence" style="width: 600px;">
64
- <button type="submit" class="btn btn-success">Create experiment task</button>
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.sentence %> <small><%= @task.pair %></small></h1>
39
-
40
- <table class="table table-bordered table-striped table-condensed">
41
- <% @task.logs.each do |log| %>
42
- <tr><td><%= log.id %></td><td><%= log.time %></td><td><%= log.email %></td></tr>
43
- <tr><td colspan="3"><%= log.log %></td></tr>
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
- </table>
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 3=3 4=4")
15
- request.process_line("0 ||| tohle je a little house ||| d: 0 lm: -25.9604 w: -3 tm: -1.60944 ||| -27.5698 ||| 2=2 3=3 4=4")
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
- "a small house",
24
- "a little house",
25
- "an small house"
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: 1.0.0
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-05-22 00:00:00.000000000Z
12
+ date: 2012-08-22 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: sinatra
16
- requirement: &2153787720 !ruby/object:Gem::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: *2153787720
24
+ version_requirements: *2169646220
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: colorize
27
- requirement: &2153787240 !ruby/object:Gem::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: *2153787240
35
+ version_requirements: *2169632960
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: thin
38
- requirement: &2153786760 !ruby/object:Gem::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: *2153786760
46
+ version_requirements: *2169629220
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: thor
49
- requirement: &2153786280 !ruby/object:Gem::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: *2153786280
57
+ version_requirements: *2169628260
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: sqlite3
60
- requirement: &2153785800 !ruby/object:Gem::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: *2153785800
68
+ version_requirements: *2169627120
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: activerecord
71
- requirement: &2153785320 !ruby/object:Gem::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: '0'
76
+ version: 3.2.3
77
77
  type: :runtime
78
78
  prerelease: false
79
- version_requirements: *2153785320
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: &2153784820 !ruby/object:Gem::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: *2153784820
101
+ version_requirements: *2169625180
91
102
  - !ruby/object:Gem::Dependency
92
103
  name: bundler
93
- requirement: &2153784320 !ruby/object:Gem::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: *2153784320
112
+ version_requirements: *2169624700
102
113
  - !ruby/object:Gem::Dependency
103
114
  name: jeweler
104
- requirement: &2153783720 !ruby/object:Gem::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: *2153783720
123
+ version_requirements: *2169624180
113
124
  - !ruby/object:Gem::Dependency
114
125
  name: shoulda
115
- requirement: &2153783120 !ruby/object:Gem::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: *2153783120
134
+ version_requirements: *2169623680
124
135
  - !ruby/object:Gem::Dependency
125
136
  name: curb
126
- requirement: &2153780680 !ruby/object:Gem::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: *2153780680
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: 856513624769004496
227
+ hash: -353594361952857068
215
228
  required_rubygems_version: !ruby/object:Gem::Requirement
216
229
  none: false
217
230
  requirements: