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.
@@ -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: