rack-affiliates 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/Gemfile +2 -2
- data/README.md +38 -15
- data/Rakefile +0 -8
- data/VERSION +1 -1
- data/lib/rack-affiliates.rb +14 -7
- data/rack-affiliates.gemspec +4 -4
- data/spec/helper.rb +3 -0
- metadata +104 -126
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: f235b3dda5e49f7479173870577df0d1395be2ba
|
4
|
+
data.tar.gz: ec21042f606fed14b1f4279d30696c6f90f84cce
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: ce1c76fb4708658fd508a88bb51226f2e01dc81bd266c5cd0c26cec8779a34d306377b0ef4c73f36cc30f7bd268ff1566e4c6eef485c7ead903c1eaa3f4ab38d
|
7
|
+
data.tar.gz: 7f788ac693dae917858b26022f04badc8792b0dad4f63fbe213d799ddaeb699f789a2149d0e7ce069cb3fb040cf45a0b2902b7aec229eaa0fdfec954e7b7f49c
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,13 +1,20 @@
|
|
1
|
-
Rack::
|
2
|
-
|
1
|
+
Rack::Affiliates
|
2
|
+
================
|
3
3
|
|
4
|
-
Rack::Affiliates is a rack middleware that extracts information about the referrals came from an
|
4
|
+
Rack::Affiliates is a rack middleware that extracts information about the referrals came from an affiliated site. Specifically, it looks up for specific parameter (<code>ref</code> by default) in the request. If found, it persists affiliate tag, referring url and time in a cookie for later use.
|
5
5
|
|
6
|
-
|
7
|
-
|
6
|
+
Common Scenario
|
7
|
+
---------------
|
8
8
|
|
9
9
|
Affiliate links tracking is very common task if you want to promote your online business. This middleware helps you to do that.
|
10
10
|
|
11
|
+
1. You associate an affiliate tag (for eg. <code>ABC123</code>) with your partner.
|
12
|
+
2. The affiliate promotes your business at http://partner.org by linking to your site with like <code>http://yoursite.org?ref=ABC123</code>.
|
13
|
+
3. A user clicks through the link and lands on your site.
|
14
|
+
4. Rack::Affiliates middleware finds <code>ref</code> parameter in the request, extracts affiliate tag and saves it in a cookie
|
15
|
+
5. User signs up (now or later) and you mark it as a referral from your partner
|
16
|
+
6. PROFIT!
|
17
|
+
|
11
18
|
Installation
|
12
19
|
------------
|
13
20
|
|
@@ -35,14 +42,14 @@ Add the middleware to your application stack:
|
|
35
42
|
...
|
36
43
|
end
|
37
44
|
|
38
|
-
Now you can check any request to see who came to your site via an affiliated link and use this information in your application.
|
45
|
+
Now you can check any request to see who came to your site via an affiliated link and use this information in your application. Affiliate tag is saved in the cookie and will come into play if user returns to your site later.
|
39
46
|
|
40
47
|
class ExampleController < ApplicationController
|
41
48
|
def index
|
42
|
-
str = if request.env['affiliate.tag] && affiliate = User.find_by_affiliate_tag(request.env['affiliate.tag'])
|
43
|
-
"
|
49
|
+
str = if request.env['affiliate.tag'] && affiliate = User.find_by_affiliate_tag(request.env['affiliate.tag'])
|
50
|
+
"Halo, referral! You've been referred here by #{affiliate.name} from #{request.env['affiliate.from']} @ #{Time.at(env['affiliate.time'])}"
|
44
51
|
else
|
45
|
-
"We're
|
52
|
+
"We're glad you found us on your own!"
|
46
53
|
end
|
47
54
|
|
48
55
|
render :text => str
|
@@ -53,24 +60,40 @@ Now you can check any request to see who came to your site via an affiliated lin
|
|
53
60
|
Customization
|
54
61
|
-------------
|
55
62
|
|
56
|
-
You can customize
|
57
|
-
|
63
|
+
You can customize parameter name by providing <code>:param</code> option (default is <code>ref</code>).
|
64
|
+
By default cookie is set for 30 days, you can extend time to live with <code>:ttl</code> option (default is 30 days).
|
58
65
|
|
59
|
-
#Rails 3 in config/application.rb
|
66
|
+
#Rails 3/4 in config/application.rb
|
60
67
|
class Application < Rails::Application
|
61
68
|
...
|
62
|
-
config.middleware.use Rack::Affiliates
|
69
|
+
config.middleware.use Rack::Affiliates, {:param => 'aff_id', :ttl => 3.months}
|
63
70
|
...
|
64
71
|
end
|
65
72
|
|
66
73
|
The <code>:domain</code> option allows to customize cookie domain.
|
67
74
|
|
75
|
+
#Rails 3/4 in config/application.rb
|
68
76
|
class Application < Rails::Application
|
69
77
|
...
|
70
|
-
config.middleware.use Rack::Affiliates
|
78
|
+
config.middleware.use Rack::Affiliates, :domain => '.example.org'
|
71
79
|
...
|
72
80
|
end
|
73
81
|
|
74
|
-
|
82
|
+
The <code>:path</code> option allows to hardcode the cookie path allowing you to record affiliate links at any URL on your site.
|
83
|
+
|
84
|
+
#Rails 3/4 in config/application.rb
|
85
|
+
class Application < Rails::Application
|
86
|
+
...
|
87
|
+
config.middleware.use Rack::Affiliates, { :path => '/' }
|
88
|
+
...
|
89
|
+
end
|
90
|
+
|
91
|
+
Middleware will set cookie on <code>.example.org</code> so it's accessible on <code>www.example.org</code>, <code>app.example.org</code> etc.
|
92
|
+
|
93
|
+
The <code>:overwrite</code> option allows to set whether to overwrite the existing affiliate tag previously stored in cookies. By default it is set to `true`.
|
94
|
+
|
95
|
+
Credits
|
96
|
+
=======
|
75
97
|
|
98
|
+
Thanks goes to Rack::Referrals (https://github.com/deviantech/rack-referrals) for the inspiration.
|
76
99
|
|
data/Rakefile
CHANGED
@@ -31,12 +31,4 @@ Rake::TestTask.new(:spec) do |test|
|
|
31
31
|
test.verbose = true
|
32
32
|
end
|
33
33
|
|
34
|
-
require 'rcov/rcovtask'
|
35
|
-
Rcov::RcovTask.new do |test|
|
36
|
-
test.libs << 'spec'
|
37
|
-
test.pattern = 'spec/**/*_spec.rb'
|
38
|
-
test.verbose = true
|
39
|
-
test.rcov_opts << '--exclude "gems/*"'
|
40
|
-
end
|
41
|
-
|
42
34
|
task :default => :spec
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.3.0
|
data/lib/rack-affiliates.rb
CHANGED
@@ -14,6 +14,8 @@ module Rack
|
|
14
14
|
@param = opts[:param] || "ref"
|
15
15
|
@cookie_ttl = opts[:ttl] || 60*60*24*30 # 30 days
|
16
16
|
@cookie_domain = opts[:domain] || nil
|
17
|
+
@allow_overwrite = opts[:overwrite].nil? ? true : opts[:overwrite]
|
18
|
+
@cookie_path = opts[:path] || nil
|
17
19
|
end
|
18
20
|
|
19
21
|
def call(env)
|
@@ -27,7 +29,13 @@ module Rack
|
|
27
29
|
end
|
28
30
|
|
29
31
|
if params_tag && params_tag != cookie_tag
|
30
|
-
tag
|
32
|
+
if tag
|
33
|
+
if @allow_overwrite
|
34
|
+
tag, from, time = params_info(req)
|
35
|
+
end
|
36
|
+
else
|
37
|
+
tag, from, time = params_info(req)
|
38
|
+
end
|
31
39
|
end
|
32
40
|
|
33
41
|
if tag
|
@@ -38,13 +46,11 @@ module Rack
|
|
38
46
|
|
39
47
|
status, headers, body = @app.call(env)
|
40
48
|
|
41
|
-
response = Rack::Response.new body, status, headers
|
42
|
-
|
43
49
|
if tag != cookie_tag
|
44
|
-
bake_cookies(
|
50
|
+
bake_cookies(headers, tag, from, time)
|
45
51
|
end
|
46
52
|
|
47
|
-
|
53
|
+
[status, headers, body]
|
48
54
|
end
|
49
55
|
|
50
56
|
def affiliate_info(req)
|
@@ -60,14 +66,15 @@ module Rack
|
|
60
66
|
end
|
61
67
|
|
62
68
|
protected
|
63
|
-
def bake_cookies(
|
69
|
+
def bake_cookies(headers, tag, from, time)
|
64
70
|
expires = Time.now + @cookie_ttl
|
65
71
|
{ COOKIE_TAG => tag,
|
66
72
|
COOKIE_FROM => from,
|
67
73
|
COOKIE_TIME => time }.each do |key, value|
|
68
74
|
cookie_hash = {:value => value, :expires => expires}
|
69
75
|
cookie_hash[:domain] = @cookie_domain if @cookie_domain
|
70
|
-
|
76
|
+
cookie_hash[:path] = @cookie_path if @cookie_path
|
77
|
+
Rack::Utils.set_cookie_header!(headers, key, cookie_hash)
|
71
78
|
end
|
72
79
|
end
|
73
80
|
end
|
data/rack-affiliates.gemspec
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "rack-affiliates"
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.3.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Alex Levin"]
|
@@ -41,7 +41,7 @@ Gem::Specification.new do |s|
|
|
41
41
|
s.add_runtime_dependency(%q<rack>, [">= 0"])
|
42
42
|
s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
|
43
43
|
s.add_development_dependency(%q<jeweler>, ["~> 1.6.4"])
|
44
|
-
s.add_development_dependency(%q<
|
44
|
+
s.add_development_dependency(%q<simplecov>, [">= 0"])
|
45
45
|
s.add_development_dependency(%q<rack-test>, [">= 0"])
|
46
46
|
s.add_development_dependency(%q<minitest>, [">= 0"])
|
47
47
|
s.add_development_dependency(%q<timecop>, [">= 0"])
|
@@ -49,7 +49,7 @@ Gem::Specification.new do |s|
|
|
49
49
|
s.add_dependency(%q<rack>, [">= 0"])
|
50
50
|
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
51
51
|
s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
|
52
|
-
s.add_dependency(%q<
|
52
|
+
s.add_dependency(%q<simplecov>, [">= 0"])
|
53
53
|
s.add_dependency(%q<rack-test>, [">= 0"])
|
54
54
|
s.add_dependency(%q<minitest>, [">= 0"])
|
55
55
|
s.add_dependency(%q<timecop>, [">= 0"])
|
@@ -58,7 +58,7 @@ Gem::Specification.new do |s|
|
|
58
58
|
s.add_dependency(%q<rack>, [">= 0"])
|
59
59
|
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
60
60
|
s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
|
61
|
-
s.add_dependency(%q<
|
61
|
+
s.add_dependency(%q<simplecov>, [">= 0"])
|
62
62
|
s.add_dependency(%q<rack-test>, [">= 0"])
|
63
63
|
s.add_dependency(%q<minitest>, [">= 0"])
|
64
64
|
s.add_dependency(%q<timecop>, [">= 0"])
|
data/spec/helper.rb
CHANGED
metadata
CHANGED
@@ -1,135 +1,123 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: rack-affiliates
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 2
|
9
|
-
- 0
|
10
|
-
version: 0.2.0
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.3.0
|
11
5
|
platform: ruby
|
12
|
-
authors:
|
6
|
+
authors:
|
13
7
|
- Alex Levin
|
14
8
|
autorequire:
|
15
9
|
bindir: bin
|
16
10
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
- !ruby/object:Gem::Dependency
|
21
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
22
|
-
none: false
|
23
|
-
requirements:
|
24
|
-
- - ">="
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
hash: 3
|
27
|
-
segments:
|
28
|
-
- 0
|
29
|
-
version: "0"
|
30
|
-
version_requirements: *id001
|
11
|
+
date: 2011-12-20 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
31
14
|
name: rack
|
32
|
-
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
33
20
|
type: :runtime
|
34
|
-
- !ruby/object:Gem::Dependency
|
35
|
-
requirement: &id002 !ruby/object:Gem::Requirement
|
36
|
-
none: false
|
37
|
-
requirements:
|
38
|
-
- - ~>
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
hash: 23
|
41
|
-
segments:
|
42
|
-
- 1
|
43
|
-
- 0
|
44
|
-
- 0
|
45
|
-
version: 1.0.0
|
46
|
-
version_requirements: *id002
|
47
|
-
name: bundler
|
48
21
|
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: bundler
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 1.0.0
|
49
34
|
type: :development
|
50
|
-
- !ruby/object:Gem::Dependency
|
51
|
-
requirement: &id003 !ruby/object:Gem::Requirement
|
52
|
-
none: false
|
53
|
-
requirements:
|
54
|
-
- - ~>
|
55
|
-
- !ruby/object:Gem::Version
|
56
|
-
hash: 7
|
57
|
-
segments:
|
58
|
-
- 1
|
59
|
-
- 6
|
60
|
-
- 4
|
61
|
-
version: 1.6.4
|
62
|
-
version_requirements: *id003
|
63
|
-
name: jeweler
|
64
35
|
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 1.0.0
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: jeweler
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 1.6.4
|
65
48
|
type: :development
|
66
|
-
- !ruby/object:Gem::Dependency
|
67
|
-
requirement: &id004 !ruby/object:Gem::Requirement
|
68
|
-
none: false
|
69
|
-
requirements:
|
70
|
-
- - ">="
|
71
|
-
- !ruby/object:Gem::Version
|
72
|
-
hash: 3
|
73
|
-
segments:
|
74
|
-
- 0
|
75
|
-
version: "0"
|
76
|
-
version_requirements: *id004
|
77
|
-
name: rcov
|
78
49
|
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 1.6.4
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: simplecov
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
79
62
|
type: :development
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
requirements:
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
84
66
|
- - ">="
|
85
|
-
- !ruby/object:Gem::Version
|
86
|
-
|
87
|
-
|
88
|
-
- 0
|
89
|
-
version: "0"
|
90
|
-
version_requirements: *id005
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
91
70
|
name: rack-test
|
92
|
-
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
93
76
|
type: :development
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
requirements:
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
98
80
|
- - ">="
|
99
|
-
- !ruby/object:Gem::Version
|
100
|
-
|
101
|
-
|
102
|
-
- 0
|
103
|
-
version: "0"
|
104
|
-
version_requirements: *id006
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
105
84
|
name: minitest
|
106
|
-
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
107
90
|
type: :development
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
requirements:
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
112
94
|
- - ">="
|
113
|
-
- !ruby/object:Gem::Version
|
114
|
-
|
115
|
-
|
116
|
-
- 0
|
117
|
-
version: "0"
|
118
|
-
version_requirements: *id007
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
119
98
|
name: timecop
|
120
|
-
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
121
104
|
type: :development
|
122
|
-
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
description: If the user clicked through from an affiliated site, this middleware
|
112
|
+
will track affiliate tag, referring url and time.
|
123
113
|
email: experiment17@gmail.com
|
124
114
|
executables: []
|
125
|
-
|
126
115
|
extensions: []
|
127
|
-
|
128
|
-
extra_rdoc_files:
|
116
|
+
extra_rdoc_files:
|
129
117
|
- LICENSE.txt
|
130
118
|
- README.md
|
131
|
-
files:
|
132
|
-
- .document
|
119
|
+
files:
|
120
|
+
- ".document"
|
133
121
|
- Gemfile
|
134
122
|
- LICENSE.txt
|
135
123
|
- README.md
|
@@ -140,37 +128,27 @@ files:
|
|
140
128
|
- spec/helper.rb
|
141
129
|
- spec/rack_affiliates_spec.rb
|
142
130
|
homepage: http://github.com/alexlevin/rack-affiliates
|
143
|
-
licenses:
|
131
|
+
licenses:
|
144
132
|
- MIT
|
133
|
+
metadata: {}
|
145
134
|
post_install_message:
|
146
135
|
rdoc_options: []
|
147
|
-
|
148
|
-
require_paths:
|
136
|
+
require_paths:
|
149
137
|
- lib
|
150
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
151
|
-
|
152
|
-
requirements:
|
138
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
139
|
+
requirements:
|
153
140
|
- - ">="
|
154
|
-
- !ruby/object:Gem::Version
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
version: "0"
|
159
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
160
|
-
none: false
|
161
|
-
requirements:
|
141
|
+
- !ruby/object:Gem::Version
|
142
|
+
version: '0'
|
143
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
144
|
+
requirements:
|
162
145
|
- - ">="
|
163
|
-
- !ruby/object:Gem::Version
|
164
|
-
|
165
|
-
segments:
|
166
|
-
- 0
|
167
|
-
version: "0"
|
146
|
+
- !ruby/object:Gem::Version
|
147
|
+
version: '0'
|
168
148
|
requirements: []
|
169
|
-
|
170
149
|
rubyforge_project:
|
171
|
-
rubygems_version:
|
150
|
+
rubygems_version: 2.2.2
|
172
151
|
signing_key:
|
173
152
|
specification_version: 3
|
174
153
|
summary: Tracks referrals came via an affiliated links.
|
175
154
|
test_files: []
|
176
|
-
|