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 +141 -0
- data/bin/trackablaze +7 -0
- data/lib/trackablaze/command.rb +25 -0
- data/lib/trackablaze/tracker.rb +73 -0
- data/lib/trackablaze/utils.rb +15 -0
- data/lib/trackablaze.rb +8 -0
- data/spec/spec_helper.rb +11 -0
- data/trackers/facebook_page.rb +39 -0
- data/trackers/facebook_page.yml +12 -0
- data/trackers/twitter.rb +40 -0
- data/trackers/twitter.yml +14 -0
- data/version.rb +3 -0
- metadata +155 -0
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,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
|
data/lib/trackablaze.rb
ADDED
data/spec/spec_helper.rb
ADDED
@@ -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
|
+
|
data/trackers/twitter.rb
ADDED
@@ -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
|
+
|
data/version.rb
ADDED
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
|