rakwik 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -2,3 +2,10 @@ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in rakwik.gemspec
4
4
  gemspec
5
+
6
+ gem 'rake'
7
+
8
+ group :test do
9
+ gem 'rack-test'
10
+ gem 'webmock'
11
+ end
data/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # Rakwik
2
2
 
3
+ [![Build Status](https://travis-ci.org/datenimperator/rakwik.png)](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
@@ -1,7 +1,6 @@
1
1
  #!/usr/bin/env rake
2
2
  require 'bundler'
3
3
  require 'rspec/core/rake_task'
4
-
5
4
  Bundler::GemHelper.install_tasks
6
5
 
7
6
  RSpec::Core::RakeTask.new(:spec)
@@ -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).get :head => h, :query => d
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
@@ -1,3 +1,3 @@
1
1
  module Rakwik
2
- VERSION = "0.2.0"
2
+ VERSION = "0.3.0"
3
3
  end
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 = ["github@kontakt.software-consultant.net"]
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.}
@@ -0,0 +1,5 @@
1
+ module URI
2
+ def self.decode_www_form(raw)
3
+ raw.split('&').map{|s|s.split('=').map{|v| CGI::unescape(v)}}
4
+ end
5
+ end
@@ -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
- hash: 23
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
- date: 2012-06-21 00:00:00 Z
19
- dependencies:
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
- prerelease: false
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
- hash: 3
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
- requirement: &id002 !ruby/object:Gem::Requirement
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
- hash: 3
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
- requirement: &id003 !ruby/object:Gem::Requirement
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
- hash: 3
57
- segments:
58
- - 0
59
- version: "0"
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
60
54
  type: :development
61
- version_requirements: *id003
62
- description: |-
63
- Rakwik is a server-side tracker integration for the Piwik opensource
64
- web statistics software. It's easy to integrate into rack-based applications and does not require
65
- frontend Javascript inclusion.
66
- email:
67
- - github@kontakt.software-consultant.net
68
- executables: []
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
- extensions: []
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
- hash: 3
101
- segments:
99
+ requirements:
100
+ - - ! '>='
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ segments:
102
104
  - 0
103
- version: "0"
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
- hash: 3
110
- segments:
108
+ requirements:
109
+ - - ! '>='
110
+ - !ruby/object:Gem::Version
111
+ version: '0'
112
+ segments:
111
113
  - 0
112
- version: "0"
114
+ hash: 1989987192526098628
113
115
  requirements: []
114
-
115
116
  rubyforge_project:
116
- rubygems_version: 1.8.10
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