rugalytics 0.1.6 → 0.1.7

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,3 +1,5 @@
1
+ v0.1.7. rugalytics server, rugrat greasemonkey script
2
+
1
3
  v0.1.6. better fix for double quotes in csv causing fastercsv to fail
2
4
 
3
5
  v0.1.5. fixes for bad quotes in csv causing fastercsv to fail
data/Manifest CHANGED
@@ -6,6 +6,7 @@ lib/rugalytics/item.rb
6
6
  lib/rugalytics/profile.rb
7
7
  lib/rugalytics/report.rb
8
8
  lib/rugalytics/server.rb
9
+ lib/rugalytics/rugrat.user.js
9
10
  lib/rugalytics.rb
10
11
  LICENSE
11
12
  Manifest
data/README CHANGED
@@ -88,7 +88,7 @@ In the report, there is a +pageviews_graph+ containing the points:
88
88
  => [[Mon, 01 Jan 2007, 8200], [Tue, 02 Jan 2007, 8400]]
89
89
 
90
90
 
91
- == What Reports are There?
91
+ == Lots of Reports!
92
92
 
93
93
  The report name comes from the Google Analytics URL for a CSV report export.
94
94
  The report name is the rpt parameter from the URL, e.g. 'Pageviews' or
@@ -234,6 +234,49 @@ automatically, e.g.:
234
234
  top_items_over_week = report.items.sort_by{|i| i.unique_pageviews.to_i}.reverse
235
235
 
236
236
 
237
+ ==Rugalytics on Rugrat - a Greasemonkey script for Firefox
238
+
239
+ TO INSTALL:
240
+
241
+ Create a rugalytics.yml config file containing:
242
+
243
+ ---
244
+ account: your_account_name
245
+ profile: your_profile_name
246
+ username: your_user_name
247
+ password: your_pass_w
248
+
249
+
250
+ Run rugalytics executable on console in same directory as rugalytics.yml:
251
+
252
+ > rugalytics
253
+
254
+
255
+ Add Greasemonkey to Firefox:
256
+ https://addons.mozilla.org/firefox/748/
257
+
258
+ Go to:
259
+ http://localhost:8888/
260
+
261
+ Add rugrat user script:
262
+ http://localhost:8888/rugrat.user.js
263
+
264
+ Configure website for rugrat to run over:
265
+
266
+ Firefox -> Tools -> Greasemonkey -> Manage User Scripts
267
+ -> select rugrat -> press "Add"
268
+ -> add your site, e.g. http://your_site.com/*
269
+ -> press "Close"
270
+
271
+ Browse your site!
272
+
273
+
274
+ ==Ruby Manor Presentation Slides - Nov 2008
275
+
276
+ Rugalytics - making a Ruby API to Google Analytics data - presentation slides from Ruby Manor 2008:
277
+ http://www.slideshare.net/delineator/rugalytics-ruby-manor-nov-2008-presentation/
278
+
279
+
237
280
  ==Acknowledgements
238
281
 
239
282
  Rugalytics started life as a fork of jnunemaker's Statwhore. As the code and
data/README.rdoc CHANGED
@@ -88,7 +88,7 @@ In the report, there is a +pageviews_graph+ containing the points:
88
88
  => [[Mon, 01 Jan 2007, 8200], [Tue, 02 Jan 2007, 8400]]
89
89
 
90
90
 
91
- == What Reports are There?
91
+ == Lots of Reports!
92
92
 
93
93
  The report name comes from the Google Analytics URL for a CSV report export.
94
94
  The report name is the rpt parameter from the URL, e.g. 'Pageviews' or
@@ -234,6 +234,49 @@ automatically, e.g.:
234
234
  top_items_over_week = report.items.sort_by{|i| i.unique_pageviews.to_i}.reverse
235
235
 
236
236
 
