rakwik 0.0.2 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  *Server-side* integration of web tracking methods does not require Javascript snippets
4
4
  or tracking images to be includd in the actual frontend. Rakwik implements asynchronous
5
- tracking, so it tries to keep the time low, needed to count a particular request.
5
+ tracking, so it tries to keep the time low that is needed to count a particular request.
6
6
 
7
7
  ![Server-side tracking](https://github.com/datenimperator/rakwik/wiki/server-side_tracking.png)
8
8
 
@@ -49,6 +49,45 @@ The `:token_auth` is needed since Rakwik will tell Piwik to record hits from ano
49
49
  than its own. The token_auth must be either the Super User token_auth, or a user with
50
50
  "admin" permission for this website ID.
51
51
 
52
+ ### Action names
53
+
54
+ Piwik allows to set a custom action name which will be used in reports instead of the original
55
+ URL. To use it from your Rails application, include it into your controller like such:
56
+
57
+ require 'rakwik/helpers'
58
+
59
+ class ApplicationController < ActionController::Base
60
+ # ...
61
+ include Rakwik::Helpers
62
+ end
63
+
64
+ In the particular controller activate it by using the `action_name` class method:
65
+
66
+ class BooksController < ApplicationController
67
+ action_name :page_title
68
+
69
+ # GET /books
70
+ # GET /books.xml
71
+ def index
72
+ @books = Book.all
73
+ @page_title = "Books"
74
+
75
+ respond_with @books
76
+ end
77
+ end
78
+
79
+ Currently, `action_name` points to a instance variable.
80
+
81
+ ## TODO
82
+
83
+ * ~~Handle tracking cookies~~ no way to do this asynchronously
84
+ * Implement a helper to set the action title ~~from the controller~~ or view
85
+ * Implement a way to provide custom variables from the controller or view
86
+ * Implement a way to detect client capabilities without a separate request
87
+ * Detect [Warden](/hassox/warden) based credentials, eg. from [Devise](/plataformatec/devise)
88
+ * ~~Track 404 responses~~
89
+ * Implement meaningful specs
90
+
52
91
  ## Reference
53
92
 
54
93
  * http://piwik.org/docs/tracking-api/reference/
@@ -0,0 +1,28 @@
1
+ module Rakwik
2
+ module Helpers
3
+ def self.included(base)
4
+ base.extend ClassMethods
5
+ base.send(:include, InstanceMethods)
6
+ base.class_eval do
7
+ after_filter :set_action_name
8
+ end
9
+ end
10
+
11
+ module ClassMethods
12
+ def rakwik
13
+ @rakwik ||= {}
14
+ end
15
+
16
+ def action_name(var_name)
17
+ rakwik[:action_name] = var_name
18
+ end
19
+ end
20
+
21
+ module InstanceMethods
22
+ def set_action_name
23
+ return if self.class.rakwik[:action_name].nil?
24
+ request.env['rakwik.action_name'] = instance_variable_get("@#{self.class.rakwik[:action_name]}")
25
+ end
26
+ end
27
+ end
28
+ end
@@ -1,12 +1,13 @@
1
1
  require 'em-http'
2
- require 'pp'
3
2
 
4
3
  module Rakwik
5
4
  class Tracker
6
5
 
7
6
  include Rack::Response::Helpers
8
7
 
9
- DEFAULT = {}
8
+ DEFAULT = {
9
+ :track_404 => true
10
+ }
10
11
 
11
12
  def initialize(app, options = {})
12
13
  @app, @options = app, DEFAULT.merge(options)
@@ -16,11 +17,15 @@ module Rakwik
16
17
 
17
18
  def call(env)
18
19
  @status, @headers, @body = @app.call(env)
19
- track Rack::Request.new(env) if ok?
20
+ track Rack::Request.new(env) if track?
20
21
  [@status, @headers, @body]
21
22
  end
22
23
 
23
24
  private
25
+
26
+ def track?
27
+ ok? || (not_found? && @options[:track_404] === true)
28
+ end
24
29
 
25
30
  def piwik_url
26
31
  @options[:piwik_url]
@@ -33,23 +38,40 @@ module Rakwik
33
38
  def token_auth
34
39
  @options[:token_auth]
35
40
  end
36
-
37
- def track(request)
41
+
42
+ def extract(request)
38
43
  header = {
39
- 'User-Agent' => request.user_agent,
40
- 'Accept-Language' => request.env["HTTP_ACCEPT_LANGUAGE"]
44
+ 'User-Agent' => request.user_agent
41
45
  }
46
+ header['Accept-Language'] = request.env['HTTP_ACCEPT_LANGUAGE'] unless request.env['HTTP_ACCEPT_LANGUAGE'].nil?
47
+ header['DNT'] = request.env['HTTP_DNT'] unless request.env['HTTP_DNT'].nil?
42
48
  data = {
43
49
  'idsite' => piwik_id,
44
50
  'token_auth' => token_auth,
45
51
  'rec' => 1,
46
52
  'url' => request.url,
47
53
  'cip' => request.ip,
54
+ 'rand' => rand(1000000),
48
55
  'apiv' => 1
49
56
  }
57
+ data['action_name'] = request.env['rakwik.action_name'] unless request.env['rakwik.action_name'].nil?
50
58
  data['urlref'] = request.referer unless request.referer.nil?
59
+
60
+ if not_found? && @options[:track_404] === true
61
+ data['action_name'] = "404/URL = #{data['url'].gsub(/\//, '%2f')}/From = #{data['urlref'].gsub(/\//, '%2f')}"
62
+ end
63
+
64
+ [header, data]
65
+ end
66
+
67
+ def track(request)
68
+ h, d = extract(request)
51
69
  EventMachine.schedule do
52
- http = connection(piwik_url).get :head => header, :query => data
70
+ http = connection(piwik_url).get :head => h, :query => d
71
+ http.errback {
72
+ time = Time.now.strftime("%Y-%m-%d %H:%M:%S")
73
+ request.env['rack.errors'].puts "[#{time}] ERROR Rakwik::Tracker: #{http.error}"
74
+ }
53
75
  end
54
76
  end
55
77
 
@@ -1,3 +1,3 @@
1
1
  module Rakwik
2
- VERSION = "0.0.2"
2
+ VERSION = "0.1.0"
3
3
  end
metadata CHANGED
@@ -5,9 +5,9 @@ version: !ruby/object:Gem::Version
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
+ - 1
8
9
  - 0
9
- - 2
10
- version: 0.0.2
10
+ version: 0.1.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Christian Aust
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2012-06-19 00:00:00 Z
18
+ date: 2012-06-20 00:00:00 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  name: rack
@@ -78,6 +78,7 @@ files:
78
78
  - README.md
79
79
  - Rakefile
80
80
  - lib/rakwik.rb
81
+ - lib/rakwik/helpers.rb
81
82
  - lib/rakwik/tracker.rb
82
83
  - lib/rakwik/version.rb
83
84
  - rakwik.gemspec