visitor_sources 0.0.0 → 0.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.
data/README.md CHANGED
@@ -9,3 +9,8 @@ Track where a visitor has come from and kep a record of each visit in the cookie
9
9
 
10
10
  # requires the use of Rack::Session::Cookie 
11
11
 
12
+ TODO
13
+ ----
14
+ - Allow clearing of all the users history (if they purchase for example)
15
+ - If user clicks an add twice it only shows up once
16
+
data/RakeFile ADDED
@@ -0,0 +1,53 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+
4
+ begin
5
+ require 'jeweler'
6
+ Jeweler::Tasks.new do |gem|
7
+ gem.name = "visitor_sources"
8
+ gem.summary = "Use a cookie to record the sources that each visitor came to your site"
9
+ gem.description = "Use a cookie to record the sources that each visitor came to your site"
10
+ gem.email = "mail@matthewfawcett.co.uk"
11
+ gem.homepage = "http://github.com/mattfawcett/visitor_sources"
12
+ gem.authors = ["Matt Fawcett"]
13
+ gem.add_development_dependency "thoughtbot-shoulda", ">= 0"
14
+ # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
15
+ end
16
+ Jeweler::GemcutterTasks.new
17
+ rescue LoadError
18
+ puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
19
+ end
20
+
21
+ require 'rake/testtask'
22
+ Rake::TestTask.new(:test) do |test|
23
+ test.libs << 'lib' << 'test'
24
+ test.pattern = 'test/**/test_*.rb'
25
+ test.verbose = true
26
+ end
27
+
28
+ begin
29
+ require 'rcov/rcovtask'
30
+ Rcov::RcovTask.new do |test|
31
+ test.libs << 'test'
32
+ test.pattern = 'test/**/test_*.rb'
33
+ test.verbose = true
34
+ end
35
+ rescue LoadError
36
+ task :rcov do
37
+ abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
38
+ end
39
+ end
40
+
41
+ task :test => :check_dependencies
42
+
43
+ task :default => :test
44
+
45
+ require 'rake/rdoctask'
46
+ Rake::RDocTask.new do |rdoc|
47
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
48
+
49
+ rdoc.rdoc_dir = 'rdoc'
50
+ rdoc.title = "visitor_sources #{version}"
51
+ rdoc.rdoc_files.include('README*')
52
+ rdoc.rdoc_files.include('lib/**/*.rb')
53
+ end
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.0
1
+ 0.0.1
@@ -14,7 +14,8 @@
14
14
 
15
15
  require "uri"
16
16
  class TrafficSource
17
- attr_accessor :encoder_version, :unix_timestamp, :medium, :term, :source, :campaign, :content, :custom_parameter_mapping, :env
17
+ attr_accessor :encoder_version, :unix_timestamp, :medium, :term, :source, :campaign, :content,
18
+ :custom_parameter_mapping, :env
18
19
 
19
20
  COOKIE_LINE_PARAMETERS = ['encoder_version', 'unix_timestamp', 'medium', 'term', 'source', 'campaign', 'content']
20
21
  STANDARD_PARAMETER_MAPPING = {:medium => :utm_medium, :term => :utm_term, :source => :utm_source, :campaign => :utm_campaign, :content => :utm_content}
@@ -25,13 +26,13 @@ class TrafficSource
25
26
  end
26
27
  end
27
28
 
28
- def self.updated_rack_environment(old_env, custom_parameter_mapping = {})
29
+ def self.updated_rack_environment(old_env, custom_parameter_mapping = {}, ignore_duplicate_source_within=120)
29
30
  old_env["rack.session"][:traffic_sources] ||= ''
30
31
  traffic_sources = TrafficSources.new(old_env["rack.session"][:traffic_sources])
31
32
  latest_source = TrafficSource.initialize_with_rack_env(old_env, custom_parameter_mapping)
32
33
  return old_env if latest_source.to_s.nil?
33
34
  if traffic_sources.length > 0
34
- return old_env if latest_source.same_as?(traffic_sources.last)
35
+ return old_env if latest_source.same_as?(traffic_sources.last) && latest_source.unix_timestamp-traffic_sources.last.unix_timestamp < ignore_duplicate_source_within
35
36
  end
36
37
  traffic_sources << latest_source
