trackablaze 0.1.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/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