a_b 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1 @@
1
+ 8e1bcc6760ff89ff94bad4b1dc282cb0
@@ -0,0 +1,25 @@
1
+ Feature: API
2
+
3
+ As a client
4
+ I want to retrieve test and variant data
5
+ I want retrieve a security token for use in JSON-P calls from the end user
6
+ In order to begin running tests
7
+
8
+ Scenario: An authorized client performs a GET request on /boot.json
9
+ Given an authorized token
10
+ When GET request /boot.json
11
+ Then return test names
12
+ And return variant names with visit counts
13
+ And return a JSON-P security token
14
+
15
+ Scenario: An authorized client performs a GET request on /convert.js
16
+ Given an authorized token
17
+ And a list of variant names
18
+ When GET request /convert.js
19
+ Then increment conversions for each variant
20
+
21
+ Scenario: An authorized client performs a GET request on /visit.js
22
+ Given an authorized token
23
+ And a list of variant names
24
+ When GET request /visit.js
25
+ Then increment visitors for each variant
@@ -0,0 +1,7 @@
1
+ Given /^an authorized token$/ do
2
+ pending
3
+ end
4
+
5
+ Given /^a list of variant names$/ do
6
+ pending
7
+ end
@@ -0,0 +1,19 @@
1
+ Then /^return test names$/ do
2
+ pending
3
+ end
4
+
5
+ Then /^return variant names with visit counts$/ do
6
+ pending
7
+ end
8
+
9
+ Then /^return a JSON\-P security token$/ do
10
+ pending
11
+ end
12
+
13
+ Then /^increment conversions for each variant$/ do
14
+ pending
15
+ end
16
+
17
+ Then /^increment visitors for each variant$/ do
18
+ pending
19
+ end
@@ -0,0 +1,11 @@
1
+ When /^GET request \/boot\.json$/ do
2
+ pending
3
+ end
4
+
5
+ When /^GET request \/convert\.js$/ do
6
+ pending
7
+ end
8
+
9
+ When /^GET request \/visit\.js$/ do
10
+ pending
11
+ end
data/gemspec.rb CHANGED
@@ -26,6 +26,7 @@ GEM_SPEC = Gem::Specification.new do |s|
26
26
  s.add_dependency('haml', '=2.2.13')
27
27
  s.add_dependency('rack', '=1.0.1')
28
28
  s.add_dependency('rack-flash', '=0.1.1')
29
+ s.add_dependency('rack_hoptoad', '=0.0.3')
29
30
  s.add_dependency('rack-test', '=0.5.1')
30
31
  s.add_dependency('rspec', '=1.2.9')
31
32
  s.add_dependency('shotgun', '=0.4')
@@ -37,5 +38,5 @@ GEM_SPEC = Gem::Specification.new do |s|
37
38
  s.name = GEM_NAME
38
39
  s.platform = Gem::Platform::RUBY
39
40
  s.require_path = "lib"
40
- s.version = "0.1.0"
41
+ s.version = "0.1.1"
41
42
  end
data/lib/a_b.rb CHANGED
@@ -5,7 +5,8 @@ gems = [
5
5
  [ 'sinatra', '=0.9.4' ],
6
6
  [ 'active_wrapper', '=0.2.1' ],
7
7
  [ 'rack-flash', '=0.1.1' ],
8
- [ 'authlogic', '=2.1.3' ]
8
+ [ 'authlogic', '=2.1.3' ],
9
+ [ 'rack_hoptoad', '=0.0.3' ]
9
10
  ]
10
11
 
11
12
  gems.each do |name, version|
@@ -22,6 +23,7 @@ require 'sinatra/base'
22
23
  require 'active_wrapper'
23
24
  require 'rack-flash'
24
25
  require 'authlogic'
26
+ require 'rack_hoptoad'
25
27
 
26
28
  class Application < Sinatra::Base
27
29
  end
@@ -25,6 +25,11 @@ Application.class_eval do
25
25
  use Rack::Flash, :accessorize => %w(error notice success)
26
26
 
27
27
  # Generate token
28
- require File.dirname(__FILE__) + '/model/token'
28
+ require "#{root}/lib/a_b/model/token"
29
29
  Token.generate!
30
+
31
+ # Hoptoad notifier
32
+ if File.exists?(hoptoad = "#{root}/config/hoptoad.txt")
33
+ use Rack::HoptoadNotifier, File.read(hoptoad)
34
+ end
30
35
  end
@@ -14,19 +14,11 @@ Application.class_eval do
14
14
 
15
15
  get '/convert.js' do
16
16
  return nil unless valid_token?
17
- if variant = ABVariant.find_by_name(params[:variant])
18
- variant.increment!(:conversions)
19
- end
20
- 'true'
17
+ increment :conversions
21
18
  end
22
19
 
23
20
  get '/visit.js' do
24
21
  return nil unless valid_token?
25
- if params[:variants] && variants = ABVariant.find_all_by_name(params[:variants])
26
- variants.each do |variant|
27
- variant.increment!(:visitors)
28
- end
29
- end
30
- redirect '/js/visit.js'
22
+ increment :visitors
31
23
  end