37
38
  old_env["rack.session"][:traffic_sources] = traffic_sources.to_s
@@ -40,7 +41,7 @@ class TrafficSource
40
41
 
41
42
  def TrafficSource.initialize_with_rack_env(env, custom_parameter_mapping = {})
42
43
  traffic_source = self.new(:env => env, :custom_parameter_mapping => custom_parameter_mapping,
43
- :unix_timestamp => Time.now.to_i, :encoder_version => 1)
44
+ :unix_timestamp => Time.now.to_i, :encoder_version => 1)
44
45
 
45
46
  COOKIE_LINE_PARAMETERS.last(5).each do |attribute|
46
47
  traffic_source.send("#{attribute}=", traffic_source.query_string_value_for(attribute.to_sym))
@@ -6,6 +6,7 @@ class TrafficSourceMiddleware
6
6
 
7
7
  def call(env)
8
8
  @options[:custom_parameter_mapping] ||= {}
9
+ @options[:ignore_duplicate_source_within] ||= 120 #2 mins
9
10
  env["rack.request.query_hash"] = Rack::Utils.parse_query(env["QUERY_STRING"])
10
11
  env = TrafficSource.updated_rack_environment(env, @options[:custom_parameter_mapping])
11
12
  env[:traffic_sources] = TrafficSources.new(env["rack.session"][:traffic_sources])
Binary file
data/test/app.rb CHANGED
@@ -3,7 +3,7 @@ require 'sinatra'
3
3
  require File.expand_path(File.dirname(__FILE__) + '/../lib/visitor_sources')
4
4
 
5
5
  use Rack::Session::Cookie
6
- use TrafficSourceMiddleware, :custom_parameter_mapping => {:campaign => :campaign}
6
+ use TrafficSourceMiddleware, :custom_parameter_mapping => {:campaign => :campaign, :ignore_duplicate_source_within => 120}
7
7
 
8
8
 
9
9
 
data/test/test_helper.rb CHANGED
@@ -2,6 +2,7 @@ require 'rubygems'
2
2
  require 'test/unit'
3
3
  require 'rack/test'
4
4
  require 'shoulda'
5
+ require 'delorean'
5
6
  require 'base64'
6
7
  require File.expand_path(File.dirname(__FILE__) + '/app')
7
8
 
@@ -11,8 +11,8 @@ class TrafficSourceTest < Test::Unit::TestCase
11
11
  @rack_env = EXAMPLE_RACK_ENV.dup
12
12
  @custom_variable_matches = {:campaign => :custom_campaign, :term => :custom_keywords, :medium => :custom_medium}
13
13
  end
14
- context "initialize_with_rack_env" do
15
-
14
+
15
+ context "initialize_with_rack_env" do
16
16
  context "when there are custom variables in the url present" do
17
17
  should "use the custom variables to set the correct TrafficSource" do
18
18
  @rack_env["rack.request.query_hash"] = {"custom_campaign" => "MyCamp1", "custom_keywords" => "Product One", "gclid" => "AutoAdwordsTaggingClid"}
@@ -136,6 +136,9 @@ class TrafficSourceTest < Test::Unit::TestCase
136
136
  end
137
137
 
138
138
  context "updated_rack_environment" do
139
+ setup do
140
+ @rack_env["rack.session"][:traffic_sources] = ''
141
+ end
139
142
 
140
143
  should "not update the enviroment if the current TrafficSource#to_s is nil" do
141
144
  @rack_env["HTTP_REFERER"] = "http://localhost:9393/some/path"
@@ -143,13 +146,27 @@ class TrafficSourceTest < Test::Unit::TestCase
143
146
  assert_equal "", rack_env["rack.session"][:traffic_sources]
144
147
  end
145
148
 
146
- should "not update the enviroment if the last TrafficSource#to_s is the same as the current traffic source" do
149
+ should "not update the enviroment if the last TrafficSource#to_s is the same as the current traffic source and the last one was recent" do
147
150
  @rack_env["HTTP_REFERER"] = nil
151
+ timestamp_of_first_request = Time.now.to_i - 60
152
+ Delorean.time_travel_to("1 minute ago") do
153
+ rack_env = TrafficSource.updated_rack_environment(@rack_env)
154
+ assert_equal "1|#{timestamp_of_first_request}|direct", rack_env["rack.session"][:traffic_sources]
155
+ end
148
156
  rack_env = TrafficSource.updated_rack_environment(@rack_env)
