re_track 0.1.0

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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 17258306272edcd9f384aaab7c92a8211708f802
4
+ data.tar.gz: 147f192b1545431a897e379d0ae13a0280a9edea
5
+ SHA512:
6
+ metadata.gz: f65b3b7dce2ef33846a21582af79001076e7b45bd9de926e3dc0071ab7f4ea2451acea272823844abc05d14e805e74332686133457578dd942b05253d7c2bec5
7
+ data.tar.gz: 84f764231ebb6d4ba7121bcc16fa1623a3c5ff253c09786e959ca8022f755b87d5306d9c57b39e937b2fda5fedd2119402a1790df48b73f3d8b2adbf4fdb3af9
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright 2013 YOURNAME
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,66 @@
1
+ # ReTrack
2
+
3
+ [![Build Status](https://travis-ci.org/gewo/re_track.png)](https://travis-ci.org/gewo/re_track/)
4
+
5
+ Track HTTP-Referrers in Rails using Mongoid.
6
+
7
+ ## Installation
8
+
9
+ Add this line to your application's Gemfile:
10
+
11
+ gem 're_track'
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install re_track
20
+
21
+ ## Usage
22
+
23
+ ApplicationController
24
+ # saves referer information to the session
25
+ include ReTrack::Tracker
26
+ end
27
+
28
+ OtherController
29
+ # put in the controllers which create the model you want to track
30
+ cache_sweeper ReTrack::Sweeper
31
+ end
32
+
33
+ MyModel
34
+ # include in every model that should get tracking information added
35
+ include ReTrack::Trackable
36
+ end
37
+
38
+ When your `OtherController` creates `MyModel` a
39
+ `ReTrack::RefererTracking` is created as well, access it like this:
40
+
41
+ my_model.referer_tracking
42
+ ReTrack::RefererTracking.all.distinct(:first_url)
43
+
44
+ ## TODO
45
+
46
+ ### Get rid of `ActionController::Caching::Sweeper`!
47
+
48
+ * right now ActiveRecord *and* Mongoid are required in your Rails app
49
+ * it works although Mongoid models are observed by `ActiveRecord::Observer`s...
50
+
51
+ ## Contributing
52
+
53
+ 1. Fork it
54
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
55
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
56
+ 4. Push to the branch (`git push origin my-new-feature`)
57
+ 5. Create new Pull Request
58
+
59
+ ## Credit
60
+
61
+ [re_track](http://github.com/gewo/re_track/) is inspired (read: stolen)
62
+ by [referer_tracking](http://github.com/holli/referer_tracking). Thanks.
63
+
64
+ ## License
65
+
66
+ This project rocks and uses MIT-LICENSE.
data/Rakefile ADDED
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env rake
2
+ begin
3
+ require 'bundler/setup'
4
+ rescue LoadError
5
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
6
+ end
7
+ begin
8
+ require 'rdoc/task'
9
+ rescue LoadError
10
+ require 'rdoc/rdoc'
11
+ require 'rake/rdoctask'
12
+ RDoc::Task = Rake::RDocTask
13
+ end
14
+
15
+ RDoc::Task.new(:rdoc) do |rdoc|
16
+ rdoc.rdoc_dir = 'rdoc'
17
+ rdoc.title = 'ReTrack'
18
+ rdoc.options << '--line-numbers'
19
+ rdoc.rdoc_files.include('README.rdoc')
20
+ rdoc.rdoc_files.include('lib/**/*.rb')
21
+ end
22
+
23
+ Bundler::GemHelper.install_tasks
24
+
@@ -0,0 +1,44 @@
1
+ module ReTrack
2
+ class RefererTracking
3
+ include ::Mongoid::Document
4
+ include ::Mongoid::Timestamps
5
+
6
+ store_in collection: 'retrack_referer_trackings'
7
+
8
+ belongs_to :trackable, polymorphic: true
9
+
10
+ field :referer_url, type: String
11
+ field :first_url, type: String
12
+ field :user_agent, type: String
13
+ field :first_visited_at, type: DateTime
14
+
15
+ # Extract query parameters from referer_url and first_url.
16
+ #
17
+ # @example
18
+ # r = ReTrack::RefererTracking.new referer_url: 'http://google.de/?q=a'
19
+ # r.query('q') # => 'a'
20
+ # r.query('a') # => nil
21
+ # r.query('q', 'first_url') # => nil
22
+ #
23
+ # @param parameter [String] The Query String Parameter to look up.
24
+ # @param url_field_name [String] The URL field to query. Either
25
+ # 'referer_url' or 'first_url'.
26
+ #
27
+ # @return [String] The value for the given query parameter or nil.
28
+ def query(parameter, url_field_name = 'referer_url')
29
+ return nil unless url = value_for(url_field_name)
30
+ query_hash(url)[parameter.to_s]
31
+ end
32
+
33
+ private
34
+
35
+ def query_hash(url)
36
+ Rack::Utils.parse_query URI.parse(CGI::unescape(url)).query rescue {}
37
+ end
38
+
39
+ def value_for(field)
40
+ return nil unless ['referer_url', 'first_url'].include? field.to_s
41
+ public_send("#{field}")
42
+ end
43
+ end
44
+ end
data/config/routes.rb ADDED
@@ -0,0 +1,2 @@
1
+ ReTrack::Engine.routes.draw do
2
+ end
@@ -0,0 +1,7 @@
1
+ require 'mongoid'
2
+
3
+ module ReTrack
4
+ class Engine < ::Rails::Engine
5
+ isolate_namespace ReTrack
6
+ end
7
+ end
@@ -0,0 +1,17 @@
1
+ class ReTrack::Sweeper < ActionController::Caching::Sweeper
2
+ def after_create(record)
3
+ if session && session['retrack']
4
+ rt = ReTrack::RefererTracking.new
5
+ rt.trackable = record
6
+
7
+ session[:retrack].each_pair do |key, value|
8
+ rt[key] = value if rt.attribute_names.include?(key.to_s)
9
+ end
10
+
11
+ rt.save!
12
+ end
13
+ rescue => e
14
+ Rails.logger.info(
15
+ "ReTrack::Sweeper.after_create error saving record: #{e}")
16
+ end
17
+ end
@@ -0,0 +1,18 @@
1
+ require 'active_support/concern'
2
+
3
+ module ReTrack
4
+ module Trackable
5
+ extend ActiveSupport::Concern
6
+
7
+ included do
8
+ has_one :referer_tracking,
9
+ class_name: 'ReTrack::RefererTracking',
10
+ as: :trackable
11
+
12
+ klass = self
13
+ ReTrack::Sweeper.class_eval do
14
+ observe klass
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,26 @@
1
+ module ReTrack
2
+ module Tracker
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ before_filter :rt_track_referer
7
+ end
8
+
9
+ def rt_track_referer
10
+ if session[:retrack].nil? && !request_from_a_known_bot?
11
+ session[:retrack] = hash = {}
12
+ hash[:referer_url] = request.headers['HTTP_REFERER'].presence || 'none'
13
+ hash[:first_url] = request.url
14
+ hash[:user_agent] = request.env['HTTP_USER_AGENT']
15
+ hash[:first_visited_at] = Time.now
16
+ end
17
+ end
18
+
19
+ def request_from_a_known_bot?
20
+ bot_user_agents = ['GoogleBot', 'Mediapartners-Google', 'msnbot',
21
+ 'TwengaBot', 'DigExt; DTS Agent', 'YandexImages']
22
+ bot_user_agents_re = /\b(#{bot_user_agents * '|'})\b/i
23
+ request.user_agent =~ bot_user_agents_re
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,3 @@
1
+ module ReTrack
2
+ VERSION = "0.1.0"
3
+ end
data/lib/re_track.rb ADDED
@@ -0,0 +1,7 @@
1
+ require "re_track/engine"
2
+ require "re_track/tracker"
3
+ require "re_track/sweeper"
4
+ require "re_track/trackable"
5
+
6
+ module ReTrack
7
+ end
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :re_track do
3
+ # # Task goes here
4
+ # end
metadata ADDED
@@ -0,0 +1,139 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: re_track
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Gebhard Wöstemeyer
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-06-13 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rails
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '3.1'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '3.1'
27
+ - !ruby/object:Gem::Dependency
28
+ name: mongoid
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec-rails
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
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'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: sqlite3
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: database_cleaner
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ description: Track HTTP-Referrers in Rails using Mongoid/MongoDB
98
+ email:
99
+ - g.woestemeyer@gmail.com
100
+ executables: []
101
+ extensions: []
102
+ extra_rdoc_files: []
103
+ files:
104
+ - app/models/re_track/referer_tracking.rb
105
+ - config/routes.rb
106
+ - lib/re_track.rb
107
+ - lib/tasks/re_track_tasks.rake
108
+ - lib/re_track/version.rb
109
+ - lib/re_track/tracker.rb
110
+ - lib/re_track/trackable.rb
111
+ - lib/re_track/engine.rb
112
+ - lib/re_track/sweeper.rb
113
+ - MIT-LICENSE
114
+ - Rakefile
115
+ - README.md
116
+ homepage: https://github.com/gewo/re_track
117
+ licenses: []
118
+ metadata: {}
119
+ post_install_message:
120
+ rdoc_options: []
121
+ require_paths:
122
+ - lib
123
+ required_ruby_version: !ruby/object:Gem::Requirement
124
+ requirements:
125
+ - - '>='
126
+ - !ruby/object:Gem::Version
127
+ version: '0'
128
+ required_rubygems_version: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - '>='
131
+ - !ruby/object:Gem::Version
132
+ version: '0'
133
+ requirements: []
134
+ rubyforge_project:
135
+ rubygems_version: 2.0.3
136
+ signing_key:
137
+ specification_version: 4
138
+ summary: Track HTTP-Referrers in Rails using Mongoid/MongoDB
139
+ test_files: []