32
24
  end
@@ -0,0 +1,7 @@
1
+ Application.class_eval do
2
+
3
+ get '/pulse' do
4
+ rows = ActiveRecord::Base.connection.execute("select 1 from dual").num_rows rescue 0
5
+ rows == 1 ? "OK" : "Error!"
6
+ end
7
+ end
@@ -1,6 +1,15 @@
1
1
  Application.class_eval do
2
2
  helpers do
3
3
 
4
+ def increment(attribute)
5
+ if params[:variants] && variants = ABVariant.find_all_by_name(params[:variants])
6
+ variants.each do |variant|
7
+ variant.increment! attribute
8
+ end
9
+ end
10
+ nil
11
+ end
12
+
4
13
  def valid_token?
5
14
  Digest::SHA256.hexdigest(params[:session_id] + Token.cached) == params[:token]
6
15
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: a_b
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Winton Welsh
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-11-19 00:00:00 -08:00
12
+ date: 2009-11-20 00:00:00 -08:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -62,6 +62,16 @@ dependencies:
62
62
  - !ruby/object:Gem::Version
63
63
  version: 0.1.1
64
64
  version:
65
+ - !ruby/object:Gem::Dependency
66
+ name: rack_hoptoad
67
+ type: :runtime
68
+ version_requirement:
69
+ version_requirements: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - "="
72
+ - !ruby/object:Gem::Version
73
+ version: 0.0.3
74
+ version:
65
75
  - !ruby/object:Gem::Dependency
66
76
  name: rack-test
67
77
  type: :runtime
@@ -123,13 +133,17 @@ extra_rdoc_files:
123
133
  files:
124
134
  - config/database.example.yml
125
135
  - config/externals.yml
136
+ - config/hoptoad.txt
126
137
  - config/mail.example.yml
127
138
  - config.ru
128
139
  - db/migrate/001_a_b_tests.rb
129
140
  - db/migrate/002_a_b_variants.rb
130
141
  - db/migrate/003_a_b_users.rb
131
142
  - db/migrate/004_a_b_tokens.rb
132
- - features/example.feature
143
+ - features/api.feature
144
+ - features/step_definitions/given.rb
145
+ - features/step_definitions/then.rb
146
+ - features/step_definitions/when.rb
133
147
  - features/support/env.rb
134
148
  - features/support/rspec.rb
135
149
  - features/support/webrat.rb
@@ -138,6 +152,7 @@ files:
138
152
  - lib/a_b/controller/api.rb
139
153
  - lib/a_b/controller/application.rb
140
154
  - lib/a_b/controller/index.rb
155
+ - lib/a_b/controller/pulse.rb
141
156
  - lib/a_b/controller/sessions.rb
142
157
  - lib/a_b/controller/tests.rb
143
158
  - lib/a_b/controller/variants.rb
@@ -162,7 +177,6 @@ files:
162
177
  - public/css/blueprint/screen.css
163
178
  - public/js/index.js
164
179
  - public/js/jquery.js
165
- - public/js/visit.js
166
180
  - Rakefile
167
181
  - README.markdown
168
182
  - script/console
@@ -1,10 +0,0 @@
1
- Feature: Example
2
-
3
- As a user
4
- I want
5
- In order
6
-
7
- Scenario: I do something
8
- /Given
9
- /When
10
- /Then
@@ -1,59 +0,0 @@
1
- /*
2
- How this should work:
3
- * Plugin generates visit() calls based on @a_b_selections
4
- * convert() with a test looks
5
- */
6
-
7
- window.A_B = new function() {
8
-
9
- var $ = jQuery;
10
- var conversions = {};
11
- var visits = {};
12
- var session_id, tests, token, url, visits;
13
-
14
- $.extend(this, {
15
- convert: convert,
16
- setup: setup
17
- });
18
-
19
- window.a_b = function(variant) {
20
- // TODO: Make this work like the Rails version
21
- }
22
-
23
- function convert(test_or_variant) {
24
- var pair = test_variant_pair(test_or_variant);
25
- console.log(pair);
26
- if (!pair || !session_id || !token || !url)
27
- return;
28
- var params = [
29
- 'session_id=' + session_id,
30
- 'token=' + token,
31
- 'variant=' + pair[1].name
32
- ];
33
- $.getJSON(url + '/convert.js?' + params.join('&'));
34
- }
35
-
36
- // Returns a [ test, variant ] pair given a test or variant
37
- // Only returns if the variant has been used in a test (visited)
38
- function test_variant_pair(test_or_variant) {
39
- var result;
40
- var v = visits[test_or_variant] || test_or_variant;
41
- $.each(tests, function(i, test) {
42
- $.each(test.variants, function(i, variant) {
43
- if (variant.name == v && visits[test.name] == v) {
44
- result = [ test, variant ];
45
- return false;
46
- }
47
- });
48
- });
49
- return result;
50
- }
51
-
52
- function setup(options) {
53
- session_id = options.session_id;
54
- tests = options.tests;
55
- token = options.token;
56
- url = options.url;
57
- visits = options.visits;
58
- }
59
- }