rugalytics 0.1.6 → 0.1.7

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/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