237
+ ==Rugalytics on Rugrat - a Greasemonkey script for Firefox
238
+
239
+ TO INSTALL:
240
+
241
+ Create a rugalytics.yml config file containing:
242
+
243
+ ---
244
+ account: your_account_name
245
+ profile: your_profile_name
246
+ username: your_user_name
247
+ password: your_pass_w
248
+
249
+
250
+ Run rugalytics executable on console in same directory as rugalytics.yml:
251
+
252
+ > rugalytics
253
+
254
+
255
+ Add Greasemonkey to Firefox:
256
+ https://addons.mozilla.org/firefox/748/
257
+
258
+ Go to:
259
+ http://localhost:8888/
260
+
261
+ Add rugrat user script:
262
+ http://localhost:8888/rugrat.user.js
263
+
264
+ Configure website for rugrat to run over:
265
+
266
+ Firefox -> Tools -> Greasemonkey -> Manage User Scripts
267
+ -> select rugrat -> press "Add"
268
+ -> add your site, e.g. http://your_site.com/*
269
+ -> press "Close"
270
+
271
+ Browse your site!
272
+
273
+
274
+ ==Ruby Manor Presentation Slides - Nov 2008
275
+
276
+ Rugalytics - making a Ruby API to Google Analytics data - presentation slides from Ruby Manor 2008:
277
+ http://www.slideshare.net/delineator/rugalytics-ruby-manor-nov-2008-presentation/
278
+
279
+
237
280
  ==Acknowledgements
238
281
 
239
282
  Rugalytics started life as a fork of jnunemaker's Statwhore. As the code and
data/Rakefile CHANGED
@@ -10,7 +10,7 @@ begin
10
10
  m.rubyforge_name = "rugalytics"
11
11
  m.rdoc_options << '--inline-source'
12
12
  m.rdoc_pattern = ["README", "CHANGELOG", "LICENSE"]
13
- m.dependencies = ["hpricot >=0.6", "activesupport >=2.0.2", "googlebase >=0.2.0", "morph >=0.2.0", "fastercsv >=1.4.0"]
13
+ m.dependencies = ["hpricot >=0.6", "activesupport >=2.0.2", "googlebase >=0.2.0", "morph >=0.2.0", "fastercsv >=1.4.0", "rack >=0.4.0"]
14
14
  m.executable_pattern = 'bin/rugalytics'
15
15
  end
16
16
 
@@ -1,14 +1,11 @@
1
1
  module Rugalytics
2
-
3
2
  class Item
4
3
  include Morph
5
4
 
6
- def initialize attributes, values, base_url
7
- attributes.each_with_index do |attribute, index|
8
- attribute.sub!('$','dollar')
9
- attribute.sub!('/',' per ')
10
- attribute.sub!('.',' ')
11
- attribute.sub!(/page views/i,'pageviews')
5
+ def initialize labels, values, base_url
6
+ labels.each_with_index do
7
+ |label, index|
8
+ attribute = normalize(label)
12
9
  value = values[index]
13
10
  morph(attribute, value)
14
11
  end
@@ -19,6 +16,15 @@ module Rugalytics
19
16
  self.url = "http://#{base_url}#{page}"
20
17
  end
21
18
  end
19
+
20
+ private
21
+ def normalize label
22
+ label.sub!('$','dollar')
23
+ label.sub!('/',' per ')
24
+ label.sub!('.',' ')
25
+ label.sub!(/page views/i,'pageviews')
26
+ label
27
+ end
22
28
  end
23
29
 
24
30
  end
@@ -89,6 +89,14 @@ module Rugalytics
89
89
  }
90
90
  params[:d1] = options[:url] if options[:url]
91
91
  params[:d1] = options[:page_title] if options[:page_title]
92
+ if options[:keywords]
93
+ params[:d1] = options[:keywords].gsub(' ','+')
94
+ params[:seg] = '1'
95
+ params[:segkey] = options[:segment] ? options[:segment] : 'organization'
96
+ end
97
+ if options[:value]
98
+ params[:gval] = options[:value]
99
+ end
92
100
  params
93
101
  end
94
102
 
@@ -14,8 +14,12 @@ module Rugalytics
14
14
  handle_tables lines
15
15
  end
16
16
 
17
+ def attributes
18
+ morph_attributes.delete_if {|k,v| v.nil?}.stringify_keys
19
+ end
20
+
17
21
  def attribute_names
18
- Report.morph_methods.select {|m| m[/[a-z]$/]}.select {|m| send(m.to_sym)}
22
+ attributes.keys
19
23
  end
20
24
 
21
25
  def method_missing symbol, *args
@@ -98,9 +102,9 @@ module Rugalytics
98
102
  begin
99
103
  values = FasterCSV.parse_line(values_line)
100
104
  rescue Exception => e
101
- values_line.gsub!(/""/,'$$')
105
+ values_line.gsub!(/""/,'^$$^')
102
106
  values = FasterCSV.parse_line(values_line)
