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 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
@@ -2,9 +2,9 @@ source "http://rubygems.org"
2
2
  gem 'rack'
3
3
 
4
4
  group :development do
5
- gem "bundler", "~> 1.0.0"
5
+ gem "bundler", "~> 1.6"
6
6
  gem "jeweler", "~> 1.6.4"
7
- gem "rcov", ">= 0"
7
+ gem "simplecov"
8
8
  gem "rack-test"
9
9
  gem "minitest"
10
10
  gem "timecop"
data/README.md CHANGED
@@ -1,13 +1,20 @@
1
- Rack::Referrals
2
- =============
1
+ Rack::Affiliates
2
+ ================
3
3
 
4
- Rack::Affiliates is a rack middleware that extracts information about the referrals came from an an affiliated site. Specifically, it looks up for parameter (eg. <code>ref</code> by default) in the request. If found it persists referal tag, referring url and time in a cookie for later use.
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
- Purpose
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. Moreover, referrer_id is saved in the cookie and will come into play if user returns to your site later.
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
- "Howdy, referral! You've been referred here by #{affiliate.name} and from #{request.env['affiliate.from']} @ #{Time.at(env['affiliate.time'])}"
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 so glad you found us on your own!"
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 default parameter name <code>ref</code> by providing <code>:param</code> option.
57
- If you want to save your affiliate id for later use, you can specify time to live with <code>:ttl</code> option (default is 30 days).
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.new :param => 'aff_id', :ttl => 3.months
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.new :domain => '.example.org'
78
+ config.middleware.use Rack::Affiliates, :domain => '.example.org'
71
79
  ...
72
80
  end
73
81
 
74
- Middleware will set cookie on '.example.org' domain so it's accessible on 'www.example.org', 'app.example.org' etc.
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.2.0
1
+ 0.3.0
@@ -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, from, time = params_info(req)
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(response, tag, from, time)
50
+ bake_cookies(headers, tag, from, time)
45
51
  end
46
52
 
47
- response.finish
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(res, tag, from, time)
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
- res.set_cookie(key, cookie_hash)
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
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "rack-affiliates"
8
- s.version = "0.2.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<rcov>, [">= 0"])
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<rcov>, [">= 0"])
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<rcov>, [">= 0"])
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
@@ -9,6 +9,9 @@ rescue Bundler::BundlerError => e
9
9
  exit e.status_code
10
10
  end
11
11
 
12
+ require "simplecov"
13
+ SimpleCov.start
14
+
12
15
  require "minitest/spec"
13
16
  require "minitest/autorun"
14
17
  require "rack/test"
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
- hash: 23
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
- date: 2011-12-20 00:00:00 Z
19
- dependencies:
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
- prerelease: false
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
- - !ruby/object:Gem::Dependency
81
- requirement: &id005 !ruby/object:Gem::Requirement
82
- none: false
83
- requirements:
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
84
66
  - - ">="
85
- - !ruby/object:Gem::Version
86
- hash: 3
87
- segments:
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
- prerelease: false
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
93
76
  type: :development
94
- - !ruby/object:Gem::Dependency
95
- requirement: &id006 !ruby/object:Gem::Requirement
96
- none: false
97
- requirements:
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
98
80
  - - ">="
99
- - !ruby/object:Gem::Version
100
- hash: 3
101
- segments:
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
- prerelease: false
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
107
90
  type: :development
108
- - !ruby/object:Gem::Dependency
109
- requirement: &id007 !ruby/object:Gem::Requirement
110
- none: false
111
- requirements:
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
112
94
  - - ">="
113
- - !ruby/object:Gem::Version
114
- hash: 3
115
- segments:
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
- prerelease: false
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
121
104
  type: :development
122
- description: If the user clicked through from an affiliated site, this middleware will track affiliate tag, referring url and time.
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
- none: false
152
- requirements:
138
+ required_ruby_version: !ruby/object:Gem::Requirement
139
+ requirements:
153
140
  - - ">="
154
- - !ruby/object:Gem::Version
155
- hash: 3
156
- segments:
157
- - 0
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
- hash: 3
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: 1.8.10
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
-