fnordmetric 0.3.2

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.
Files changed (61) hide show
  1. data/.document +5 -0
  2. data/Gemfile +18 -0
  3. data/Gemfile.lock +69 -0
  4. data/Procfile +2 -0
  5. data/Rakefile +28 -0
  6. data/VERSION +1 -0
  7. data/doc/example_server.rb +56 -0
  8. data/fnordmetric.gemspec +145 -0
  9. data/haml/app.haml +48 -0
  10. data/haml/widget.haml +9 -0
  11. data/lib/fnordmetric.rb +21 -0
  12. data/lib/fnordmetric/app.rb +70 -0
  13. data/lib/fnordmetric/average_metric.rb +7 -0
  14. data/lib/fnordmetric/cache.rb +20 -0
  15. data/lib/fnordmetric/combine_metric.rb +7 -0
  16. data/lib/fnordmetric/core.rb +66 -0
  17. data/lib/fnordmetric/count_metric.rb +13 -0
  18. data/lib/fnordmetric/dashboard.rb +30 -0
  19. data/lib/fnordmetric/engine.rb +3 -0
  20. data/lib/fnordmetric/event.rb +28 -0
  21. data/lib/fnordmetric/funnel_widget.rb +2 -0
  22. data/lib/fnordmetric/metric.rb +80 -0
  23. data/lib/fnordmetric/metric_api.rb +37 -0
  24. data/lib/fnordmetric/numbers_widget.rb +18 -0
  25. data/lib/fnordmetric/report.rb +29 -0
  26. data/lib/fnordmetric/sum_metric.rb +13 -0
  27. data/lib/fnordmetric/timeline_widget.rb +17 -0
  28. data/lib/fnordmetric/widget.rb +75 -0
  29. data/pub/fnordmetric/fnordmetric.css +53 -0
  30. data/pub/fnordmetric/fnordmetric.js +44 -0
  31. data/pub/fnordmetric/widget_numbers.js +71 -0
  32. data/pub/fnordmetric/widget_timeline.css +0 -0
  33. data/pub/fnordmetric/widget_timeline.js +110 -0
  34. data/pub/highcharts/adapters/mootools-adapter.js +12 -0
  35. data/pub/highcharts/adapters/mootools-adapter.src.js +243 -0
  36. data/pub/highcharts/adapters/prototype-adapter.js +14 -0
  37. data/pub/highcharts/adapters/prototype-adapter.src.js +284 -0
  38. data/pub/highcharts/highcharts.js +170 -0
  39. data/pub/highcharts/highcharts.src.js +11103 -0
  40. data/pub/highcharts/modules/exporting.js +22 -0
  41. data/pub/highcharts/modules/exporting.src.js +703 -0
  42. data/pub/highcharts/themes/dark-blue.js +268 -0
  43. data/pub/highcharts/themes/dark-green.js +268 -0
  44. data/pub/highcharts/themes/gray.js +262 -0
  45. data/pub/highcharts/themes/grid.js +97 -0
  46. data/pub/jquery-1.6.1.min.js +18 -0
  47. data/pub/sprite.png +0 -0
  48. data/readme.rdoc +274 -0
  49. data/spec/app_spec.rb +178 -0
  50. data/spec/cache_spec.rb +53 -0
  51. data/spec/combine_metric_spec.rb +19 -0
  52. data/spec/core_spec.rb +50 -0
  53. data/spec/count_metric_spec.rb +32 -0
  54. data/spec/dashboard_spec.rb +67 -0
  55. data/spec/event_spec.rb +46 -0
  56. data/spec/metric_spec.rb +118 -0
  57. data/spec/report_spec.rb +87 -0
  58. data/spec/spec_helper.rb +13 -0
  59. data/spec/sum_metric_spec.rb +33 -0
  60. data/spec/widget_spec.rb +107 -0
  61. metadata +271 -0
