re_track 0.1.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: 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: []