a_b 0.1.0 → 0.1.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.
@@ -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
- }