rakwik 0.2.0 → 0.3.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.
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/.travis.yml +15 -0
- data/Gemfile +7 -0
- data/README.md +2 -0
- data/Rakefile +0 -1
- data/lib/rakwik/tracker.rb +17 -10
- data/lib/rakwik/version.rb +1 -1
- data/rakwik.gemspec +1 -1
- data/spec/lib/compat.rb +5 -0
- data/spec/lib/rakwik/tracker_spec.rb +35 -0
- data/spec/spec_helper.rb +9 -1
- metadata +77 -75
data/.ruby-gemset
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
rakwik
|
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
ruby-1.9.3-p429
|
data/.travis.yml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
language: ruby
|
2
|
+
rvm:
|
3
|
+
- "1.8.7"
|
4
|
+
- "1.9.2"
|
5
|
+
- "1.9.3"
|
6
|
+
- jruby-18mode # JRuby in 1.8 mode
|
7
|
+
- jruby-19mode # JRuby in 1.9 mode
|
8
|
+
- rbx-18mode
|
9
|
+
- rbx-19mode
|
10
|
+
# uncomment this line if your project needs to run something other than `rake`:
|
11
|
+
# script: bundle exec rspec spec
|
12
|
+
matrix:
|
13
|
+
allow_failures:
|
14
|
+
- rvm: jruby-18mode
|
15
|
+
- rvm: jruby-19mode
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# Rakwik
|
2
2
|
|
3
|
+
[](https://travis-ci.org/datenimperator/rakwik)
|
4
|
+
|
3
5
|
*Server-side* integration of web tracking methods does not require Javascript snippets
|
4
6
|
or tracking images to be includd in the actual frontend. Rakwik implements asynchronous
|
5
7
|
tracking, so it tries to keep the time low that is needed to count a particular request.
|
data/Rakefile
CHANGED
data/lib/rakwik/tracker.rb
CHANGED
@@ -2,9 +2,11 @@ require 'em-http'
|
|
2
2
|
|
3
3
|
module Rakwik
|
4
4
|
class Tracker
|
5
|
-
|
5
|
+
|
6
6
|
include Rack::Response::Helpers
|
7
|
-
|
7
|
+
|
8
|
+
attr_accessor :status
|
9
|
+
|
8
10
|
DEFAULT = {
|
9
11
|
:track_404 => true
|
10
12
|
}
|
@@ -16,13 +18,15 @@ module Rakwik
|
|
16
18
|
end
|
17
19
|
|
18
20
|
def call(env)
|
21
|
+
start = Time.now
|
19
22
|
@status, @headers, @body = @app.call(env)
|
23
|
+
env['rakwik.duration'] = (Time.now - start)*1000
|
20
24
|
track Rack::Request.new(env) if track?
|
21
25
|
[@status, @headers, @body]
|
22
26
|
end
|
23
27
|
|
24
28
|
private
|
25
|
-
|
29
|
+
|
26
30
|
def track?
|
27
31
|
ok? || (not_found? && @options[:track_404] === true)
|
28
32
|
end
|
@@ -38,10 +42,10 @@ module Rakwik
|
|
38
42
|
def token_auth
|
39
43
|
@options[:token_auth]
|
40
44
|
end
|
41
|
-
|
45
|
+
|
42
46
|
def extract(request)
|
43
47
|
header = {
|
44
|
-
'User-Agent' => request.user_agent
|
48
|
+
'User-Agent' => (request.user_agent || "Rakwik Tracker #{Rakwik::VERSION}")
|
45
49
|
}
|
46
50
|
header['Accept-Language'] = request.env['HTTP_ACCEPT_LANGUAGE'] unless request.env['HTTP_ACCEPT_LANGUAGE'].nil?
|
47
51
|
header['DNT'] = request.env['HTTP_DNT'] unless request.env['HTTP_DNT'].nil?
|
@@ -61,22 +65,25 @@ module Rakwik
|
|
61
65
|
'url' => request.url,
|
62
66
|
'cip' => request.ip,
|
63
67
|
'rand' => rand(1000000),
|
64
|
-
'apiv' => 1
|
68
|
+
'apiv' => 1,
|
69
|
+
'gt_ms' => request.env['rakwik.duration'],
|
70
|
+
'ua' => request.user_agent
|
65
71
|
}
|
66
72
|
data['action_name'] = request.env['rakwik.action_name'] unless request.env['rakwik.action_name'].nil?
|
67
73
|
data['urlref'] = request.referer unless request.referer.nil?
|
68
|
-
|
74
|
+
data['gt_ms'] = request.env['rakwik.duration']
|
75
|
+
|
69
76
|
if not_found? && @options[:track_404] === true
|
70
77
|
data['action_name'] = "404/URL = #{data['url'].gsub(/\//, '%2f')}/From = #{data['urlref'].gsub(/\//, '%2f')}"
|
71
78
|
end
|
72
|
-
|
79
|
+
|
73
80
|
[header, data]
|
74
81
|
end
|
75
82
|
|
76
83
|
def track(request)
|
77
84
|
h, d = extract(request)
|
78
85
|
EventMachine.schedule do
|
79
|
-
http = connection(piwik_url).
|
86
|
+
http = connection(piwik_url).post :head => h, :body => d
|
80
87
|
http.errback {
|
81
88
|
time = Time.now.strftime("%Y-%m-%d %H:%M:%S")
|
82
89
|
request.env['rack.errors'].puts "[#{time}] ERROR Rakwik::Tracker: #{http.error}"
|
@@ -89,4 +96,4 @@ module Rakwik
|
|
89
96
|
end
|
90
97
|
|
91
98
|
end
|
92
|
-
end
|
99
|
+
end
|
data/lib/rakwik/version.rb
CHANGED
data/rakwik.gemspec
CHANGED
@@ -3,7 +3,7 @@ require File.expand_path('../lib/rakwik/version', __FILE__)
|
|
3
3
|
|
4
4
|
Gem::Specification.new do |gem|
|
5
5
|
gem.authors = ["Christian Aust"]
|
6
|
-
gem.email = ["
|
6
|
+
gem.email = ["git@kontakt.software-consultant.net"]
|
7
7
|
gem.description = %q{Rakwik is a server-side tracker integration for the Piwik opensource
|
8
8
|
web statistics software. It's easy to integrate into rack-based applications and does not require
|
9
9
|
frontend Javascript inclusion.}
|
data/spec/lib/compat.rb
ADDED
@@ -1,4 +1,39 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Rakwik::Tracker do
|
4
|
+
extend Rack::Test::Methods
|
5
|
+
|
6
|
+
let(:tracker_data) {
|
7
|
+
{
|
8
|
+
:piwik_url => 'http://example.com/piwik.php',
|
9
|
+
:site_id => 1,
|
10
|
+
:token_auth => 'foobar'
|
11
|
+
}
|
12
|
+
}
|
13
|
+
|
14
|
+
def app
|
15
|
+
Rakwik::Tracker.new(
|
16
|
+
lambda { |env| [200, {"Content-Type"=>"text/plain"}, ["Hello. The time is #{Time.now}"]] },
|
17
|
+
tracker_data
|
18
|
+
)
|
19
|
+
end
|
20
|
+
|
21
|
+
before(:each) do
|
22
|
+
stub_request(:post, tracker_data[:piwik_url]).to_return(:status => 200, :body => lambda{|req| req.body})
|
23
|
+
end
|
24
|
+
|
25
|
+
it "tracks requests asynchronously" do
|
26
|
+
# Trigger a request to our inner app that should be tracked
|
27
|
+
get '/'
|
28
|
+
|
29
|
+
# wait a little while to let EventMachine send the request
|
30
|
+
sleep 0.01
|
31
|
+
|
32
|
+
# What now?
|
33
|
+
WebMock.should have_requested(:post, tracker_data[:piwik_url]).with{|req|
|
34
|
+
posted_data = URI::decode_www_form(req.body).inject(Hash.new){|h, raw| h[raw[0]] = raw[1]; h}
|
35
|
+
posted_data.should include("token_auth"=>"foobar", "idsite"=>"1", "rec"=>"1", "url" => "http://example.org/", "apiv"=>"1")
|
36
|
+
true
|
37
|
+
}
|
38
|
+
end
|
4
39
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,7 +1,15 @@
|
|
1
1
|
require 'bundler/setup'
|
2
2
|
require 'rspec'
|
3
|
-
require 'rack'
|
3
|
+
require 'rack/test'
|
4
|
+
require 'webmock/rspec'
|
4
5
|
require 'rakwik'
|
5
6
|
|
7
|
+
if RUBY_VERSION.match /^1\.8/
|
8
|
+
require 'spec/lib/compat'
|
9
|
+
end
|
10
|
+
|
11
|
+
WebMock.disable_net_connect!
|
12
|
+
|
6
13
|
RSpec.configure do |config|
|
14
|
+
config.include Rack::Test::Methods
|
7
15
|
end
|
metadata
CHANGED
@@ -1,78 +1,80 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: rakwik
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.3.0
|
5
5
|
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 2
|
9
|
-
- 0
|
10
|
-
version: 0.2.0
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- Christian Aust
|
14
9
|
autorequire:
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2013-06-01 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
21
15
|
name: rack
|
22
|
-
|
23
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
24
17
|
none: false
|
25
|
-
requirements:
|
26
|
-
- -
|
27
|
-
- !ruby/object:Gem::Version
|
28
|
-
|
29
|
-
segments:
|
30
|
-
- 0
|
31
|
-
version: "0"
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
32
22
|
type: :runtime
|
33
|
-
version_requirements: *id001
|
34
|
-
- !ruby/object:Gem::Dependency
|
35
|
-
name: em-http-request
|
36
23
|
prerelease: false
|
37
|
-
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: em-http-request
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
38
33
|
none: false
|
39
|
-
requirements:
|
40
|
-
- -
|
41
|
-
- !ruby/object:Gem::Version
|
42
|
-
|
43
|
-
segments:
|
44
|
-
- 0
|
45
|
-
version: "0"
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
46
38
|
type: :runtime
|
47
|
-
version_requirements: *id002
|
48
|
-
- !ruby/object:Gem::Dependency
|
49
|
-
name: rspec
|
50
39
|
prerelease: false
|
51
|
-
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: rspec
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
52
49
|
none: false
|
53
|
-
requirements:
|
54
|
-
- -
|
55
|
-
- !ruby/object:Gem::Version
|
56
|
-
|
57
|
-
segments:
|
58
|
-
- 0
|
59
|
-
version: "0"
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
60
54
|
type: :development
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
description: ! 'Rakwik is a server-side tracker integration for the Piwik opensource
|
69
63
|
|
70
|
-
|
64
|
+
web statistics software. It''s easy to integrate into rack-based applications and
|
65
|
+
does not require
|
71
66
|
|
67
|
+
frontend Javascript inclusion.'
|
68
|
+
email:
|
69
|
+
- git@kontakt.software-consultant.net
|
70
|
+
executables: []
|
71
|
+
extensions: []
|
72
72
|
extra_rdoc_files: []
|
73
|
-
|
74
|
-
files:
|
73
|
+
files:
|
75
74
|
- .gitignore
|
75
|
+
- .ruby-gemset
|
76
|
+
- .ruby-version
|
77
|
+
- .travis.yml
|
76
78
|
- Gemfile
|
77
79
|
- LICENSE
|
78
80
|
- README.md
|
@@ -82,41 +84,41 @@ files:
|
|
82
84
|
- lib/rakwik/tracker.rb
|
83
85
|
- lib/rakwik/version.rb
|
84
86
|
- rakwik.gemspec
|
87
|
+
- spec/lib/compat.rb
|
85
88
|
- spec/lib/rakwik/tracker_spec.rb
|
86
89
|
- spec/spec_helper.rb
|
87
90
|
homepage: https://github.com/datenimperator/rakwik
|
88
|
-
licenses:
|
91
|
+
licenses:
|
89
92
|
- MIT
|
90
93
|
post_install_message:
|
91
94
|
rdoc_options: []
|
92
|
-
|
93
|
-
require_paths:
|
95
|
+
require_paths:
|
94
96
|
- lib
|
95
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
97
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
96
98
|
none: false
|
97
|
-
requirements:
|
98
|
-
- -
|
99
|
-
- !ruby/object:Gem::Version
|
100
|
-
|
101
|
-
segments:
|
99
|
+
requirements:
|
100
|
+
- - ! '>='
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: '0'
|
103
|
+
segments:
|
102
104
|
- 0
|
103
|
-
|
104
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
105
|
+
hash: 1989987192526098628
|
106
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
105
107
|
none: false
|
106
|
-
requirements:
|
107
|
-
- -
|
108
|
-
- !ruby/object:Gem::Version
|
109
|
-
|
110
|
-
segments:
|
108
|
+
requirements:
|
109
|
+
- - ! '>='
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
version: '0'
|
112
|
+
segments:
|
111
113
|
- 0
|
112
|
-
|
114
|
+
hash: 1989987192526098628
|
113
115
|
requirements: []
|
114
|
-
|
115
116
|
rubyforge_project:
|
116
|
-
rubygems_version: 1.8.
|
117
|
+
rubygems_version: 1.8.25
|
117
118
|
signing_key:
|
118
119
|
specification_version: 3
|
119
120
|
summary: Rack-based server-side asynchronous Piwik tracker integration.
|
120
|
-
test_files:
|
121
|
+
test_files:
|
122
|
+
- spec/lib/compat.rb
|
121
123
|
- spec/lib/rakwik/tracker_spec.rb
|
122
124
|
- spec/spec_helper.rb
|