103
- values.each {|v| v.gsub!('$$','"')}
107
+ values.each {|v| v.gsub!('^$$^','"')}
104
108
  end
105
109
  items << Item.new(attributes, values, base_url)
106
110
  index = index.next
@@ -0,0 +1,165 @@
1
+ // ==UserScript==
2
+ // @name rugrat
3
+ // @namespace github.com/robmckinnon/rugalytics
4
+ // @description a mousehole to google analytics data
5
+ // @include http://your_website/*
6
+ // ==/UserScript==
7
+
8
+ window.Rugrat = function() {;}
9
+
10
+ window.Rugrat.prototype = {
11
+
12
+ replace_all: function(text, old, replace) {
13
+ while(text.indexOf(old) > 0) { text = text.replace(old,replace); }
14
+ return text;
15
+ },
16
+
17
+ keyword_grab: function(keywords, keyword_id, segment) {
18
+ var the_url = "http://localhost:8888/keyword_detail?keywords="+keywords+"&segment="+segment;
19
+ GM_log(the_url);
20
+ var base = this;
21
+ GM_xmlhttpRequest({
22
+ method:"GET",
23
+ url: the_url,
24
+ headers:{
25
+ "User-Agent":"Mozilla/5.0",
26
+ "Accept":"application/json"
27
+ },
28
+ onload:function(response) {
29
+ var status = base.replace_all(response.statusText,' ','');
30
+ if (status == 'OK') {
31
+ var json = response.responseText;
32
+ var data = eval('(' + json + ')');
33
+ base.display_keywords(data, keyword_id, segment);
34
+ }
35
+ }
36
+ });
37
+ },
38
+
39
+ display_keywords: function(data, keyword_id, segment) {
40
+ var items = data.items;
41
+ var comma = '';
42
+ for (var i in items) {
43
+ var item = items[i];
44
+ var name = 'red';
45
+
46
+ if (segment == 'city') {
47
+ name = item.city;
48
+ } else {
49
+ name = item.network_location;
50
+ }
51
+ if (segment == 'city' || (name.indexOf('mini') >= 0 || name.indexOf('trea') >= 0) ) {
52
+ var element = document.getElementById(keyword_id);
53
+ var html = element.innerHTML;
54
+ element.innerHTML = html + comma + ' <small>'+ name +'</small>';
55
+ comma = ',';
56
+ }
57
+ }
58
+ },
59
+
60
+ data_grab: function() {
61
+ var pathname = window.location.pathname;
62
+ var the_url = "http://localhost:8888/top_content_detail_keywords?url="+pathname;
63
+ GM_log(the_url);
64
+ var base = this;
65
+ GM_xmlhttpRequest({
66
+ method:"GET",
67
+ url: the_url,
68
+ headers:{
69
+ "User-Agent":"Mozilla/5.0",
70
+ "Accept":"application/json"
71
+ },
72
+ onload:function(response) {
73
+ var status = base.replace_all(response.statusText,' ','');
74
+ if (status == 'OK') {
75
+ var json = response.responseText;
76
+ var data = eval('(' + json + ')');
77
+ base.display_data(data);
78
+ }
79
+ }
80
+ });
81
+ },
82
+
83
+ grab_unique_page_views: function() {
84
+ var pathname = window.location.pathname;
85
+ var the_url = "http://localhost:8888/top_content_detail?value=unique_pageviews&url="+pathname;
86
+ GM_log(the_url);
87
+ var base = this;
88
+ GM_xmlhttpRequest({
89
+ method:"GET",
90
+ url: the_url,
91
+ headers:{
92
+ "User-Agent":"Mozilla/5.0",
93
+ "Accept":"application/json"
94
+ },
95
+ onload:function(response) {
96
+ var status = base.replace_all(response.statusText,' ','');
97
+ if (status == 'OK') {
98
+ var json = response.responseText;
99
+ var data = eval('(' + json + ')');
100
+ base.display_unique_page_views(data);
101
+ }
102
+ }
103
+ });
104
+ },
105
+
106
+ display_unique_page_views: function(data) {
107
+ var visits = data.unique_pageviews_graph.points;
108
+ var max = Math.max.apply( Math, visits) * 1.2;
109
+ var points = visits.join(',');
110
+ var sparkline = 'http://chart.apis.google.com/chart?chs=200x40&cht=ls&chds=0,' + max + '&chco=0077CC&chm=B,E6F2FA,0,0,0&chls=1,0,0&chd=t:'+points;
111
+ var img = '<img style="vertical-align: middle;border: none;width:200px; height:40px;" src="' + sparkline + '"></img>';
112
+
113
+ var element = document.getElementById("r_unique_page_views");
114
+ element.innerHTML = img + ' ' + data.unique_pageviews_total;
115
+ },
116
+
117
+ display_data: function(data) {
118
+ var lines = '';
119
+
120
+ lines += '<h3 style="margin-top: 0.5em;">Unique Page Views</h3>';
121
+ lines += '<span id="r_unique_page_views" style="width:200px; height:40px;"></span>';
122
+ lines += '<h3 style="margin-top: 0.5em;">Entrance keywords</h3>';
123
+
124
+ for (var i in data.items) {
125
+ var item = data.items[i];
126
+ var url = '';
127
+ var keywords = item.keyword;
128
+ lines += '<p id="x' + i + '" style="margin : 0.5em; font-size: 0.75em"><a href="'+url+'" style="text-decoration: none;">' + keywords + '</a> (' + item.unique_pageviews + ')</p>';
129
+ }
130
+
131
+ var menudiv = document.createElement('div');
132
+ menudiv.style.position = 'fixed';
133
+ menudiv.style.top = '5px';
134
+ menudiv.style.left = '55%';
135
+ menudiv.style.padding = '10px';
136
+ menudiv.style.backgroundColor = '#fff';
137
+ menudiv.style.border="2px solid";
138
+ menudiv.zIndex = '3';
139
+ // menudiv.style.display='none';
140
+
141
+ var menuobj = document.createElement('div');
142
+ menuobj.innerHTML = lines;
143
+ menudiv.appendChild(menuobj);
144
+
145
+ var content = document.getElementById('content');
146
+ content.appendChild(menudiv);
147
+
148
+ this.grab_unique_page_views();
149
+ for (var i in data.items) {
150
+ var keywords = data.items[i].keyword;
151
+ this.keyword_grab(keywords, 'x'+i, 'city');
152
+ this.keyword_grab(keywords, 'x'+i, 'organization');
153
+ }
154
+ },
155
+
156
+ init: function() {
157
+ this.data_grab();
158
+ }
159
+ };
160
+
161
+ window.addEventListener("load", function () {
162
+ var ahole = new window.Rugrat();
163
+ ahole.init();
164
+ }, false);
165
+
@@ -1,42 +1,67 @@
1
- require 'webrick'
2
- include WEBrick
1
+ require 'rack'
3
2
 