149
- assert_equal "1|#{Time.now.to_i}|direct", rack_env["rack.session"][:traffic_sources]
150
-
157
+ assert_equal "1|#{timestamp_of_first_request}|direct", rack_env["rack.session"][:traffic_sources]
158
+ end
159
+
160
+ should "update the enviroment if the last TrafficSource#to_s is the same as the current traffic source but the last source was a while ago" do
161
+ @rack_env = EXAMPLE_RACK_ENV.dup
162
+ @rack_env["HTTP_REFERER"] = nil
163
+ timestamp_of_first_request = Time.now.to_i - 180
164
+ Delorean.time_travel_to("3 minute ago") do
165
+ rack_env = TrafficSource.updated_rack_environment(@rack_env)
166
+ assert_equal "1|#{timestamp_of_first_request}|direct", rack_env["rack.session"][:traffic_sources]
167
+ end
151
168
  rack_env = TrafficSource.updated_rack_environment(@rack_env)
152
- assert_equal "1|#{Time.now.to_i}|direct", rack_env["rack.session"][:traffic_sources]
169
+ assert_equal "1|#{timestamp_of_first_request}|direct,1|#{Time.now.to_i}|direct", rack_env["rack.session"][:traffic_sources]
153
170
  end
154
171
 
155
172
  should "update the traffic source if the current one is differenty from the last one" do
@@ -164,51 +181,48 @@ class TrafficSourceTest < Test::Unit::TestCase
164
181
  end
165
182
  end
166
183
 
167
- end
168
184
 
169
185
 
170
186
 
171
- context "same_as?" do
172
- setup do
173
- @source_1 = TrafficSource.new(:encoder_version => 1, :unix_timestamp => Time.now.to_i, :medium => 'cpc',
174
- :term => 'myterm', :source => 'google', :campaign => 'mycamp')
175
- @source_2 = @source_1.dup
176
- end
187
+ context "same_as?" do
188
+ setup do
189
+ @source_1 = TrafficSource.new(:encoder_version => 1, :unix_timestamp => Time.now.to_i, :medium => 'cpc',
190
+ :term => 'myterm', :source => 'google', :campaign => 'mycamp')
191
+ @source_2 = @source_1.dup
192
+ end
177
193
 
178
- should "be true if all the main fields are the same" do
179
- assert @source_1.same_as?(@source_2)
180
- @source_2.encoder_version = 2
181
- @source_2.unix_timestamp = 1234
182
- assert @source_1.same_as?(@source_2)
183
- end
194
+ should "be true if all the main fields are the same" do
195
+ assert @source_1.same_as?(@source_2)
196
+ @source_2.encoder_version = 2
197
+ @source_2.unix_timestamp = 1234
198
+ assert @source_1.same_as?(@source_2)
199
+ end
184
200
 
185
- should "be false if one of the fields are different" do
186
- @source_2.medium = "direct"
187
- assert !@source_1.same_as?(@source_2)
201
+ should "be false if one of the fields are different" do
202
+ @source_2.medium = "direct"
203
+ assert !@source_1.same_as?(@source_2)
204
+ end
188
205
  end
189
- end
190
206
 
191
- context "initialize_from_string" do
192
- should "create a new TrafficSource using the correct parameters from the string" do
193
- string = "1|123456|organic|mysearchterms|google"
194
- source = TrafficSource.initialize_from_string(string)
195
- assert_equal 1, source.encoder_version
196
- assert_equal 123456, source.unix_timestamp
197
- assert_equal "organic", source.medium
198
- assert_equal "mysearchterms", source.term
199
- assert_equal "google", source.source
200
- assert_nil source.campaign
201
- assert_nil source.content
207
+ context "initialize_from_string" do
208
+ should "create a new TrafficSource using the correct parameters from the string" do
209
+ string = "1|123456|organic|mysearchterms|google"
210
+ source = TrafficSource.initialize_from_string(string)
211
+ assert_equal 1, source.encoder_version
212
+ assert_equal 123456, source.unix_timestamp
213
+ assert_equal "organic", source.medium
214
+ assert_equal "mysearchterms", source.term
215
+ assert_equal "google", source.source
216
+ assert_nil source.campaign
217
+ assert_nil source.content
218
+ end
202
219
  end
