rugalytics 0.1.1 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +2 -0
- data/README +51 -17
- data/README.rdoc +51 -17
- data/lib/rugalytics/profile.rb +50 -4
- data/lib/rugalytics/report.rb +1 -0
- data/lib/rugalytics.rb +8 -1
- data/rugalytics.gemspec +42 -133
- data/spec/lib/rugalytics/profile_spec.rb +100 -2
- data/spec/lib/rugalytics/report_spec.rb +21 -5
- metadata +4 -4
data/CHANGELOG
CHANGED
data/README
CHANGED
@@ -84,15 +84,40 @@ In the report, there is a +pageviews_graph+ containing the points:
|
|
84
84
|
=> [[Mon, 01 Jan 2007, 8200], [Tue, 02 Jan 2007, 8400]]
|
85
85
|
|
86
86
|
|
87
|
-
==
|
87
|
+
== What Reports are There?
|
88
88
|
|
89
|
-
The report name
|
90
|
-
|
89
|
+
The report name comes from the Google Analytics URL for a CSV report export.
|
90
|
+
The report name is the rpt parameter from the URL, e.g. 'Pageviews' or
|
91
|
+
'TrafficSources':
|
91
92
|
|
93
|
+
https://www.google.com/analytics/reporting/export?fmt=2&...&&rpt=PageviewsReport&...
|
92
94
|
https://www.google.com/analytics/reporting/export?fmt=2&...&&rpt=TrafficSourcesReport&...
|
93
95
|
|
94
|
-
|
95
|
-
the Export tab, and then mousing over the CSV option.
|
96
|
+
If you are logged in to the Analytics website, you can find the CSV URL by
|
97
|
+
clicking on the Export tab, and then mousing over the CSV option.
|
98
|
+
|
99
|
+
To discover a list of report names, there's a method on profile:
|
100
|
+
|
101
|
+
profile.report_names
|
102
|
+
=> ["ad_versions_report", "adwords_report", "all_sources_report",
|
103
|
+
"average_pageviews_report", "bounce_rate_report", "browsers_report",
|
104
|
+
"campaigns_report", "colors_report", "content_by_title_report",
|
105
|
+
"content_drilldown_report", "content_report", "dashboard_report",
|
106
|
+
"depth_of_visit_report", "direct_sources_report", "entrances_report",
|
107
|
+
"exits_report", "flash_report", "geo_map_report", "hostnames_report",
|
108
|
+
"java_report", "keyword_position_report", "keywords_report",
|
109
|
+
"languages_report", "length_of_visit_report", "loyalty_report",
|
110
|
+
"networks_report", "os_browsers_report", "pageviews_report",
|
111
|
+
"platforms_report", "recency_report", "referring_sources_report",
|
112
|
+
"resolutions_report", "search_engines_report", "speeds_report",
|
113
|
+
"time_on_site_report", "top_content_detail_keywords_report",
|
114
|
+
"top_content_detail_navigation_report", "top_content_detail_path_report",
|
115
|
+
"top_content_detail_sources_report", "top_content_report",
|
116
|
+
"traffic_sources_report", "unique_visitors_report",
|
117
|
+
"visitor_types_report", "visitors_overview_report", "visits_report"]
|
118
|
+
|
119
|
+
|
120
|
+
== Load a Report
|
96
121
|
|
97
122
|
Let's load the TrafficSources report:
|
98
123
|
|
@@ -136,17 +161,14 @@ Let's now grab 100 lines of the Networks report:
|
|
136
161
|
|
137
162
|
== Report by URL
|
138
163
|
|
139
|
-
|
164
|
+
Entrance search keywords by URL:
|
140
165
|
|
141
|
-
report = profile.
|
166
|
+
report = profile.top_content_detail_keywords_report(:url=>'/projects/abc')
|
142
167
|
report.name
|
143
|
-
=> "
|
168
|
+
=> "Entrance Keywords:,/projects/abc"
|
144
169
|
|
145
|
-
report.items.
|
146
|
-
=>
|
147
|
-
@percentage_exit="0.776536312849162", @time_on_page="165.75",
|
148
|
-
@pageviews="179", @path="/reports/", @dollar_index="0.0",
|
149
|
-
@url="http://your_site.com/projects/abc/reports/"
|
170
|
+
report.items.collect{|i| "#{i.keyword} (#{i.unique_pageviews})"}
|
171
|
+
=> ["project abc (200)", "abc project (110)"]
|
150
172
|
|
151
173
|
Pageviews by URL:
|
152
174
|
|
@@ -157,6 +179,18 @@ Pageviews by URL:
|
|
157
179
|
report.pageviews_total
|
158
180
|
=> 179
|
159
181
|
|
182
|
+
You can get a content drilldown report, for pages under a certain URL path:
|
183
|
+
|
184
|
+
report = profile.content_drilldown_report(:url => "/projects/abc/")
|
185
|
+
report.name
|
186
|
+
=> "Content Drilldown,/projects/abc/"
|
187
|
+
|
188
|
+
report.items.first
|
189
|
+
=> # Rugalytics::Item @bounce_rate="0.85", @unique_pageviews="155",
|
190
|
+
@percentage_exit="0.776536312849162", @time_on_page="165.75",
|
191
|
+
@pageviews="179", @path="/reports/", @dollar_index="0.0",
|
192
|
+
@url="http://your_site.com/projects/abc/reports/"
|
193
|
+
|
160
194
|
Pageviews by page title:
|
161
195
|
|
162
196
|
report = profile.content_by_title_detail_report(:page_title => "Project ABC | Company XYZ")
|
@@ -176,10 +210,10 @@ To use from Rails, make a config file rails_root/config/rugalytics.yml
|
|
176
210
|
with the following contents:
|
177
211
|
|
178
212
|
---
|
179
|
-
account:
|
180
|
-
profile:
|
181
|
-
username:
|
182
|
-
password:
|
213
|
+
account: your_account_name
|
214
|
+
profile: your_profile_name
|
215
|
+
username: your_user_name
|
216
|
+
password: your_pass_w
|
183
217
|
|
184
218
|
Remember to tell your source control system to ignore this file! If you're
|
185
219
|
using git, this means adding config/rugalytics.yml to your .gitignore
|
data/README.rdoc
CHANGED
@@ -84,15 +84,40 @@ In the report, there is a +pageviews_graph+ containing the points:
|
|
84
84
|
=> [[Mon, 01 Jan 2007, 8200], [Tue, 02 Jan 2007, 8400]]
|
85
85
|
|
86
86
|
|
87
|
-
==
|
87
|
+
== What Reports are There?
|
88
88
|
|
89
|
-
The report name
|
90
|
-
|
89
|
+
The report name comes from the Google Analytics URL for a CSV report export.
|
90
|
+
The report name is the rpt parameter from the URL, e.g. 'Pageviews' or
|
91
|
+
'TrafficSources':
|
91
92
|
|
93
|
+
https://www.google.com/analytics/reporting/export?fmt=2&...&&rpt=PageviewsReport&...
|
92
94
|
https://www.google.com/analytics/reporting/export?fmt=2&...&&rpt=TrafficSourcesReport&...
|
93
95
|
|
94
|
-
|
95
|
-
the Export tab, and then mousing over the CSV option.
|
96
|
+
If you are logged in to the Analytics website, you can find the CSV URL by
|
97
|
+
clicking on the Export tab, and then mousing over the CSV option.
|
98
|
+
|
99
|
+
To discover a list of report names, there's a method on profile:
|
100
|
+
|
101
|
+
profile.report_names
|
102
|
+
=> ["ad_versions_report", "adwords_report", "all_sources_report",
|
103
|
+
"average_pageviews_report", "bounce_rate_report", "browsers_report",
|
104
|
+
"campaigns_report", "colors_report", "content_by_title_report",
|
105
|
+
"content_drilldown_report", "content_report", "dashboard_report",
|
106
|
+
"depth_of_visit_report", "direct_sources_report", "entrances_report",
|
107
|
+
"exits_report", "flash_report", "geo_map_report", "hostnames_report",
|
108
|
+
"java_report", "keyword_position_report", "keywords_report",
|
109
|
+
"languages_report", "length_of_visit_report", "loyalty_report",
|
110
|
+
"networks_report", "os_browsers_report", "pageviews_report",
|
111
|
+
"platforms_report", "recency_report", "referring_sources_report",
|
112
|
+
"resolutions_report", "search_engines_report", "speeds_report",
|
113
|
+
"time_on_site_report", "top_content_detail_keywords_report",
|
114
|
+
"top_content_detail_navigation_report", "top_content_detail_path_report",
|
115
|
+
"top_content_detail_sources_report", "top_content_report",
|
116
|
+
"traffic_sources_report", "unique_visitors_report",
|
117
|
+
"visitor_types_report", "visitors_overview_report", "visits_report"]
|
118
|
+
|
119
|
+
|
120
|
+
== Load a Report
|
96
121
|
|
97
122
|
Let's load the TrafficSources report:
|
98
123
|
|
@@ -136,17 +161,14 @@ Let's now grab 100 lines of the Networks report:
|
|
136
161
|
|
137
162
|
== Report by URL
|
138
163
|
|
139
|
-
|
164
|
+
Entrance search keywords by URL:
|
140
165
|
|
141
|
-
report = profile.
|
166
|
+
report = profile.top_content_detail_keywords_report(:url=>'/projects/abc')
|
142
167
|
report.name
|
143
|
-
=> "
|
168
|
+
=> "Entrance Keywords:,/projects/abc"
|
144
169
|
|
145
|
-
report.items.
|
146
|
-
=>
|
147
|
-
@percentage_exit="0.776536312849162", @time_on_page="165.75",
|
148
|
-
@pageviews="179", @path="/reports/", @dollar_index="0.0",
|
149
|
-
@url="http://your_site.com/projects/abc/reports/"
|
170
|
+
report.items.collect{|i| "#{i.keyword} (#{i.unique_pageviews})"}
|
171
|
+
=> ["project abc (200)", "abc project (110)"]
|
150
172
|
|
151
173
|
Pageviews by URL:
|
152
174
|
|
@@ -157,6 +179,18 @@ Pageviews by URL:
|
|
157
179
|
report.pageviews_total
|
158
180
|
=> 179
|
159
181
|
|
182
|
+
You can get a content drilldown report, for pages under a certain URL path:
|
183
|
+
|
184
|
+
report = profile.content_drilldown_report(:url => "/projects/abc/")
|
185
|
+
report.name
|
186
|
+
=> "Content Drilldown,/projects/abc/"
|
187
|
+
|
188
|
+
report.items.first
|
189
|
+
=> # Rugalytics::Item @bounce_rate="0.85", @unique_pageviews="155",
|
190
|
+
@percentage_exit="0.776536312849162", @time_on_page="165.75",
|
191
|
+
@pageviews="179", @path="/reports/", @dollar_index="0.0",
|
192
|
+
@url="http://your_site.com/projects/abc/reports/"
|
193
|
+
|
160
194
|
Pageviews by page title:
|
161
195
|
|
162
196
|
report = profile.content_by_title_detail_report(:page_title => "Project ABC | Company XYZ")
|
@@ -176,10 +210,10 @@ To use from Rails, make a config file rails_root/config/rugalytics.yml
|
|
176
210
|
with the following contents:
|
177
211
|
|
178
212
|
---
|
179
|
-
account:
|
180
|
-
profile:
|
181
|
-
username:
|
182
|
-
password:
|
213
|
+
account: your_account_name
|
214
|
+
profile: your_profile_name
|
215
|
+
username: your_user_name
|
216
|
+
password: your_pass_w
|
183
217
|
|
184
218
|
Remember to tell your source control system to ignore this file! If you're
|
185
219
|
using git, this means adding config/rugalytics.yml to your .gitignore
|
data/lib/rugalytics/profile.rb
CHANGED
@@ -3,7 +3,7 @@ module Rugalytics
|
|
3
3
|
|
4
4
|
class << self
|
5
5
|
def find_all(account_id)
|
6
|
-
doc = Hpricot
|
6
|
+
doc = Hpricot get("https://www.google.com:443/analytics/settings/home?scid=#{account_id}")
|
7
7
|
(doc/'select[@id=profile] option').inject([]) do |profiles, option|
|
8
8
|
profile_id = option['value'].to_i
|
9
9
|
profiles << Profile.new(:account_id => account_id, :profile_id => profile_id, :name => option.inner_html) if profile_id > 0
|
@@ -27,6 +27,39 @@ module Rugalytics
|
|
27
27
|
@profile_id = attrs[:profile_id] if attrs.has_key?(:profile_id)
|
28
28
|
end
|
29
29
|
|
30
|
+
def report_names
|
31
|
+
unless @report_names
|
32
|
+
html = Profile.get("https://www.google.com/analytics/reporting/?scid=#{profile_id}")
|
33
|
+
# reports = html.scan(/rpt=([A-Za-z]+)("|&)/)
|
34
|
+
reports = html.scan(/changeReport\(&(#39|quot);([a-z_]+)&(#39|quot);/)
|
35
|
+
|
36
|
+
non_report_names = ['goal_intro', 'add_segment', 'customs_overview',
|
37
|
+
'manage_emails', 'manage_segments', 'user_defined', 'audio',
|
38
|
+
'custom_reports_overview', 'site_search_intro', 'tv']
|
39
|
+
names = reports.collect { |name| name[1] } - non_report_names
|
40
|
+
more_names = []
|
41
|
+
|
42
|
+
names.each do |name|
|
43
|
+
html = Profile.get("https://www.google.com/analytics/reporting/#{name}?id=#{profile_id}")
|
44
|
+
reports = html.scan(/changeReport\(&(#39|quot);([a-z_]+)&(#39|quot);/)
|
45
|
+
more_names += reports.collect { |name| name[1] }
|
46
|
+
end
|
47
|
+
|
48
|
+
names += more_names
|
49
|
+
names -= non_report_names
|
50
|
+
names = names.collect do |name|
|
51
|
+
name = name.sub(/^maps$/,'geo_map').sub(/^sources$/,'traffic_sources')
|
52
|
+
name = name.sub(/^visitors$/,'visitors_overview')
|
53
|
+
name = name.sub(/^content_detail_(.*)$/,'top_content_detail_\1')
|
54
|
+
name = name.sub(/^content_titles$/,'content_by_title')
|
55
|
+
"#{name}_report"
|
56
|
+
end
|
57
|
+
|
58
|
+
@report_names = names.uniq.sort
|
59
|
+
end
|
60
|
+
@report_names
|
61
|
+
end
|
62
|
+
|
30
63
|
def method_missing symbol, *args
|
31
64
|
if name = symbol.to_s[/^(.+)_report$/, 1]
|
32
65
|
options = args && args.size == 1 ? args[0] : {}
|
@@ -79,6 +112,11 @@ module Rugalytics
|
|
79
112
|
:gdfmt => 'nth_day',
|
80
113
|
:view => 0
|
81
114
|
})
|
115
|
+
if options[:report] == 'GeoMap'
|
116
|
+
options.delete(:tab)
|
117
|
+
options.delete(:gdfmt)
|
118
|
+
options.delete(:rows)
|
119
|
+
end
|
82
120
|
options[:from] = ensure_datetime_in_google_format(options[:from])
|
83
121
|
options[:to] = ensure_datetime_in_google_format(options[:to])
|
84
122
|
options
|
@@ -123,9 +161,17 @@ module Rugalytics
|
|
123
161
|
private
|
124
162
|
|
125
163
|
def create_report(name, options={})
|
126
|
-
|
127
|
-
|
128
|
-
|
164
|
+
options = options.merge({:report=>name})
|
165
|
+
csv = get_report_csv(options)
|
166
|
+
begin
|
167
|
+
report = Rugalytics::Report.new csv
|
168
|
+
puts report.attribute_names
|
169
|
+
report
|
170
|
+
rescue Exception => e
|
171
|
+
puts convert_options_to_uri_params(options).inspect
|
172
|
+
puts csv
|
173
|
+
raise e
|
174
|
+
end
|
129
175
|
end
|
130
176
|
end
|
131
177
|
end
|
data/lib/rugalytics/report.rb
CHANGED
data/lib/rugalytics.rb
CHANGED
@@ -11,7 +11,7 @@ require 'yaml'
|
|
11
11
|
|
12
12
|
# See README for usage documentation.
|
13
13
|
module Rugalytics
|
14
|
-
VERSION = "0.1.
|
14
|
+
VERSION = "0.1.2"
|
15
15
|
|
16
16
|
FORMAT_PDF = '0' unless defined? FORMAT_PDF
|
17
17
|
FORMAT_XML = '1' unless defined? FORMAT_XML
|
@@ -43,6 +43,13 @@ module Rugalytics
|
|
43
43
|
end
|
44
44
|
end
|
45
45
|
|
46
|
+
def reports
|
47
|
+
profile = Rugalytics.default_profile
|
48
|
+
names = profile.report_names
|
49
|
+
puts names
|
50
|
+
names.collect {|n| puts ''; puts n; profile.send(n.to_sym)}
|
51
|
+
end
|
52
|
+
|
46
53
|
def default_profile
|
47
54
|
config_setup '.' unless config
|
48
55
|
if config && config.account
|
data/rugalytics.gemspec
CHANGED
@@ -1,137 +1,46 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
1
2
|
|
2
|
-
|
3
|
-
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = %q{rugalytics}
|
5
|
+
s.version = "0.1.2"
|
4
6
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
7
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
8
|
+
s.authors = ["Rob McKinnon"]
|
9
|
+
s.date = %q{2008-11-21}
|
10
|
+
s.description = %q{Rugalytics is a Ruby API for Google Analytics.}
|
11
|
+
s.email = ["rob ~@nospam@~ rubyforge.org"]
|
12
|
+
s.extra_rdoc_files = ["CHANGELOG", "LICENSE", "README"]
|
13
|
+
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.rb", "LICENSE", "Manifest", "README", "README.rdoc", "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"]
|
14
|
+
s.has_rdoc = true
|
15
|
+
s.homepage = %q{}
|
16
|
+
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Rugalytics", "--main", "README", "--inline-source"]
|
17
|
+
s.require_paths = ["lib"]
|
18
|
+
s.rubyforge_project = %q{rugalytics}
|
19
|
+
s.rubygems_version = %q{1.3.0}
|
20
|
+
s.summary = %q{Rugalytics is a Ruby API for Google Analytics.}
|
14
21
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
- !ruby/object:Gem::Dependency
|
19
|
-
name: hpricot
|
20
|
-
type: :runtime
|
21
|
-
version_requirement:
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - ">="
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: "0.6"
|
27
|
-
version:
|
28
|
-
- !ruby/object:Gem::Dependency
|
29
|
-
name: activesupport
|
30
|
-
type: :runtime
|
31
|
-
version_requirement:
|
32
|
-
version_requirements: !ruby/object:Gem::Requirement
|
33
|
-
requirements:
|
34
|
-
- - ">="
|
35
|
-
- !ruby/object:Gem::Version
|
36
|
-
version: 2.0.2
|
37
|
-
version:
|
38
|
-
- !ruby/object:Gem::Dependency
|
39
|
-
name: googlebase
|
40
|
-
type: :runtime
|
41
|
-
version_requirement:
|
42
|
-
version_requirements: !ruby/object:Gem::Requirement
|
43
|
-
requirements:
|
44
|
-
- - ">="
|
45
|
-
- !ruby/object:Gem::Version
|
46
|
-
version: 0.2.0
|
47
|
-
version:
|
48
|
-
- !ruby/object:Gem::Dependency
|
49
|
-
name: morph
|
50
|
-
type: :runtime
|
51
|
-
version_requirement:
|
52
|
-
version_requirements: !ruby/object:Gem::Requirement
|
53
|
-
requirements:
|
54
|
-
- - ">="
|
55
|
-
- !ruby/object:Gem::Version
|
56
|
-
version: 0.2.0
|
57
|
-
version:
|
58
|
-
- !ruby/object:Gem::Dependency
|
59
|
-
name: echoe
|
60
|
-
type: :development
|
61
|
-
version_requirement:
|
62
|
-
version_requirements: !ruby/object:Gem::Requirement
|
63
|
-
requirements:
|
64
|
-
- - ">="
|
65
|
-
- !ruby/object:Gem::Version
|
66
|
-
version: "0"
|
67
|
-
version:
|
68
|
-
description: Rugalytics is a Ruby API for Google Analytics.
|
69
|
-
email:
|
70
|
-
- rob ~@nospam@~ rubyforge.org
|
71
|
-
executables: []
|
22
|
+
if s.respond_to? :specification_version then
|
23
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
24
|
+
s.specification_version = 2
|
72
25
|
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
- spec/fixtures/analytics_profile_find_all.html
|
95
|
-
- spec/fixtures/dashboard_report_webgroup.xml
|
96
|
-
- spec/lib/rugalytics/account_spec.rb
|
97
|
-
- spec/lib/rugalytics/graph_spec.rb
|
98
|
-
- spec/lib/rugalytics/item_spec.rb
|
99
|
-
- spec/lib/rugalytics/profile_spec.rb
|
100
|
-
- spec/lib/rugalytics/report_spec.rb
|
101
|
-
- spec/lib/rugalytics_spec.rb
|
102
|
-
- spec/spec.opts
|
103
|
-
- spec/spec_helper.rb
|
104
|
-
- rugalytics.gemspec
|
105
|
-
- Rakefile
|
106
|
-
has_rdoc: true
|
107
|
-
homepage: ""
|
108
|
-
post_install_message:
|
109
|
-
rdoc_options:
|
110
|
-
- --line-numbers
|
111
|
-
- --inline-source
|
112
|
-
- --title
|
113
|
-
- Rugalytics
|
114
|
-
- --main
|
115
|
-
- README
|
116
|
-
- --inline-source
|
117
|
-
require_paths:
|
118
|
-
- lib
|
119
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
120
|
-
requirements:
|
121
|
-
- - ">="
|
122
|
-
- !ruby/object:Gem::Version
|
123
|
-
version: "0"
|
124
|
-
version:
|
125
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
126
|
-
requirements:
|
127
|
-
- - "="
|
128
|
-
- !ruby/object:Gem::Version
|
129
|
-
version: "1.2"
|
130
|
-
version:
|
131
|
-
requirements: []
|
132
|
-
|
133
|
-
rubyforge_project: rugalytics
|
134
|
-
rubygems_version: 1.2.0
|
135
|
-
specification_version: 2
|
136
|
-
summary: Rugalytics is a Ruby API for Google Analytics.
|
137
|
-
test_files: []
|
26
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
27
|
+
s.add_runtime_dependency(%q<hpricot>, [">= 0.6"])
|
28
|
+
s.add_runtime_dependency(%q<activesupport>, [">= 2.0.2"])
|
29
|
+
s.add_runtime_dependency(%q<googlebase>, [">= 0.2.0"])
|
30
|
+
s.add_runtime_dependency(%q<morph>, [">= 0.2.0"])
|
31
|
+
s.add_development_dependency(%q<echoe>, [">= 0"])
|
32
|
+
else
|
33
|
+
s.add_dependency(%q<hpricot>, [">= 0.6"])
|
34
|
+
s.add_dependency(%q<activesupport>, [">= 2.0.2"])
|
35
|
+
s.add_dependency(%q<googlebase>, [">= 0.2.0"])
|
36
|
+
s.add_dependency(%q<morph>, [">= 0.2.0"])
|
37
|
+
s.add_dependency(%q<echoe>, [">= 0"])
|
38
|
+
end
|
39
|
+
else
|
40
|
+
s.add_dependency(%q<hpricot>, [">= 0.6"])
|
41
|
+
s.add_dependency(%q<activesupport>, [">= 2.0.2"])
|
42
|
+
s.add_dependency(%q<googlebase>, [">= 0.2.0"])
|
43
|
+
s.add_dependency(%q<morph>, [">= 0.2.0"])
|
44
|
+
s.add_dependency(%q<echoe>, [">= 0"])
|
45
|
+
end
|
46
|
+
end
|
@@ -31,6 +31,98 @@ describe Profile do
|
|
31
31
|
end
|
32
32
|
end
|
33
33
|
|
34
|
+
describe 'finding report names' do
|
35
|
+
before do
|
36
|
+
@profile = Profile.new :profile_id=>123
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'should return list of reports linked from main profile page' do
|
40
|
+
report = {}
|
41
|
+
report[0] = 'os_browsers'
|
42
|
+
report[1] = 'colors'
|
43
|
+
report[2] = 'dashboard'
|
44
|
+
report[3] = 'visits'
|
45
|
+
report[4] = 'unique_visitors'
|
46
|
+
report[5] = 'pageviews'
|
47
|
+
report[6] = 'average_pageviews'
|
48
|
+
report[7] = 'time_on_site'
|
49
|
+
report[8] = 'bounce_rate'
|
50
|
+
report[9] = 'visitor_types'
|
51
|
+
report[10] = 'languages'
|
52
|
+
report[11] = 'networks'
|
53
|
+
report[13] = 'browsers'
|
54
|
+
report[14] = 'platforms'
|
55
|
+
report[15] = 'maps'
|
56
|
+
report[16] = 'sources'
|
57
|
+
report[17] = 'visitors'
|
58
|
+
report[18] = 'resolutions'
|
59
|
+
report[19] = 'java'
|
60
|
+
report[20] = 'flash'
|
61
|
+
report[21] = 'loyalty'
|
62
|
+
report[22] = 'recency'
|
63
|
+
report[23] = 'content'
|
64
|
+
html = %Q|<html><head><title>Visitors Overview - Google Analytics</title></head>
|
65
|
+
<body dir="ltr" class="report_body">
|
66
|
+
<a href="#" onclick="return VisualizationModule.changeReport('add_segment');">Create a new advanced segment</a>
|
67
|
+
<a href="#" id="f_managesegment_format" onclick="return VisualizationModule.changeReport('manage_segments');">Manage your advanced segments</a>
|
68
|
+
<b> Your report has been added.<a href="dashboard?id=321&pdr=20081020-20081119&cmp=average" onclick="return VisualizationModule.changeReport('#{report[2]}')">View Dashboard</a>
|
69
|
+
<a href="visits?id=321&pdr=20081020-20081119&cmp=average" onclick="return VisualizationModule.changeReport("#{report[3]}");"> Visits </a>
|
70
|
+
<a href="unique_visitors?id=321&pdr=20081020-20081119&cmp=average" onclick="return VisualizationModule.changeReport("#{report[4]}");"> Absolute Unique Visitors </a>
|
71
|
+
<a href="pageviews?id=321&pdr=20081020-20081119&cmp=average" onclick="return VisualizationModule.changeReport("#{report[5]}");"> Pageviews </a>
|
72
|
+
<a href="average_pageviews?id=321&pdr=20081020-20081119&cmp=average" onclick="return VisualizationModule.changeReport("#{report[6]}");"> Average Pageviews </a>
|
73
|
+
<a href="time_on_site?id=321&pdr=20081020-20081119&cmp=average" onclick="return VisualizationModule.changeReport("#{report[7]}");"> Time on Site </a>
|
74
|
+
<a href="bounce_rate?id=321&pdr=20081020-20081119&cmp=average" onclick="return VisualizationModule.changeReport("#{report[8]}");"> Bounce Rate </a>
|
75
|
+
<a href="visitor_types?id=321&pdr=20081020-20081119&cmp=average&view=1" onclick="return VisualizationModule.changeReport("#{report[9]}", "view\x3d1");"> New Visits</a>
|
76
|
+
<a href="#" onclick="VisualizationModule.changeReport("#{report[10]}")">languages</a>,
|
77
|
+
<a href="#" onclick="VisualizationModule.changeReport("#{report[11]}")">network locations</a>,
|
78
|
+
<a href="#" onclick="VisualizationModule.changeReport("user_defined")">user defined</a>
|
79
|
+
<a href="#" onclick="VisualizationModule.changeReport("#{report[13]}", "view=1")">browsers</a>,
|
80
|
+
<a href="#" onclick="VisualizationModule.changeReport("#{report[14]}", "view=1")">operating systems</a>,
|
81
|
+
<a href="#" onclick="VisualizationModule.changeReport("#{report[0]}", "view=1")">browser and operating systems</a>,
|
82
|
+
<a href="#" onclick="VisualizationModule.changeReport("#{report[1]}", "view=1")">screen colors</a>,
|
83
|
+
<a href="#" onclick="VisualizationModule.changeReport("#{report[18]}", "view=1")">screen resolutions</a>,
|
84
|
+
<a href="#" onclick="VisualizationModule.changeReport("#{report[19]}", "view=1", "view=1")">java support</a>,
|
85
|
+
<a href="#" onclick="VisualizationModule.changeReport("#{report[20]}", "view=1", "view=1")">Flash</a>
|
86
|
+
<a href="#" onclick="VisualizationModule.changeReport("#{report[15]}")">Map Overlay</a>
|
87
|
+
<a href="browsers?id=321&pdr=20081020-20081119&cmp=average&view=1" onclick="return VisualizationModule.changeReport("browsers", "view\x3d1");"> view full report</a>
|
88
|
+
<a href="speeds?id=321&pdr=20081020-20081119&cmp=average" onclick="return Vis <a href="dashboard?dashboard=1&id=321&pdr=20081020-20081119&cmp=average" onclick="return VisualizationModule.changeReport('dashboard')" class="" id="dashboard_nav_item">
|
89
|
+
<a href="visitors?id=321&pdr=20081020-20081119&cmp=average" onclick="return VisualizationModule.changeReport('#{report[17]}')" class="current" id="visitors_nav_item">
|
90
|
+
<a href="visitors?id=321&pdr=20081020-20081119&cmp=average" onclick="return VisualizationModule.changeReport('visitors')" class="current">
|
91
|
+
<a href="benchmark?id=321&pdr=20081020-20081119&cmp=average" onclick="return VisualizationModule.changeReportAndComparison('benchmark', 'benchmark')" class="">
|
92
|
+
<a href="maps?id=321&pdr=20081020-20081119&cmp=average" onclick="return VisualizationModule.changeReport('#{report[15]}')" class="">
|
93
|
+
<a href="visitor_types?id=321&pdr=20081020-20081119&cmp=average" onclick="return VisualizationModule.changeReport('visitor_types', 'view=1')" class="">
|
94
|
+
<a href="languages?id=321&pdr=20081020-20081119&cmp=average" onclick="return VisualizationModule.changeReport('languages')" class="">
|
95
|
+
<a href="visits?id=321&pdr=20081020-20081119&cmp=average" onclick="return VisualizationModule.changeReport('visits')" class="">
|
96
|
+
<a href="unique_visitors?id=321&pdr=20081020-20081119&cmp=average" onclick="return VisualizationModule.changeReport('unique_visitors')" class="">
|
97
|
+
<a href="pageviews?id=321&pdr=20081020-20081119&cmp=average" onclick="return VisualizationModule.changeReport('pageviews')" class="">
|
98
|
+
<a href="average_pageviews?id=321&pdr=20081020-20081119&cmp=average" onclick="return VisualizationModule.changeReport('average_pageviews')" class="">
|
99
|
+
<a href="time_on_site?id=321&pdr=20081020-20081119&cmp=average" onclick="return VisualizationModule.changeReport('time_on_site')" class="">
|
100
|
+
<a href="bounce_rate?id=321&pdr=20081020-20081119&cmp=average" onclick="return VisualizationModule.changeReport('bounce_rate')" class="">
|
101
|
+
<a href="loyalty?id=321&pdr=20081020-20081119&cmp=average" onclick="return VisualizationModule.changeReport('#{report[21]}')" class="">
|
102
|
+
<a href="recency?id=321&pdr=20081020-20081119&cmp=average" onclick="return VisualizationModule.changeReport('#{report[22]}')" class="">
|
103
|
+
<a href="user_defined?id=321&pdr=20081020-20081119&cmp=average" onclick="return VisualizationModule.changeReport('user_defined')" class="">
|
104
|
+
<a href="sources?id=321&pdr=20081020-20081119&cmp=average" onclick="return VisualizationModule.changeReport('#{report[16]}')" class="" id="traffic_sources_nav_item">
|
105
|
+
<a href="content?id=321&pdr=20081020-20081119&cmp=average" onclick="return VisualizationModule.changeReport('#{report[23]}')" class="" id="content_nav_item">
|
106
|
+
<a href="goal_intro?id=321&pdr=20081020-20081119&cmp=average" onclick="return VisualizationModule.changeReport('goal_intro')" class="" id="goals_nav_item">
|
107
|
+
<a href="custom_reports_overview?id=321&pdr=20081020-20081119&cmp=average" onclick="return VisualizationModule.changeReport('custom_reports_overview')" class="custom_reporting_section" id="custom_report_nav_item">
|
108
|
+
<a href="#" onclick="return VisualizationModule.changeReport("manage_segments");">Advanced Segments</a> <b class="beta_label small">Beta</b>
|
109
|
+
<a href="#" onclick="return VisualizationModule.changeReport("manage_emails");">Email</a>
|
110
|
+
</body></html>|
|
111
|
+
Profile.should_receive(:get).with("https://www.google.com/analytics/reporting/?scid=#{@profile.profile_id}").and_return html
|
112
|
+
|
113
|
+
report.values.each do |name|
|
114
|
+
Profile.stub!(:get).with("https://www.google.com/analytics/reporting/#{name}?id=#{@profile.profile_id}").and_return ''
|
115
|
+
end
|
116
|
+
|
117
|
+
reports = @profile.report_names
|
118
|
+
report.each do |k,name|
|
119
|
+
report_name = "#{name.sub(/^maps$/,'geo_map').sub(/^sources$/,'traffic_sources').sub(/^visitors$/,'visitors_overview')}_report"
|
120
|
+
reports.should include(report_name)
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
end
|
125
|
+
|
34
126
|
describe 'finding pageviews' do
|
35
127
|
before do
|
36
128
|
@profile = Profile.new :profile_id=>123
|
@@ -102,9 +194,10 @@ describe Profile do
|
|
102
194
|
before do
|
103
195
|
@profile = Profile.new :profile_id=>123
|
104
196
|
end
|
105
|
-
def self.it_should_default option, value
|
197
|
+
def self.it_should_default option, value, report=nil
|
198
|
+
options = report ? %Q|{:report=>"#{report}"}| : '{}'
|
106
199
|
eval %Q|it 'should set :#{option} to #{value}' do
|
107
|
-
@profile.set_default_options({})[:#{option}].should == #{value}
|
200
|
+
@profile.set_default_options(#{options})[:#{option}].should == #{value}
|
108
201
|
end|
|
109
202
|
end
|
110
203
|
it_should_default :report, '"Dashboard"'
|
@@ -114,6 +207,11 @@ describe Profile do
|
|
114
207
|
it_should_default :compute, '"average"'
|
115
208
|
it_should_default :gdfmt, '"nth_day"'
|
116
209
|
it_should_default :view, '0'
|
210
|
+
|
211
|
+
it_should_default :tab, 'nil', 'GeoMap'
|
212
|
+
it_should_default :rows, 'nil', 'GeoMap'
|
213
|
+
it_should_default :gdfmt, 'nil', 'GeoMap'
|
214
|
+
|
117
215
|
it 'should default :from to a month ago, and :to to today' do
|
118
216
|
@month_ago = mock('month_ago')
|
119
217
|
@today = mock('today')
|
@@ -165,9 +165,9 @@ describe Report do
|
|
165
165
|
end
|
166
166
|
|
167
167
|
describe "when creating graph points from 'Graph'" do
|
168
|
-
def graph_correct expected_start, expected_end
|
168
|
+
def graph_correct expected_start, expected_end, column_name='Page Views', graph_name=:pageviews_graph
|
169
169
|
@start_end_dates = "#{@start},#{@end}"
|
170
|
-
@name =
|
170
|
+
@name = column_name
|
171
171
|
@column_names = "Day,#{@name}"
|
172
172
|
@csv = ['# ----------------------------------------',
|
173
173
|
'your_site.com',
|
@@ -184,11 +184,11 @@ describe Report do
|
|
184
184
|
'# ----------------------------------------']
|
185
185
|
graph = mock('graph')
|
186
186
|
|
187
|
-
Graph.should_receive(:new).with(@name, [5360, 575], expected_start, expected_end).and_return graph
|
187
|
+
Graph.should_receive(:new).with(@name.sub('/','_per_').sub('.',''), [5360, 575], expected_start, expected_end).and_return graph
|
188
188
|
|
189
189
|
report = Report.new(@csv.join("\n"))
|
190
|
-
report.
|
191
|
-
report.attribute_names.should == [
|
190
|
+
report.send(graph_name).should == graph
|
191
|
+
report.attribute_names.should == [graph_name.to_s]
|
192
192
|
end
|
193
193
|
|
194
194
|
describe 'with source date format "Month Day, Year"' do
|
@@ -206,6 +206,22 @@ describe Report do
|
|
206
206
|
graph_correct Date.parse(@start), Date.parse(@end)
|
207
207
|
end
|
208
208
|
end
|
209
|
+
|
210
|
+
describe "with forward slash in column name" do
|
211
|
+
it 'should create graph with forward slash replaced by _per_ in column name' do
|
212
|
+
@start = %Q|28 August 2008|
|
213
|
+
@end = %Q|29 August 2008|
|
214
|
+
graph_correct Date.parse(@start), Date.parse(@end), 'Pages/Visit', :pages_per_visit_graph
|
215
|
+
end
|
216
|
+
end
|
217
|
+
|
218
|
+
describe "with dot in column name" do
|
219
|
+
it 'should create graph with dot removed in column name' do
|
220
|
+
@start = %Q|28 August 2008|
|
221
|
+
@end = %Q|29 August 2008|
|
222
|
+
graph_correct Date.parse(@start), Date.parse(@end), 'Avg. Time on Site', :avg_time_on_site_graph
|
223
|
+
end
|
224
|
+
end
|
209
225
|
end
|
210
226
|
end
|
211
227
|
|
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.
|
4
|
+
version: 0.1.2
|
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-
|
12
|
+
date: 2008-11-21 00:00:00 +00:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -121,14 +121,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
121
121
|
version:
|
122
122
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
123
123
|
requirements:
|
124
|
-
- - "
|
124
|
+
- - ">="
|
125
125
|
- !ruby/object:Gem::Version
|
126
126
|
version: "1.2"
|
127
127
|
version:
|
128
128
|
requirements: []
|
129
129
|
|
130
130
|
rubyforge_project: rugalytics
|
131
|
-
rubygems_version: 1.
|
131
|
+
rubygems_version: 1.3.0
|
132
132
|
signing_key:
|
133
133
|
specification_version: 2
|
134
134
|
summary: Rugalytics is a Ruby API for Google Analytics.
|