4
3
  module Rugalytics
5
-
6
- class Servlet < HTTPServlet::AbstractServlet
7
- def do_GET(req, res)
8
- res.body = "<HTML>hello, world.</HTML>"
9
- res['Content-Type'] = "text/html"
10
- end
11
- end
12
-
13
4
  class Server
14
5
  def initialize
15
- begin
16
- require 'webrick'
17
- self.class.send(:include, WEBrick)
18
- rescue LoadError
19
- puts "You need to have webrick installed to run a rugalytics server"
20
- end
21
-
22
6
  @profile = Rugalytics.default_profile
23
7
  @reports = {}
8
+ Rack::Handler::WEBrick.run(self, :Port=>8888)
9
+ end
24
10
 
25
- server = HTTPServer.new :Port => 8888
11
+ def call(env)
12
+ path = env['PATH_INFO'].tr('/','')
26
13
 
27
- server.mount("/", Rugalytics::Servlet)
14
+ if path.empty?
15
+ html = %Q|
16
+ <h1>Rugalytics on Rugrat</h1>
17
+ <p>TO INSTALL:</p>
18
+ <p>Add Greasemonkey to Firefox: <a href="https://addons.mozilla.org/firefox/748/">https://addons.mozilla.org/firefox/748/</a></p>
19
+ <p>Add rugrat user script: <a href="http://localhost:8888/rugrat.user.js">rugrat.user.js</a></p>
20
+ <p>Configure site for rugrat to run on:</p>
21
+ <p><code>Tools -&gt; Greasemonkey -&gt; Manage User Scripts</code><br/>
22
+ <code>-&gt; select rugrat -&gt; press "Add" -&gt; add your site, e.g. http://your_site.com/* -&gt; press "Close"</code></p>
23
+ <p>Create a rugalytics.yml config file containing:</p><pre>
24
+ ---
25
+ account: your_account_name
26
+ profile: your_profile_name
27
+ username: your_user_name
28
+ password: your_pass_w
28
29
 
