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 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