trackablaze 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.markdown ADDED
@@ -0,0 +1,141 @@
1
+ # Trackablaze Gem
2
+
3
+ The Trackablaze gem is both the official repository of trackers for
4
+ [Trackablaze][1] as well as a stand-alone tool to execute trackers
5
+ from the command line. The website and the gem are kept in
6
+ version sync, so any recipes released to the gem will be simultaneously
7
+ available on the web builder.
8
+
9
+ ## Installation
10
+
11
+ Installation is simple:
12
+
13
+ gem install trackablaze
14
+
15
+ ## Usage
16
+
17
+ 'trackablaze' lets you track web metrics. For
18
+ example, the Twitter tracker lets you find metrics
19
+ about a specific Twitter account - metrics such as number of
20
+ followers, number of friends, etc. Depending on the tracker
21
+ used either only public information is available or
22
+ authenticated information is available through oauth.
23
+
24
+ ### Command line usage
25
+
26
+ The command line take a configuration yaml file and executes
27
+ trackers listed in it.
28
+
29
+ trackablaze track sample.yml
30
+
31
+ Contents of sample.yml
32
+
33
+ - twitter:
34
+ params:
35
+ handle: amolk
36
+ metrics:
37
+ - followers_count
38
+ - friends_count
39
+
40
+ - facebook_page:
41
+ params:
42
+ page_id: 125602120804573
43
+
44
+ - twitter:
45
+ params:
46
+ handle: msuster
47
+
48
+ This will output twitter metrics for the two twitter handles
49
+ (amolk, msuster) and metrics for the facebook page specified.
50
+ If a list of metrics is specified,
51
+ such as for the first twitter tracker, those specific metrics
52
+ are listed in the output. Otherwise, the default set of
53
+ metrics are reported.
54
+
55
+ Output
56
+
57
+ --------------------------------[ Twitter ]--------------------------------
58
+ params: {"handle"=>"amolk"}
59
+ results: {"followers_count"=>25, "friends_count"=>29}
60
+ -----------------------------[ Facebook page ]-----------------------------
61
+ params: {"page_id"=>125602120804573}
62
+ results: {"likes"=>13}
63
+ --------------------------------[ Twitter ]--------------------------------
64
+ params: {"handle"=>"msuster"}
65
+ results: {"followers_count"=>35836}
66
+
67
+ # Trackablaze Trackers
68
+
69
+ Trackablaze trackers collection is available
70
+ in this GitHub repository. Feel free to fork and improve. You can see all of
71
+ the trackers in the [trackers directory][2].
72
+
73
+ ## Submitting a Tracker
74
+
75
+ Submitting a tracker is actually a very straightforward process. Trackers
76
+ are made of up of a **YAML config file** and a **ruby code file**.
77
+
78
+ ### Sample YAML config file
79
+
80
+ title: 'Twitter'
81
+
82
+ params:
83
+ handle:
84
+ name: 'Twitter handle'
85
+ description: 'This is the Twitter username'
86
+ type: string
87
+
88
+ metrics:
89
+ followers_count:
90
+ name: 'Followers count'
91
+ default: true
92
+ friends_count:
93
+ name: 'Friends count'
94
+
95
+ ### Sample tracker ruby file
96
+
97
+ def get_metrics(configs)
98
+ configs.collect {|c| get_metrics_single(c)}
99
+ end
100
+
101
+ private
102
+
103
+ def get_metrics_single(config)
104
+ params, metrics_keys = config['params'], config['metrics']
105
+ metrics = {}
106
+
107
+ user = ::Twitter.user(params["handle"])
108
+
109
+ metrics_keys ||= Twitter.default_metrics
110
+
111
+ metrics_keys.each do |metrics_key|
112
+ metrics[metrics_key] = user[metrics_key]
113
+ end
114
+
115
+ metrics
116
+ end
117
+
118
+ A tracker must implement get_metrics() method. This method takes
119
+ in an array of configurations. Your tracker may choose to query
120
+ for each configuration one by one or use any available optimized
121
+ API calls. For example, the above code queries Twitter API once
122
+ for each user handle, but can be optimized by using the
123
+ ::Twitter.users API call that takes an array of user handles.
124
+
125
+ It's really that simple. The gem has RSpec tests that automatically
126
+ validate each tracker in the repository, so you should run `rake spec`
127
+ as a basic sanity check before submitting a pull request. Note that
128
+ these don't verify that your tracker code itself works, just that
129
+ Trackablaze could properly load your tracker file and the the config
130
+ file is valid.
131
+
132
+ For more information on all available options for authoring trackers,
133
+ please see the wiki.
134
+
135
+ ## License
136
+
137
+ Trackablaze and its recipes are distributed under the MIT License.
138
+
139
+ [1]:http://railswizard.org/
140
+ [2]:https://github.com/aflatune/trackablaze-gem/tree/master/trackers
141
+ [3]:https://github.com/amolk/trackablaze.web
data/bin/trackablaze ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+ $:.push File.dirname(__FILE__) + '/../lib'
3
+
4
+ require 'rubygems'
5
+ require 'trackablaze/command'
6
+
7
+ Trackablaze::Command.start
@@ -0,0 +1,25 @@
1
+ require 'trackablaze'
2
+ require 'thor'
3
+ require 'yaml'
4
+
5
+ module Trackablaze
6
+ class Command < Thor
7
+ include Thor::Actions
8
+
9
+ desc "track FILE", "A YML file that lists trackers to run and parameters to run with"
10
+ def track(file)
11
+ Trackablaze::Tracker.load_trackers
12
+ config = YAML::load( File.open( file ) )
13
+
14
+ results = Trackablaze::Tracker.run_trackers(config)
15
+
16
+ (0..config.length-1).each do |n|
17
+ c = config[n]
18
+ tracker_name = c.keys.first
19
+ puts "[ #{Trackablaze::Tracker.trackers[tracker_name].title} ]".center(75,'-')
20
+ puts "params: #{c[tracker_name]['params']}"
21
+ puts "results: #{results[n]}"
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,73 @@
1
+ module Trackablaze
2
+ class Tracker
3
+
4
+ class << self
5
+ attr_accessor :trackers
6
+
7
+ def load_trackers
8
+ @trackers = {}
9
+ Trackablaze::Tracker.subclasses.each do |t|
10
+ @trackers[t.handle] = t
11
+ end
12
+ end
13
+
14
+ # This function takes config object, similar in structure to a loaded yml config file
15
+ def run_trackers(config)
16
+ results = []
17
+ trackers = {}
18
+ index = 0
19
+ config.each do |tracker_node|
20
+ tracker_name = tracker_node.keys.first
21
+ trackers[tracker_name] ||= []
22
+ tracker_config = tracker_node.values.first
23
+ tracker_config['index'] = index
24
+ trackers[tracker_name] << tracker_config
25
+ index += 1
26
+ end
27
+
28
+ trackers.each do |tracker_name, tracker_configs|
29
+ tracker = Trackablaze::Tracker.trackers[tracker_name].new
30
+
31
+ tracker_config_index = 0
32
+ tracker.get_metrics(tracker_configs).each do |tracker_result|
33
+ index = tracker_configs[tracker_config_index]['index']
34
+ results[index] = tracker_result
35
+ tracker_config_index += 1
36
+ end
37
+ end
38
+
39
+ return results
40
+ end
41
+
42
+ end
43
+
44
+ def self.handle
45
+ @handle ||= self.name.split('::')[1].underscore
46
+ end
47
+
48
+ def self.info
49
+ @info ||= YAML::load( File.open( File.dirname(__FILE__) + "/../../trackers/#{self.handle}.yml" ) )
50
+ end
51
+
52
+ def self.title
53
+ self.info['title']
54
+ end
55
+
56
+ def self.default_metrics
57
+ @default_metrics ||= self.info['metrics'].collect{|k, v| k if v && v['default']}.compact
58
+ end
59
+
60
+ def get_metrics(params, metrics)
61
+ {}
62
+ end
63
+
64
+ def add_error(metrics, error, field = nil)
65
+ puts "ADDING ERROR #{error} on #{field}"
66
+ metrics['errors'] ||= []
67
+ metrics['errors'].push({:error => error, :field => field})
68
+
69
+ puts "ADDED ERROR #{metrics.inspect}"
70
+ end
71
+
72
+ end
73
+ end
@@ -0,0 +1,15 @@
1
+ class Class
2
+ def subclasses
3
+ ObjectSpace.each_object(Class).select { |klass| klass < self }
4
+ end
5
+ end
6
+
7
+ class String
8
+ def underscore
9
+ self.gsub(/::/, '/').
10
+ gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
11
+ gsub(/([a-z\d])([A-Z])/,'\1_\2').
12
+ tr("-", "_").
13
+ downcase
14
+ end
15
+ end
@@ -0,0 +1,8 @@
1
+ require 'trackablaze/utils'
2
+ require 'trackablaze/command'
3
+ require 'trackablaze/tracker'
4
+
5
+ Dir[File.dirname(__FILE__) + '/../trackers/*.rb'].each do |path|
6
+ key = File.basename(path, '.rb')
7
+ require path
8
+ end
@@ -0,0 +1,11 @@
1
+ require 'bundler'
2
+ Bundler.setup
3
+ require 'rspec'
4
+
5
+ Dir[File.dirname(__FILE__) + '/support/*'].each{|path| require path}
6
+
7
+ require 'trackablaze'
8
+
9
+ RSpec.configure do |config|
10
+
11
+ end
@@ -0,0 +1,39 @@
1
+ require 'mini_fb'
2
+
3
+ module Trackablaze
4
+ class FacebookPage < Tracker
5
+ def get_metrics(configs)
6
+ configs.collect {|c| get_metrics_single(c)}
7
+ end
8
+
9
+ def get_metrics_single(config)
10
+ params, metrics_keys = config['params'], config['metrics']
11
+ metrics = {}
12
+
13
+ if (params["page_id"].nil?)
14
+ add_error(metrics, "No Facebook page ID supplied", "page_id")
15
+ return metrics
16
+ end
17
+
18
+ begin
19
+ page_info = MiniFB.get(nil, params["page_id"])
20
+ rescue
21
+ page_info = {}
22
+ end
23
+
24
+ if (page_info.nil? || page_info['likes'].nil?)
25
+ add_error(metrics, "Invalid Facebook page ID supplied", "page_id")
26
+ return metrics
27
+ end
28
+
29
+ metrics_keys ||= FacebookPage.default_metrics
30
+
31
+ metrics_keys.each do |metrics_key|
32
+ metrics[metrics_key] = page_info[metrics_key]
33
+ end
34
+
35
+ metrics
36
+ end
37
+ end
38
+ end
39
+
@@ -0,0 +1,12 @@
1
+ title: 'Facebook page'
2
+
3
+ params:
4
+ page_id:
5
+ name: 'Page ID'
6
+ description: 'This is the page ID (e.g. michaeljackson or 125602120804573)'
7
+ type: string
8
+
9
+ metrics:
10
+ likes:
11
+ name: 'Likes'
12
+ default: true
@@ -0,0 +1,40 @@
1
+ require 'twitter'
2
+
3
+ module Trackablaze
4
+ class Twitter < Tracker
5
+ def get_metrics(configs)
6
+ configs.collect {|c| get_metrics_single(c)}
7
+ end
8
+
9
+ def get_metrics_single(config)
10
+ params, metrics_keys = config['params'], config['metrics']
11
+ metrics = {}
12
+
13
+ if (params["handle"].nil? || params["handle"].empty?)
14
+ add_error(metrics, "No handle supplied", "handle")
15
+ return metrics
16
+ end
17
+
18
+ user = nil
19
+ begin
20
+ user = ::Twitter.user(params["handle"])
21
+ rescue
22
+ end
23
+
24
+ if (user.nil?)
25
+ add_error(metrics, "Invalid handle supplied", "handle")
26
+ return metrics
27
+ end
28
+
29
+ metrics_keys ||= Twitter.default_metrics
30
+
31
+ metrics_keys.each do |metrics_key|
32
+ value = user[metrics_key]
33
+ metrics[metrics_key] = value
34
+ end
35
+
36
+ metrics
37
+ end
38
+ end
39
+ end
40
+
@@ -0,0 +1,14 @@
1
+ title: 'Twitter'
2
+
3
+ params:
4
+ handle:
5
+ name: 'Handle'
6
+ description: 'Twitter handle, same as username'
7
+ type: string
8
+
9
+ metrics:
10
+ followers_count:
11
+ name: 'Followers count'
12
+ default: true
13
+ friends_count:
14
+ name: 'Friends count'
data/version.rb ADDED
@@ -0,0 +1,3 @@
1
+ module Trackablaze
2
+ VERSION = "0.1.0"
3
+ end
metadata ADDED
@@ -0,0 +1,155 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: trackablaze
3
+ version: !ruby/object:Gem::Version
4
+ prerelease:
5
+ version: 0.1.0
6
+ platform: ruby
7
+ authors:
8
+ - Amol Kelkar
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+
13
+ date: 2011-06-12 00:00:00 -07:00
14
+ default_executable:
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
17
+ name: i18n
18
+ prerelease: false
19
+ requirement: &id001 !ruby/object:Gem::Requirement
20
+ none: false
21
+ requirements:
22
+ - - ">="
23
+ - !ruby/object:Gem::Version
24
+ version: "0"
25
+ type: :runtime
26
+ version_requirements: *id001
27
+ - !ruby/object:Gem::Dependency
28
+ name: activesupport
29
+ prerelease: false
30
+ requirement: &id002 !ruby/object:Gem::Requirement
31
+ none: false
32
+ requirements:
33
+ - - ">="
34
+ - !ruby/object:Gem::Version
35
+ version: 3.0.0
36
+ type: :runtime
37
+ version_requirements: *id002
38
+ - !ruby/object:Gem::Dependency
39
+ name: thor
40
+ prerelease: false
41
+ requirement: &id003 !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: "0"
47
+ type: :runtime
48
+ version_requirements: *id003
49
+ - !ruby/object:Gem::Dependency
50
+ name: twitter
51
+ prerelease: false
52
+ requirement: &id004 !ruby/object:Gem::Requirement
53
+ none: false
54
+ requirements:
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ version: "0"
58
+ type: :runtime
59
+ version_requirements: *id004
60
+ - !ruby/object:Gem::Dependency
61
+ name: mini_fb
62
+ prerelease: false
63
+ requirement: &id005 !ruby/object:Gem::Requirement
64
+ none: false
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: "0"
69
+ type: :runtime
70
+ version_requirements: *id005
71
+ - !ruby/object:Gem::Dependency
72
+ name: rspec
73
+ prerelease: false
74
+ requirement: &id006 !ruby/object:Gem::Requirement
75
+ none: false
76
+ requirements:
77
+ - - ~>
78
+ - !ruby/object:Gem::Version
79
+ version: 2.5.0
80
+ type: :development
81
+ version_requirements: *id006
82
+ - !ruby/object:Gem::Dependency
83
+ name: mg
84
+ prerelease: false
85
+ requirement: &id007 !ruby/object:Gem::Requirement
86
+ none: false
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: "0"
91
+ type: :development
92
+ version_requirements: *id007
93
+ - !ruby/object:Gem::Dependency
94
+ name: rails
95
+ prerelease: false
96
+ requirement: &id008 !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ">="
100
+ - !ruby/object:Gem::Version
101
+ version: 3.0.0
102
+ type: :development
103
+ version_requirements: *id008
104
+ description: Track metrics such as a Twitter account's number of followers, count of tweets, etc
105
+ email:
106
+ - amolk@aflatune.com
107
+ executables:
108
+ - trackablaze
109
+ extensions: []
110
+
111
+ extra_rdoc_files: []
112
+
113
+ files:
114
+ - lib/trackablaze/command.rb
115
+ - lib/trackablaze/tracker.rb
116
+ - lib/trackablaze/utils.rb
117
+ - lib/trackablaze.rb
118
+ - trackers/facebook_page.rb
119
+ - trackers/facebook_page.yml
120
+ - trackers/twitter.rb
121
+ - trackers/twitter.yml
122
+ - README.markdown
123
+ - version.rb
124
+ - spec/spec_helper.rb
125
+ - bin/trackablaze
126
+ has_rdoc: true
127
+ homepage: http://trackablaze.com
128
+ licenses: []
129
+
130
+ post_install_message:
131
+ rdoc_options: []
132
+
133
+ require_paths:
134
+ - lib
135
+ required_ruby_version: !ruby/object:Gem::Requirement
136
+ none: false
137
+ requirements:
138
+ - - ">="
139
+ - !ruby/object:Gem::Version
140
+ version: "0"
141
+ required_rubygems_version: !ruby/object:Gem::Requirement
142
+ none: false
143
+ requirements:
144
+ - - ">="
145
+ - !ruby/object:Gem::Version
146
+ version: "0"
147
+ requirements: []
148
+
149
+ rubyforge_project: trackablaze
150
+ rubygems_version: 1.6.2
151
+ signing_key:
152
+ specification_version: 3
153
+ summary: A tool to track web metrics.
154
+ test_files:
155
+ - spec/spec_helper.rb