203
- end
204
220
 
205
- context "date" do
206
- should "return a date object using the timestamp" do
207
- @source = TrafficSource.new(:unix_timestamp => 1267804832)
208
- assert_equal Time.at(1267804832), @source.date
221
+ context "date" do
222
+ should "return a date object using the timestamp" do
223
+ @source = TrafficSource.new(:unix_timestamp => 1267804832)
224
+ assert_equal Time.at(1267804832), @source.date
225
+ end
209
226
  end
210
- end
211
-
212
-
213
-
227
+ end
214
228
  end
@@ -0,0 +1,63 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in RakeFile, and run the gemspec command
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{visitor_sources}
8
+ s.version = "0.0.1"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Matt Fawcett"]
12
+ s.date = %q{2010-03-08}
13
+ s.description = %q{Use a cookie to record the sources that each visitor came to your site}
14
+ s.email = %q{mail@matthewfawcett.co.uk}
15
+ s.extra_rdoc_files = [
16
+ "README.md"
17
+ ]
18
+ s.files = [
19
+ "README.md",
20
+ "RakeFile",
21
+ "VERSION",
22
+ "lib/visitor_sources.rb",
23
+ "lib/visitor_sources/search_engine.rb",
24
+ "lib/visitor_sources/traffic_source.rb",
25
+ "lib/visitor_sources/traffic_source_middleware.rb",
26
+ "lib/visitor_sources/traffic_sources.rb",
27
+ "pkg/visitor_sources-0.0.0.gem",
28
+ "test/app.rb",
29
+ "test/search_engine_test.rb",
30
+ "test/test_helper.rb",
31
+ "test/traffic_source_middleware_test.rb",
32
+ "test/traffic_source_test.rb",
33
+ "test/traffic_sources_test.rb",
34
+ "visitor_sources.gemspec"
35
+ ]
36
+ s.homepage = %q{http://github.com/mattfawcett/visitor_sources}
37
+ s.rdoc_options = ["--charset=UTF-8"]
38
+ s.require_paths = ["lib"]
39
+ s.rubygems_version = %q{1.3.5}
40
+ s.summary = %q{Use a cookie to record the sources that each visitor came to your site}
41
+ s.test_files = [
42
+ "test/app.rb",
43
+ "test/search_engine_test.rb",
44
+ "test/test_helper.rb",
45
+ "test/traffic_source_middleware_test.rb",
46
+ "test/traffic_source_test.rb",
47
+ "test/traffic_sources_test.rb"
48
+ ]
49
+
50
+ if s.respond_to? :specification_version then
51
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
52
+ s.specification_version = 3
53
+
54
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
55
+ s.add_development_dependency(%q<thoughtbot-shoulda>, [">= 0"])
56
+ else
57
+ s.add_dependency(%q<thoughtbot-shoulda>, [">= 0"])
58
+ end
59
+ else
60
+ s.add_dependency(%q<thoughtbot-shoulda>, [">= 0"])
61
+ end
62
+ end
63
+
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: visitor_sources
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.0
4
+ version: 0.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matt Fawcett
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2010-03-05 00:00:00 +00:00
12
+ date: 2010-03-08 00:00:00 +00:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -32,18 +32,21 @@ extra_rdoc_files:
32
32
  - README.md
33
33
  files:
34
34
  - README.md
35
+ - RakeFile
35
36
  - VERSION
36
37
  - lib/visitor_sources.rb
37
38
  - lib/visitor_sources/search_engine.rb
38
39
  - lib/visitor_sources/traffic_source.rb
39
40
  - lib/visitor_sources/traffic_source_middleware.rb
40
41
  - lib/visitor_sources/traffic_sources.rb
42
+ - pkg/visitor_sources-0.0.0.gem
41
43
  - test/app.rb
42
44
  - test/search_engine_test.rb
43
45
  - test/test_helper.rb
44
46
  - test/traffic_source_middleware_test.rb
45
47
  - test/traffic_source_test.rb
46
48
  - test/traffic_sources_test.rb
49
+ - visitor_sources.gemspec
47
50
  has_rdoc: true
48
51
  homepage: http://github.com/mattfawcett/visitor_sources
49
52
  licenses: []