mongolytics 0.2.1
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/README.md +105 -0
- data/Rakefile +49 -0
- data/lib/mongolytics.rb +16 -0
- data/lib/mongolytics/param.rb +5 -0
- data/lib/mongolytics/session.rb +5 -0
- data/lib/mongolytics/statistic.rb +20 -0
- data/lib/mongolytics/tracker.rb +43 -0
- data/lib/mongolytics/version.rb +12 -0
- data/test/test_helper.rb +12 -0
- data/test/unit/mongolytics/statistic_test.rb +17 -0
- data/test/unit/mongolytics/tracker_test.rb +74 -0
- data/test/unit/mongolytics_test.rb +15 -0
- metadata +75 -0
data/README.md
ADDED
@@ -0,0 +1,105 @@
|
|
1
|
+
# Mongolytics
|
2
|
+
|
3
|
+
## Description
|
4
|
+
|
5
|
+
Simple analytics tracking for Rails using the awesomest: MongoDB
|
6
|
+
|
7
|
+
## Dependencies
|
8
|
+
|
9
|
+
Rails
|
10
|
+
MongoDB
|
11
|
+
MongoMapper
|
12
|
+
|
13
|
+
## Installation
|
14
|
+
|
15
|
+
sudo gem install mongolytics
|
16
|
+
|
17
|
+
## Setup
|
18
|
+
|
19
|
+
Just be sure to setup MongoMapper to connect to MongoDB in environment.rb:
|
20
|
+
|
21
|
+
Rails::Initializer.run do |config|
|
22
|
+
config.gem 'mongomapper', :version => '>= 0.2.1'
|
23
|
+
end
|
24
|
+
|
25
|
+
MongoMapper.database = "databasename-#{Rails.env}"
|
26
|
+
|
27
|
+
[More Information](http://railstips.org/2009/7/23/getting-started-with-mongomapper-and-rails)
|
28
|
+
|
29
|
+
## Usage
|
30
|
+
|
31
|
+
class ApplicationController < ActionController::Base
|
32
|
+
include Mongolytics::Tracker
|
33
|
+
end
|
34
|
+
|
35
|
+
In your controllers call any of these (creates an after_filter):
|
36
|
+
|
37
|
+
track_all_stats # tracks all actions
|
38
|
+
track_view_stats # tracks index, show
|
39
|
+
track_change_stats # tracks create, update, destroy
|
40
|
+
track_stats_for :new, :edit, :show, :destroy # track any action mix, other actions
|
41
|
+
|
42
|
+
If you want to track a session variable:
|
43
|
+
|
44
|
+
track_session_key :username # tracks session[:username] as a String
|
45
|
+
track_session_key :user_id, Integer # tracks session[:user_id] as an Integer
|
46
|
+
|
47
|
+
If you want to track a params variable:
|
48
|
+
|
49
|
+
track_params_key :username # tracks params[:username] as a String
|
50
|
+
track_params_key :user_id, Integer # tracks params[:user_id] as an Integer
|
51
|
+
|
52
|
+
Later, retrieve stats via (given UsersController is our controller):
|
53
|
+
|
54
|
+
# by path, useful for getting per-id stats e.g., /users/1
|
55
|
+
Mongolytics.stats_for_path user_path(@user) # using the path helper (not url helper)
|
56
|
+
|
57
|
+
# by controller and action keys, useful if you want all views of users/show page
|
58
|
+
Mongolytics.stats_for_keys :users, :show # using the controller and action
|
59
|
+
|
60
|
+
You can always query the Statistics:
|
61
|
+
|
62
|
+
Mongolytics::Statistic.count(:session => {:user_id => 1})
|
63
|
+
Mongolytics::Statistic.count(:param => {:user_id => 1})
|
64
|
+
|
65
|
+
## Motivation
|
66
|
+
|
67
|
+
### Why use MongoDB?
|
68
|
+
|
69
|
+
It's cool, I wanted to learn it, it's unbelievably fast, and they're working
|
70
|
+
on a restful API which might do cool things (pooled analytics tracking)
|
71
|
+
|
72
|
+
### This is lame!
|
73
|
+
|
74
|
+
I know I'm only taking hit counts, and not really doing much to track unique
|
75
|
+
views, or user tracking, or determining user environments. The reason being:
|
76
|
+
that's not what I wanted to do!
|
77
|
+
|
78
|
+
If you want that stuff, and great reporting, and cool graphs: use Google Analytics.
|
79
|
+
It's perfect for that stuff! I just wanted counts on certain pages that weren't
|
80
|
+
trackable by GA because of their lack of unique url, or view (e.g., create/update/destroy).
|
81
|
+
|
82
|
+
## License
|
83
|
+
|
84
|
+
Copyright (c) 2009 Tony Pitale
|
85
|
+
|
86
|
+
Permission is hereby granted, free of charge, to any person
|
87
|
+
obtaining a copy of this software and associated documentation
|
88
|
+
files (the "Software"), to deal in the Software without
|
89
|
+
restriction, including without limitation the rights to use,
|
90
|
+
copy, modify, merge, publish, distribute, sublicense, and/or sell
|
91
|
+
copies of the Software, and to permit persons to whom the
|
92
|
+
Software is furnished to do so, subject to the following
|
93
|
+
conditions:
|
94
|
+
|
95
|
+
The above copyright notice and this permission notice shall be
|
96
|
+
included in all copies or substantial portions of the Software.
|
97
|
+
|
98
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
99
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
100
|
+
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
101
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
102
|
+
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
103
|
+
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
104
|
+
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
105
|
+
OTHER DEALINGS IN THE SOFTWARE.
|
data/Rakefile
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake/gempackagetask'
|
3
|
+
require 'rake/testtask'
|
4
|
+
|
5
|
+
require 'lib/mongolytics/version'
|
6
|
+
|
7
|
+
task :default => :test
|
8
|
+
|
9
|
+
spec = Gem::Specification.new do |s|
|
10
|
+
s.name = 'mongolytics'
|
11
|
+
s.version = Mongolytics::Version.to_s
|
12
|
+
s.has_rdoc = false
|
13
|
+
s.summary = "Provide basic analytics tracking, server-side, using mongodb"
|
14
|
+
s.author = 'Tony Pitale'
|
15
|
+
s.email = 'tpitale@gmail.com'
|
16
|
+
s.homepage = 'http://t.pitale.com'
|
17
|
+
s.files = %w(README.md Rakefile) + Dir.glob("{lib,test}/**/*")
|
18
|
+
|
19
|
+
s.add_dependency('mongomapper', '>= 0.3.1')
|
20
|
+
end
|
21
|
+
|
22
|
+
Rake::GemPackageTask.new(spec) do |pkg|
|
23
|
+
pkg.gem_spec = spec
|
24
|
+
end
|
25
|
+
|
26
|
+
Rake::TestTask.new do |t|
|
27
|
+
t.libs << 'test'
|
28
|
+
t.test_files = FileList["test/**/*_test.rb"]
|
29
|
+
t.verbose = true
|
30
|
+
end
|
31
|
+
|
32
|
+
desc 'Generate the gemspec to serve this Gem from Github'
|
33
|
+
task :github do
|
34
|
+
file = File.dirname(__FILE__) + "/#{spec.name}.gemspec"
|
35
|
+
File.open(file, 'w') {|f| f << spec.to_ruby }
|
36
|
+
puts "Created gemspec: #{file}"
|
37
|
+
end
|
38
|
+
|
39
|
+
begin
|
40
|
+
require 'rcov/rcovtask'
|
41
|
+
|
42
|
+
desc "Generate RCov coverage report"
|
43
|
+
Rcov::RcovTask.new(:rcov) do |t|
|
44
|
+
t.test_files = FileList['test/**/*_test.rb']
|
45
|
+
t.rcov_opts << "-x lib/mongolytics/version.rb"
|
46
|
+
end
|
47
|
+
rescue LoadError
|
48
|
+
nil
|
49
|
+
end
|
data/lib/mongolytics.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
$:.unshift File.dirname(__FILE__)
|
2
|
+
|
3
|
+
require 'mongolytics/statistic'
|
4
|
+
require 'mongolytics/session'
|
5
|
+
require 'mongolytics/param'
|
6
|
+
require 'mongolytics/tracker'
|
7
|
+
|
8
|
+
module Mongolytics
|
9
|
+
def self.stats_for_path(path)
|
10
|
+
Statistic.stats_for_path(path)
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.stats_for_keys(controller, action)
|
14
|
+
Statistic.stats_for_keys(controller, action)
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Mongolytics
|
2
|
+
class Statistic
|
3
|
+
include MongoMapper::Document
|
4
|
+
|
5
|
+
key :controller, String, :required => true
|
6
|
+
key :action, String, :required => true
|
7
|
+
key :path, String
|
8
|
+
|
9
|
+
many :sessions, :class_name => 'Mongolytics::Session'
|
10
|
+
many :params, :class_name => 'Mongolytics::Param'
|
11
|
+
|
12
|
+
def self.stats_for_path(path)
|
13
|
+
count({:path => path})
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.stats_for_keys(controller, action)
|
17
|
+
count({:controller => controller.to_s, :action => action.to_s})
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module Mongolytics
|
2
|
+
module Tracker
|
3
|
+
def self.included(controller)
|
4
|
+
controller.extend(ClassMethods)
|
5
|
+
end
|
6
|
+
|
7
|
+
def track_stat
|
8
|
+
options = {
|
9
|
+
:controller => params[:controller].to_s,
|
10
|
+
:action => params[:action].to_s,
|
11
|
+
:path => request.path
|
12
|
+
}
|
13
|
+
|
14
|
+
Statistic.create(options.merge(:sessions => [session], :params => [params]))
|
15
|
+
end
|
16
|
+
|
17
|
+
module ClassMethods
|
18
|
+
def track_stats_for(*actions)
|
19
|
+
after_filter :track_stat, :only => actions
|
20
|
+
end
|
21
|
+
|
22
|
+
def track_all_stats
|
23
|
+
after_filter :track_stat
|
24
|
+
end
|
25
|
+
|
26
|
+
def track_view_stats
|
27
|
+
track_stats_for :index, :show
|
28
|
+
end
|
29
|
+
|
30
|
+
def track_change_stats
|
31
|
+
track_stats_for :create, :update, :destroy
|
32
|
+
end
|
33
|
+
|
34
|
+
def track_session_key(key, type = String)
|
35
|
+
Session.key(key, type)
|
36
|
+
end
|
37
|
+
|
38
|
+
def track_params_key(key, type = String)
|
39
|
+
Param.key(key, type)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../test_helper'
|
2
|
+
|
3
|
+
module Mongolytics
|
4
|
+
class StatisticTest < Test::Unit::TestCase
|
5
|
+
context 'The Statistic class' do
|
6
|
+
should "find count of stats for a given path" do
|
7
|
+
Statistic.expects(:count).with({:path => '/users/1'}).returns(10201)
|
8
|
+
Statistic.stats_for_path('/users/1').should == 10201
|
9
|
+
end
|
10
|
+
|
11
|
+
should "find count of stats for a given controller and action" do
|
12
|
+
Statistic.expects(:count).with({:controller => 'users', :action => 'show'}).returns(11211)
|
13
|
+
Statistic.stats_for_keys(:users, :show).should == 11211
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../test_helper'
|
2
|
+
|
3
|
+
class FauxController
|
4
|
+
include Mongolytics::Tracker
|
5
|
+
end
|
6
|
+
|
7
|
+
module Mongolytics
|
8
|
+
class TrackerTest < Test::Unit::TestCase
|
9
|
+
context "A Controller with Tracker mixed-in" do
|
10
|
+
should "create an after_filter for the specified actions" do
|
11
|
+
FauxController.expects(:after_filter).with(:track_stat, :only => [:new, :edit])
|
12
|
+
FauxController.track_stats_for :new, :edit
|
13
|
+
end
|
14
|
+
|
15
|
+
should "create an after_filter for all actions" do
|
16
|
+
FauxController.expects(:after_filter).with(:track_stat)
|
17
|
+
FauxController.track_all_stats
|
18
|
+
end
|
19
|
+
|
20
|
+
should "create an after_filter for index, show" do
|
21
|
+
FauxController.expects(:after_filter).with(:track_stat, :only => [:index, :show])
|
22
|
+
FauxController.track_view_stats
|
23
|
+
end
|
24
|
+
|
25
|
+
should "create an after_filter for create, update, destroy" do
|
26
|
+
FauxController.expects(:after_filter).with(:track_stat, :only => [:create, :update, :destroy])
|
27
|
+
FauxController.track_change_stats
|
28
|
+
end
|
29
|
+
|
30
|
+
should "add a session key to Session" do
|
31
|
+
Session.expects(:key).with(:username, String)
|
32
|
+
FauxController.track_session_key :username
|
33
|
+
end
|
34
|
+
|
35
|
+
should "allow override of class type for a session key added to Session" do
|
36
|
+
Session.expects(:key).with(:user_id, Integer)
|
37
|
+
FauxController.track_session_key :user_id, Integer
|
38
|
+
end
|
39
|
+
|
40
|
+
should "add a params key to Session" do
|
41
|
+
Param.expects(:key).with(:username, String)
|
42
|
+
FauxController.track_params_key :username
|
43
|
+
end
|
44
|
+
|
45
|
+
should "allow override of class type for a params key added to Session" do
|
46
|
+
Param.expects(:key).with(:user_id, Integer)
|
47
|
+
FauxController.track_params_key :user_id, Integer
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
context "An instance of a Controller with Tracker mixed-in" do
|
52
|
+
should "create a statistic with controller, action, and path" do
|
53
|
+
controller = FauxController.new
|
54
|
+
|
55
|
+
params = {:controller => 'faux', :action => 'show'}
|
56
|
+
session = {}
|
57
|
+
|
58
|
+
controller.stubs(:request).returns(stub(:path => '/users/1'))
|
59
|
+
controller.stubs(:params).returns(params)
|
60
|
+
controller.stubs(:session).returns(session)
|
61
|
+
|
62
|
+
Statistic.expects(:create).with({
|
63
|
+
:controller => 'faux',
|
64
|
+
:action => 'show',
|
65
|
+
:path => '/users/1',
|
66
|
+
:params => [params],
|
67
|
+
:sessions => [session]
|
68
|
+
}).returns(true)
|
69
|
+
|
70
|
+
assert controller.track_stat
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../test_helper'
|
2
|
+
|
3
|
+
class MongolyticsTest < Test::Unit::TestCase
|
4
|
+
context "The Mongolytics module" do
|
5
|
+
should "delegate stats_for_path to Statistic" do
|
6
|
+
Mongolytics::Statistic.expects(:stats_for_path).with('/users/1')
|
7
|
+
Mongolytics.stats_for_path('/users/1')
|
8
|
+
end
|
9
|
+
|
10
|
+
should "delegate stats_for_keys to Statistic" do
|
11
|
+
Mongolytics::Statistic.expects(:stats_for_keys).with(:users, :show)
|
12
|
+
Mongolytics.stats_for_keys(:users, :show)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
metadata
ADDED
@@ -0,0 +1,75 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: mongolytics
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Tony Pitale
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-08-29 00:00:00 -04:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: mongomapper
|
17
|
+
type: :runtime
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 0.3.1
|
24
|
+
version:
|
25
|
+
description:
|
26
|
+
email: tpitale@gmail.com
|
27
|
+
executables: []
|
28
|
+
|
29
|
+
extensions: []
|
30
|
+
|
31
|
+
extra_rdoc_files: []
|
32
|
+
|
33
|
+
files:
|
34
|
+
- README.md
|
35
|
+
- Rakefile
|
36
|
+
- lib/mongolytics/param.rb
|
37
|
+
- lib/mongolytics/session.rb
|
38
|
+
- lib/mongolytics/statistic.rb
|
39
|
+
- lib/mongolytics/tracker.rb
|
40
|
+
- lib/mongolytics/version.rb
|
41
|
+
- lib/mongolytics.rb
|
42
|
+
- test/test_helper.rb
|
43
|
+
- test/unit/mongolytics/statistic_test.rb
|
44
|
+
- test/unit/mongolytics/tracker_test.rb
|
45
|
+
- test/unit/mongolytics_test.rb
|
46
|
+
has_rdoc: true
|
47
|
+
homepage: http://t.pitale.com
|
48
|
+
licenses: []
|
49
|
+
|
50
|
+
post_install_message:
|
51
|
+
rdoc_options: []
|
52
|
+
|
53
|
+
require_paths:
|
54
|
+
- lib
|
55
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
56
|
+
requirements:
|
57
|
+
- - ">="
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: "0"
|
60
|
+
version:
|
61
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
62
|
+
requirements:
|
63
|
+
- - ">="
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: "0"
|
66
|
+
version:
|
67
|
+
requirements: []
|
68
|
+
|
69
|
+
rubyforge_project:
|
70
|
+
rubygems_version: 1.3.5
|
71
|
+
signing_key:
|
72
|
+
specification_version: 3
|
73
|
+
summary: Provide basic analytics tracking, server-side, using mongodb
|
74
|
+
test_files: []
|
75
|
+
|