@@ -0,0 +1,5 @@
1
+ lib/**/*.rb
2
+ bin/*
3
+ -
4
+ features/**/*.feature
5
+ LICENSE.txt
data/Gemfile ADDED
@@ -0,0 +1,18 @@
1
+ source "http://rubygems.org"
2
+
3
+ gem "mongoid", "~> 2.2.0"
4
+ gem "mongo", "~> 1.4.0"
5
+ gem "bson_ext", "~> 1.4.0"
6
+ gem "sinatra", "~> 1.2.6"
7
+ gem "json"
8
+ gem "haml"
9
+ gem "rack"
10
+ gem "rack-test"
11
+
12
+ group :development do
13
+ gem "delorean", ">= 0"
14
+ gem "rspec", "~> 2.6.0"
15
+ gem "shoulda", ">= 0"
16
+ gem "bundler", "~> 1.0.0"
17
+ gem "jeweler", "~> 1.5.2"
18
+ end
@@ -0,0 +1,69 @@
1
+ GEM
2
+ remote: http://rubygems.org/
3
+ specs:
4
+ activemodel (3.1.0)
5
+ activesupport (= 3.1.0)
6
+ bcrypt-ruby (~> 3.0.0)
7
+ builder (~> 3.0.0)
8
+ i18n (~> 0.6)
9
+ activesupport (3.1.0)
10
+ multi_json (~> 1.0)
11
+ bcrypt-ruby (3.0.1)
12
+ bson (1.4.0)
13
+ bson_ext (1.4.0)
14
+ builder (3.0.0)
15
+ chronic (0.6.4)
16
+ delorean (1.1.0)
17
+ chronic
18
+ diff-lcs (1.1.3)
19
+ git (1.2.5)
20
+ haml (3.1.2)
21
+ i18n (0.6.0)
22
+ jeweler (1.5.2)
23
+ bundler (~> 1.0.0)
24
+ git (>= 1.2.5)
25
+ rake
26
+ json (1.6.1)
27
+ mongo (1.4.0)
28
+ bson (= 1.4.0)
29
+ mongoid (2.2.0)
30
+ activemodel (~> 3.0)
31
+ mongo (~> 1.3)
32
+ tzinfo (~> 0.3.22)
33
+ multi_json (1.0.3)
34
+ rack (1.3.0)
35
+ rack-test (0.6.0)
36
+ rack (>= 1.0)
37
+ rake (0.9.2)
38
+ rspec (2.6.0)
39
+ rspec-core (~> 2.6.0)
40
+ rspec-expectations (~> 2.6.0)
41
+ rspec-mocks (~> 2.6.0)
42
+ rspec-core (2.6.4)
43
+ rspec-expectations (2.6.0)
44
+ diff-lcs (~> 1.1.2)
45
+ rspec-mocks (2.6.0)
46
+ shoulda (2.11.3)
47
+ sinatra (1.2.6)
48
+ rack (~> 1.1)
49
+ tilt (>= 1.2.2, < 2.0)
50
+ tilt (1.3.2)
51
+ tzinfo (0.3.29)
52
+
53
+ PLATFORMS
54
+ ruby
55
+
56
+ DEPENDENCIES
57
+ bson_ext (~> 1.4.0)
58
+ bundler (~> 1.0.0)
59
+ delorean
60
+ haml
61
+ jeweler (~> 1.5.2)
62
+ json
63
+ mongo (~> 1.4.0)
64
+ mongoid (~> 2.2.0)
65
+ rack
66
+ rack-test
67
+ rspec (~> 2.6.0)
68
+ shoulda
69
+ sinatra (~> 1.2.6)
@@ -0,0 +1,2 @@
1
+ app: bundle exec ruby zoe_app.rb
2
+ switchboard: bundle exec ruby zoe_switchboard.rb
@@ -0,0 +1,28 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+ begin
4
+ Bundler.setup(:default, :development)
5
+ rescue Bundler::BundlerError => e
6
+ $stderr.puts e.message
7
+ $stderr.puts "Run `bundle install` to install missing gems"
8
+ exit e.status_code
9
+ end
10
+ require 'rake'
11
+
12
+ require 'jeweler'
13
+ Jeweler::Tasks.new do |gem|
14
+ gem.name = "fnordmetric"
15
+ gem.homepage = "http://github.com/paulasmuth/fnordmetric"
16
+ gem.license = "MIT"
17
+ gem.summary = "FnordMetric is a Ruby Event-Tracking gem on steroids"
18
+ gem.description = "FnordMetric is a Ruby Event-Tracking gem on steroids"
19
+ gem.email = "paul@paulasmuth.com"
20
+ gem.authors = ["Paul Asmuth"]
21
+ end
22
+
23
+ require 'rspec'
24
+ require 'rspec/core/rake_task'
25
+ desc "Run all examples"
26
+ task RSpec::Core::RakeTask.new('spec')
27
+
28
+ task :default => "spec"
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.3.2
@@ -0,0 +1,56 @@
1
+ $: << ::File.expand_path('../../lib', __FILE__)
2
+
3
+ require "rubygems"
4
+ require "fnordmetric"
5
+ require "thin"
6
+
7
+ FnordMetric.metric(:passengers_total, :count => true, :types => [:car_seen])
8
+ FnordMetric.metric(:blubbs, :sum => :passengers, :types => [:car_seen])
9
+ FnordMetric.metric(:passengers_red_car, :sum => :passengers, :filter => { :colors => :red }, :types => [:car_seen])
10
+ FnordMetric.metric(:passengers_blue_car, :sum => :passengers, :filter => { :colors => :blue }, :types => [:car_seen])
11
+
12
+ FnordMetric.metric(:blue_to_red_ratio, :combine => lambda{ |x|
13
+ x.passengers_blue_car / x.passengers_red_car
14
+ })
15
+
16
+
17
+ FnordMetric.dashboard 'Passengers' do |passengers|
18
+
19
+ passengers.add_widget FnordMetric.widget(:passengers_total_timeline,
20
+ :metrics => :passengers_total,
21
+ :tick => 4.minutes,
22
+ :title => "Passengers total",
23
+ :type => :timeline
24
+ )
25
+
26
+ passengers.add_widget FnordMetric.widget(:passenger_blue_red_timeline,
27
+ :metrics => [:passengers_blue_car, :passengers_red_car],
28
+ :title => "Passengers (red/blue)",
29
+ :type => :timeline
30
+ )
31
+
32
+ passengers.add_widget FnordMetric.widget(:passenger_br_ratio_timeline,
33
+ :metrics => :blue_to_red_ratio,
34
+ :title => "Passenger blue/red Ratio",
35
+ :type => :timeline
36
+ )
37
+
38
+ end
39
+
40
+ FnordMetric.dashboard 'Cars & Bikes' do |cars|
41
+
42
+ cars.add_widget FnordMetric.widget(:passenger_br_ratio_timeline,
43
+ :metrics => :blue_to_red_ratio,
44
+ :title => "Passenger blue/red Ratio",
45
+ :type => :timeline
46
+ )
47
+
48
+ end
49
+
50
+
51
+ Mongoid.configure do |c|
52
+ c.master = Mongo::Connection.new.db("myfnordmetric")
53
+ end
54
+
55
+ app = FnordMetric::App.new
56
+ Thin::Server.start('127.0.0.1', 2323, app)
@@ -0,0 +1,145 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{fnordmetric}
8
+ s.version = "0.3.2"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Paul Asmuth"]
12
+ s.date = %q{2011-11-05}
13
+ s.description = %q{FnordMetric is a Ruby Event-Tracking gem on steroids}
14
+ s.email = %q{paul@paulasmuth.com}
15
+ s.files = [
16
+ ".document",
17
+ "Gemfile",
18
+ "Gemfile.lock",
19
+ "Procfile",
20
+ "Rakefile",
21
+ "VERSION",
22
+ "doc/example_server.rb",
23
+ "fnordmetric.gemspec",
24
+ "haml/app.haml",
25
+ "haml/widget.haml",
26
+ "lib/fnordmetric.rb",
27
+ "lib/fnordmetric/app.rb",
28
+ "lib/fnordmetric/average_metric.rb",
29
+ "lib/fnordmetric/cache.rb",
30
+ "lib/fnordmetric/combine_metric.rb",
31
+ "lib/fnordmetric/core.rb",
32
+ "lib/fnordmetric/count_metric.rb",
33
+ "lib/fnordmetric/dashboard.rb",
34
+ "lib/fnordmetric/engine.rb",
35
+ "lib/fnordmetric/event.rb",
36
+ "lib/fnordmetric/funnel_widget.rb",
37
+ "lib/fnordmetric/metric.rb",
38
+ "lib/fnordmetric/metric_api.rb",
39
+ "lib/fnordmetric/numbers_widget.rb",
40
+ "lib/fnordmetric/report.rb",
41
+ "lib/fnordmetric/sum_metric.rb",
42
+ "lib/fnordmetric/timeline_widget.rb",
43
+ "lib/fnordmetric/widget.rb",
44
+ "pub/fnordmetric/fnordmetric.css",
45
+ "pub/fnordmetric/fnordmetric.js",
46
+ "pub/fnordmetric/widget_numbers.js",
47
+ "pub/fnordmetric/widget_timeline.css",
48
+ "pub/fnordmetric/widget_timeline.js",
49
+ "pub/highcharts/adapters/mootools-adapter.js",
50
+ "pub/highcharts/adapters/mootools-adapter.src.js",
51
+ "pub/highcharts/adapters/prototype-adapter.js",
52
+ "pub/highcharts/adapters/prototype-adapter.src.js",
53
+ "pub/highcharts/highcharts.js",
54
+ "pub/highcharts/highcharts.src.js",
55
+ "pub/highcharts/modules/exporting.js",
56
+ "pub/highcharts/modules/exporting.src.js",
57
+ "pub/highcharts/themes/dark-blue.js",
58
+ "pub/highcharts/themes/dark-green.js",
59
+ "pub/highcharts/themes/gray.js",
60
+ "pub/highcharts/themes/grid.js",
61
+ "pub/jquery-1.6.1.min.js",
62
+ "pub/sprite.png",
63
+ "readme.rdoc",
64
+ "spec/app_spec.rb",
65
+ "spec/cache_spec.rb",
66
+ "spec/combine_metric_spec.rb",
67
+ "spec/core_spec.rb",
68
+ "spec/count_metric_spec.rb",
69
+ "spec/dashboard_spec.rb",
70
+ "spec/event_spec.rb",
71
+ "spec/metric_spec.rb",
72
+ "spec/report_spec.rb",
73
+ "spec/spec_helper.rb",
74
+ "spec/sum_metric_spec.rb",
75
+ "spec/widget_spec.rb"
76
+ ]
77
+ s.homepage = %q{http://github.com/paulasmuth/fnordmetric}
78
+ s.licenses = ["MIT"]
79
+ s.require_paths = ["lib"]
80
+ s.rubygems_version = %q{1.6.2}
81
+ s.summary = %q{FnordMetric is a Ruby Event-Tracking gem on steroids}
82
+ s.test_files = [
83
+ "spec/app_spec.rb",
84
+ "spec/cache_spec.rb",
85
+ "spec/combine_metric_spec.rb",
86
+ "spec/core_spec.rb",
87
+ "spec/count_metric_spec.rb",
88
+ "spec/dashboard_spec.rb",
89
+ "spec/event_spec.rb",
90
+ "spec/metric_spec.rb",
91
+ "spec/report_spec.rb",
92
+ "spec/spec_helper.rb",
93
+ "spec/sum_metric_spec.rb",
94
+ "spec/widget_spec.rb"
95
+ ]
96
+
97
+ if s.respond_to? :specification_version then
98
+ s.specification_version = 3
99
+
100
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
101
+ s.add_runtime_dependency(%q<mongoid>, ["~> 2.2.0"])
102
+ s.add_runtime_dependency(%q<mongo>, ["~> 1.4.0"])
103
+ s.add_runtime_dependency(%q<bson_ext>, ["~> 1.4.0"])
104
+ s.add_runtime_dependency(%q<sinatra>, ["~> 1.2.6"])
105
+ s.add_runtime_dependency(%q<json>, [">= 0"])
106
+ s.add_runtime_dependency(%q<haml>, [">= 0"])
107
+ s.add_runtime_dependency(%q<rack>, [">= 0"])
108
+ s.add_runtime_dependency(%q<rack-test>, [">= 0"])
109
+ s.add_development_dependency(%q<delorean>, [">= 0"])
110
+ s.add_development_dependency(%q<rspec>, ["~> 2.6.0"])
111
+ s.add_development_dependency(%q<shoulda>, [">= 0"])
112
+ s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
113
+ s.add_development_dependency(%q<jeweler>, ["~> 1.5.2"])
114
+ else
115
+ s.add_dependency(%q<mongoid>, ["~> 2.2.0"])
116
+ s.add_dependency(%q<mongo>, ["~> 1.4.0"])
117
+ s.add_dependency(%q<bson_ext>, ["~> 1.4.0"])
118
+ s.add_dependency(%q<sinatra>, ["~> 1.2.6"])
119
+ s.add_dependency(%q<json>, [">= 0"])
120
+ s.add_dependency(%q<haml>, [">= 0"])
121
+ s.add_dependency(%q<rack>, [">= 0"])
122
+ s.add_dependency(%q<rack-test>, [">= 0"])
123
+ s.add_dependency(%q<delorean>, [">= 0"])
124
+ s.add_dependency(%q<rspec>, ["~> 2.6.0"])
125
+ s.add_dependency(%q<shoulda>, [">= 0"])
126
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
127
+ s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
128
+ end
129
+ else
130
+ s.add_dependency(%q<mongoid>, ["~> 2.2.0"])
131
+ s.add_dependency(%q<mongo>, ["~> 1.4.0"])
132
+ s.add_dependency(%q<bson_ext>, ["~> 1.4.0"])
133
+ s.add_dependency(%q<sinatra>, ["~> 1.2.6"])
134
+ s.add_dependency(%q<json>, [">= 0"])
135
+ s.add_dependency(%q<haml>, [">= 0"])
136
+ s.add_dependency(%q<rack>, [">= 0"])
137
+ s.add_dependency(%q<rack-test>, [">= 0"])
138
+ s.add_dependency(%q<delorean>, [">= 0"])
139
+ s.add_dependency(%q<rspec>, ["~> 2.6.0"])
140
+ s.add_dependency(%q<shoulda>, [">= 0"])
141
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
142
+ s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
143
+ end
144
+ end
145
+
@@ -0,0 +1,48 @@
1
+ !!!
2
+ %html
3
+
4
+ %head
5
+ %title Fnordmetric Dashboard
6
+ %script(type="text/javascript" src="#{path_prefix}/jquery-1.6.1.min.js")
7
+ %link(type="text/css" rel="stylesheet" href="#{path_prefix}/fnordmetric/fnordmetric.css")
8
+ %script(type="text/javascript" src="#{path_prefix}/fnordmetric/fnordmetric.js")
9
+ :javascript
10
+ FnordMetric.p = '#{path_prefix}';
11
+
12
+ %body
13
+ #wrap
14
+ #tabs
15
+ %ul
16
+ -FnordMetric.dashboards.each do |dashboard|
17
+ %li{:rel => dashboard.token}
18
+ .picto.piechart
19
+ =h dashboard.title
20
+
21
+ #viewport
22
+ -unless @dashboard
23
+ no dashboard selected
24
+
25
+ -@dashboard.widgets.each do |widget|
26
+ -elem_id = "fw#{(rand*9999).to_i}"
27
+ %div{:id => elem_id, :style => "margin-bottom:10px;"}
28
+ =widget.render(elem_id)
29
+
30
+
31
+ :javascript
32
+ $(document).ready(function(){
33
+
34
+ $('#tabs li').click(function(){
35
+ document.location.href = '#{path_prefix}/dashboard/' + $(this).attr('rel');
36
+ });
37
+
38
+ function resizeViewport(){
39
+ var viewport_width = window.innerWidth-310
40
+ $('#viewport').width(viewport_width);
41
+ }
42
+ resizeViewport();
43
+ $(window).resize(resizeViewport);
44
+
45
+ });
46
+
47
+
48
+
@@ -0,0 +1,9 @@
1
+ !!!
2
+ %html
3
+
4
+ %head
5
+ %script(type="text/javascript" src="/fnordmetric/fnordmetric.js")
6
+
7
+ %body
8
+ =@widget.render
9
+
@@ -0,0 +1,21 @@
1
+ require 'rubygems'
2
+ require 'mongoid'
3
+ require 'haml'
4
+ require 'sinatra/base'
5
+
6
+ require "fnordmetric/core"
7
+ require "fnordmetric/app"
8
+ require "fnordmetric/metric_api"
9
+ require "fnordmetric/dashboard"
10
+ require "fnordmetric/event"
11
+ require "fnordmetric/cache"
12
+ require "fnordmetric/report"
13
+ require "fnordmetric/metric"
14
+ require "fnordmetric/average_metric"
15
+ require "fnordmetric/count_metric"
16
+ require "fnordmetric/combine_metric"
17
+ require "fnordmetric/sum_metric"
18
+ require "fnordmetric/widget"
19
+ require "fnordmetric/numbers_widget"
20
+ require "fnordmetric/timeline_widget"
21
+ require "fnordmetric/funnel_widget"
@@ -0,0 +1,70 @@
1
+ class FnordMetric::App < Sinatra::Base
2
+
3
+ @@sessions = Hash.new
4
+
5
+ #use Rack::Reloader, 0
6
+
7
+ enable :session
8
+
9
+ set :haml, :format => :html5
10
+ set :views, ::File.expand_path('../../../haml', __FILE__)
11
+ set :public, ::File.expand_path('../../../pub', __FILE__)
12
+
13
+ helpers do
14
+ include Rack::Utils
15
+ alias_method :h, :escape_html
16
+
17
+ def path_prefix
18
+ request.env["SCRIPT_NAME"]
19
+ end
20
+
21
+ end
22
+
23
+ if ENV['RACK_ENV'] == "test"
24
+ set :raise_errors, true
25
+ end
26
+
27
+ get '/' do
28
+ redirect "#{request.env["SCRIPT_NAME"]}/dashboard/default"
29
+ end
30
+
31
+ get '/dashboard/:name' do
32
+ @dashboard = FnordMetric.dashboards.detect{|d| d.token == params[:name] }
33
+ @dashboard ||= FnordMetric.dashboards.first
34
+ haml :app
35
+ end
36
+
37
+ get '/metric/:name' do
38
+ content_type 'application/json'
39
+ FnordMetric::MetricAPI.new(params).render
40
+ end
41
+
42
+ get '/widget/:name' do
43
+ @dashboard = FnordMetric.dashboards.first
44
+ @widget = @dashboard.widgets.first
45
+ haml :widget
46
+ end
47
+
48
+ post '/events' do
49
+ halt 400, 'please specify the event_type' unless params["type"]
50
+ event_type = params.delete("type")
51
+ FnordMetric.track(event_type, parse_params(params))
52
+ end
53
+
54
+ private
55
+
56
+ def parse_params(hash)
57
+ hash.tap do |h|
58
+ h.keys.each{ |k| h[k] = parse_param(h[k]) }
59
+ end
60
+ end
61
+
62
+ def parse_param(object)
63
+ return object unless object.is_a?(String)
64
+ return object.to_f if object.match(/^[0-9]+[,\.][0-9]+$/)
65
+ return object.to_i if object.match(/^[0-9]+$/)
66
+ object
67
+ end
68
+
69
+ end
70
+