29
- server.mount_proc("/top_content_detail_keywords") {|request, response|
30
- url = request.query['url']
31
- @reports[url] ||= @profile.top_content_detail_keywords_report(:url => url)
32
- items = @reports[url].items
33
- data = {:url =>url, :report_name=>@reports[url].name, :items=>items}
34
- response.body = data.to_json
35
- response['Content-Type'] = "application/json"
36
- }
30
+ </pre>
31
+ <p>Run rugalytics on console in same directory as rugalytics.yml:</p>
32
+ <p><code>&gt; rugalytics</code></p>
33
+ <p>Browse your site!</p>|
34
+ [200, {'Content-Type' => "text/html"}, html]
35
+ elsif path == 'rugrat.user.js'
36
+ [200, {'Content-Type' => "application/json"}, File.new(File.dirname(__FILE__)+'/rugrat.user.js').readlines ]
37
+ else
38
+ request = Rack::Request.new(env)
39
+ report_name = (path + '_report').to_sym
40
+ send_data(report_name, request.GET.symbolize_keys)
41
+ end
42
+ end
37
43
 
38
- trap("INT"){ server.shutdown }
39
- server.start
44
+ def send_data report_name, params
45
+ key = (params.values << report_name).join('')
46
+ @reports[key] ||= @profile.send(report_name, params)
47
+ report = @reports[key]
48
+
49
+ json = report.attributes.to_json
50
+ add_in_front params, json
51
+ report.attribute_names.each do |name|
52
+ if name[/(.*)pageviews_graph/]
53
+ total = "#{$1}pageviews_total".to_sym
54
+ add_in_front({total => report.send(total)}, json)
55
+ end
56
+ end
57
+ add_in_front({:report_name => report.name}, json)
58
+
59
+ [200, {'Content-Type' => "application/json"}, json ]
40
60
  end
61
+
62
+ private
63
+ def add_in_front hash, json
64
+ json.sub!('{', hash.to_json.chomp("}") + ', ' ) unless hash.empty?
65
+ end
41
66
  end
42
67
  end
data/lib/rugalytics.rb CHANGED
@@ -12,7 +12,7 @@ require 'fastercsv'
12
12
 
13
13
  # See README for usage documentation.
14
14
  module Rugalytics
15
- VERSION = "0.1.6"
15
+ VERSION = "0.1.7"
16
16
 
17
17
  FORMAT_PDF = '0' unless defined? FORMAT_PDF
18
18
  FORMAT_XML = '1' unless defined? FORMAT_XML
@@ -104,3 +104,5 @@ require File.dirname(__FILE__) + '/rugalytics/graph'
104
104
  require File.dirname(__FILE__) + '/rugalytics/server'
105
105
 
106
106
  # Rugalytics.config_setup(RAILS_ROOT) if defined?(RAILS_ROOT) && RAILS_ROOT
107
+
108
+ # Rugalytics::Server.new
data/rugalytics.gemspec CHANGED
@@ -2,17 +2,17 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{rugalytics}
5
- s.version = "0.1.6"
5
+ s.version = "0.1.7"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Rob McKinnon"]
9
- s.date = %q{2008-11-21}
9
+ s.date = %q{2008-12-02}
10
10
  s.default_executable = %q{rugalytics}
11
11
  s.description = %q{Rugalytics is a Ruby API for Google Analytics.}
12
12
  s.email = ["rob ~@nospam@~ rubyforge.org"]
13
13
  s.executables = ["rugalytics"]
14
14
  s.extra_rdoc_files = ["CHANGELOG", "LICENSE", "README"]
15
- s.files = ["CHANGELOG", "lib/rugalytics/account.rb", "lib/rugalytics/connection.rb", "lib/rugalytics/graph.rb", "lib/rugalytics/item.rb", "lib/rugalytics/profile.rb", "lib/rugalytics/report.rb", "lib/rugalytics/server.rb", "lib/rugalytics.rb", "LICENSE", "Manifest", "README", "README.rdoc", "bin/rugalytics", "rugalytics.yml.example", "spec/fixtures/analytics_account_find_all.html", "spec/fixtures/analytics_profile_find_all.html", "spec/fixtures/dashboard_report_webgroup.xml", "spec/lib/rugalytics/account_spec.rb", "spec/lib/rugalytics/graph_spec.rb", "spec/lib/rugalytics/item_spec.rb", "spec/lib/rugalytics/profile_spec.rb", "spec/lib/rugalytics/report_spec.rb", "spec/lib/rugalytics_spec.rb", "spec/spec.opts", "spec/spec_helper.rb", "rugalytics.gemspec", "Rakefile"]
15
+ s.files = ["CHANGELOG", "lib/rugalytics/account.rb", "lib/rugalytics/connection.rb", "lib/rugalytics/graph.rb", "lib/rugalytics/item.rb", "lib/rugalytics/profile.rb", "lib/rugalytics/report.rb", "lib/rugalytics/server.rb", "lib/rugalytics/rugrat.user.js", "lib/rugalytics.rb", "LICENSE", "Manifest", "README", "README.rdoc", "bin/rugalytics", "rugalytics.yml.example", "spec/fixtures/analytics_account_find_all.html", "spec/fixtures/analytics_profile_find_all.html", "spec/fixtures/dashboard_report_webgroup.xml", "spec/lib/rugalytics/account_spec.rb", "spec/lib/rugalytics/graph_spec.rb", "spec/lib/rugalytics/item_spec.rb", "spec/lib/rugalytics/profile_spec.rb", "spec/lib/rugalytics/report_spec.rb", "spec/lib/rugalytics_spec.rb", "spec/spec.opts", "spec/spec_helper.rb", "rugalytics.gemspec", "Rakefile"]
16
16
  s.has_rdoc = true
17
17
  s.homepage = %q{}
18
18
  s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Rugalytics", "--main", "README", "--inline-source"]
@@ -31,6 +31,7 @@ Gem::Specification.new do |s|
31
31
  s.add_runtime_dependency(%q<googlebase>, [">= 0.2.0"])
32
32
  s.add_runtime_dependency(%q<morph>, [">= 0.2.0"])
33
33
  s.add_runtime_dependency(%q<fastercsv>, [">= 1.4.0"])
34
+ s.add_runtime_dependency(%q<rack>, [">= 0.4.0"])
34
35
  s.add_development_dependency(%q<echoe>, [">= 0"])
35
36
  else
36
37
  s.add_dependency(%q<hpricot>, [">= 0.6"])
@@ -38,6 +39,7 @@ Gem::Specification.new do |s|
38
39
  s.add_dependency(%q<googlebase>, [">= 0.2.0"])
39
40
  s.add_dependency(%q<morph>, [">= 0.2.0"])
40
41
  s.add_dependency(%q<fastercsv>, [">= 1.4.0"])
42
+ s.add_dependency(%q<rack>, [">= 0.4.0"])
41
43
  s.add_dependency(%q<echoe>, [">= 0"])
42
44
  end
43
45
  else
@@ -46,6 +48,7 @@ Gem::Specification.new do |s|
46
48
  s.add_dependency(%q<googlebase>, [">= 0.2.0"])
47
49
  s.add_dependency(%q<morph>, [">= 0.2.0"])
48
50
  s.add_dependency(%q<fastercsv>, [">= 1.4.0"])
51
+ s.add_dependency(%q<rack>, [">= 0.4.0"])
49
52
  s.add_dependency(%q<echoe>, [">= 0"])
50
53
  end
51
54
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rugalytics
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.6
4
+ version: 0.1.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rob McKinnon
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-11-21 00:00:00 +00:00
12
+ date: 2008-12-02 00:00:00 +00:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -62,6 +62,16 @@ dependencies:
62
62
  - !ruby/object:Gem::Version
63
63
  version: 1.4.0
64
64
  version:
65
+ - !ruby/object:Gem::Dependency
66
+ name: rack
67
+ type: :runtime
68
+ version_requirement:
69
+ version_requirements: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - ">="
72
+ - !ruby/object:Gem::Version
73
+ version: 0.4.0
74
+ version:
65
75
  - !ruby/object:Gem::Dependency
66
76
  name: echoe
67
77
  type: :development
@@ -92,6 +102,7 @@ files:
92
102
  - lib/rugalytics/profile.rb
93
103
  - lib/rugalytics/report.rb
94
104
  - lib/rugalytics/server.rb
105
+ - lib/rugalytics/rugrat.user.js
95
106
  - lib/rugalytics.rb
96
107
  - LICENSE
97
108
  - Manifest