garb 0.8.5 → 0.9.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.md +27 -87
- data/lib/garb.rb +2 -0
- data/lib/garb/account.rb +1 -0
- data/lib/garb/account_feed_request.rb +2 -2
- data/lib/garb/destination.rb +3 -5
- data/lib/garb/management/account.rb +7 -4
- data/lib/garb/management/feed.rb +1 -1
- data/lib/garb/management/goal.rb +36 -12
- data/lib/garb/management/profile.rb +3 -4
- data/lib/garb/management/segment.rb +27 -0
- data/lib/garb/management/web_property.rb +4 -0
- data/lib/garb/resource.rb +1 -1
- data/lib/garb/version.rb +2 -2
- data/test/test_helper.rb +9 -1
- data/test/unit/garb/account_feed_request_test.rb +34 -1
- data/test/unit/garb/coverage/assets/0.3.9/app.js +66 -0
- data/test/unit/garb/coverage/assets/0.3.9/fancybox/blank.gif +0 -0
- data/test/unit/garb/coverage/assets/0.3.9/fancybox/fancy_close.png +0 -0
- data/test/unit/garb/coverage/assets/0.3.9/fancybox/fancy_loading.png +0 -0
- data/test/unit/garb/coverage/assets/0.3.9/fancybox/fancy_nav_left.png +0 -0
- data/test/unit/garb/coverage/assets/0.3.9/fancybox/fancy_nav_right.png +0 -0
- data/test/unit/garb/coverage/assets/0.3.9/fancybox/fancy_shadow_e.png +0 -0
- data/test/unit/garb/coverage/assets/0.3.9/fancybox/fancy_shadow_n.png +0 -0
- data/test/unit/garb/coverage/assets/0.3.9/fancybox/fancy_shadow_ne.png +0 -0
- data/test/unit/garb/coverage/assets/0.3.9/fancybox/fancy_shadow_nw.png +0 -0
- data/test/unit/garb/coverage/assets/0.3.9/fancybox/fancy_shadow_s.png +0 -0
- data/test/unit/garb/coverage/assets/0.3.9/fancybox/fancy_shadow_se.png +0 -0
- data/test/unit/garb/coverage/assets/0.3.9/fancybox/fancy_shadow_sw.png +0 -0
- data/test/unit/garb/coverage/assets/0.3.9/fancybox/fancy_shadow_w.png +0 -0
- data/test/unit/garb/coverage/assets/0.3.9/fancybox/fancy_title_left.png +0 -0
- data/test/unit/garb/coverage/assets/0.3.9/fancybox/fancy_title_main.png +0 -0
- data/test/unit/garb/coverage/assets/0.3.9/fancybox/fancy_title_over.png +0 -0
- data/test/unit/garb/coverage/assets/0.3.9/fancybox/fancy_title_right.png +0 -0
- data/test/unit/garb/coverage/assets/0.3.9/fancybox/fancybox-x.png +0 -0
- data/test/unit/garb/coverage/assets/0.3.9/fancybox/fancybox-y.png +0 -0
- data/test/unit/garb/coverage/assets/0.3.9/fancybox/fancybox.png +0 -0
- data/test/unit/garb/coverage/assets/0.3.9/fancybox/jquery.fancybox-1.3.1.css +363 -0
- data/test/unit/garb/coverage/assets/0.3.9/fancybox/jquery.fancybox-1.3.1.pack.js +44 -0
- data/test/unit/garb/coverage/assets/0.3.9/favicon.png +0 -0
- data/test/unit/garb/coverage/assets/0.3.9/jquery-1.4.2.min.js +155 -0
- data/test/unit/garb/coverage/assets/0.3.9/jquery.dataTables.min.js +152 -0
- data/test/unit/garb/coverage/assets/0.3.9/jquery.timeago.js +141 -0
- data/test/unit/garb/coverage/assets/0.3.9/jquery.url.js +174 -0
- data/test/unit/garb/coverage/assets/0.3.9/loading.gif +0 -0
- data/test/unit/garb/coverage/assets/0.3.9/magnify.png +0 -0
- data/test/unit/garb/coverage/assets/0.3.9/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
- data/test/unit/garb/coverage/assets/0.3.9/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
- data/test/unit/garb/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
- data/test/unit/garb/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
- data/test/unit/garb/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
- data/test/unit/garb/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
- data/test/unit/garb/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
- data/test/unit/garb/coverage/assets/0.3.9/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
- data/test/unit/garb/coverage/assets/0.3.9/smoothness/images/ui-icons_222222_256x240.png +0 -0
- data/test/unit/garb/coverage/assets/0.3.9/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
- data/test/unit/garb/coverage/assets/0.3.9/smoothness/images/ui-icons_454545_256x240.png +0 -0
- data/test/unit/garb/coverage/assets/0.3.9/smoothness/images/ui-icons_888888_256x240.png +0 -0
- data/test/unit/garb/coverage/assets/0.3.9/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
- data/test/unit/garb/coverage/assets/0.3.9/smoothness/jquery-ui-1.8.4.custom.css +295 -0
- data/test/unit/garb/coverage/assets/0.3.9/stylesheet.css +341 -0
- data/test/unit/garb/coverage/index.html +100 -0
- data/test/unit/garb/coverage/resultset.yml +5 -0
- data/test/unit/garb/management/account_test.rb +17 -1
- data/test/unit/garb/management/coverage/assets/0.3.9/app.js +66 -0
- data/test/unit/garb/management/coverage/assets/0.3.9/fancybox/blank.gif +0 -0
- data/test/unit/garb/management/coverage/assets/0.3.9/fancybox/fancy_close.png +0 -0
- data/test/unit/garb/management/coverage/assets/0.3.9/fancybox/fancy_loading.png +0 -0
- data/test/unit/garb/management/coverage/assets/0.3.9/fancybox/fancy_nav_left.png +0 -0
- data/test/unit/garb/management/coverage/assets/0.3.9/fancybox/fancy_nav_right.png +0 -0
- data/test/unit/garb/management/coverage/assets/0.3.9/fancybox/fancy_shadow_e.png +0 -0
- data/test/unit/garb/management/coverage/assets/0.3.9/fancybox/fancy_shadow_n.png +0 -0
- data/test/unit/garb/management/coverage/assets/0.3.9/fancybox/fancy_shadow_ne.png +0 -0
- data/test/unit/garb/management/coverage/assets/0.3.9/fancybox/fancy_shadow_nw.png +0 -0
- data/test/unit/garb/management/coverage/assets/0.3.9/fancybox/fancy_shadow_s.png +0 -0
- data/test/unit/garb/management/coverage/assets/0.3.9/fancybox/fancy_shadow_se.png +0 -0
- data/test/unit/garb/management/coverage/assets/0.3.9/fancybox/fancy_shadow_sw.png +0 -0
- data/test/unit/garb/management/coverage/assets/0.3.9/fancybox/fancy_shadow_w.png +0 -0
- data/test/unit/garb/management/coverage/assets/0.3.9/fancybox/fancy_title_left.png +0 -0
- data/test/unit/garb/management/coverage/assets/0.3.9/fancybox/fancy_title_main.png +0 -0
- data/test/unit/garb/management/coverage/assets/0.3.9/fancybox/fancy_title_over.png +0 -0
- data/test/unit/garb/management/coverage/assets/0.3.9/fancybox/fancy_title_right.png +0 -0
- data/test/unit/garb/management/coverage/assets/0.3.9/fancybox/fancybox-x.png +0 -0
- data/test/unit/garb/management/coverage/assets/0.3.9/fancybox/fancybox-y.png +0 -0
- data/test/unit/garb/management/coverage/assets/0.3.9/fancybox/fancybox.png +0 -0
- data/test/unit/garb/management/coverage/assets/0.3.9/fancybox/jquery.fancybox-1.3.1.css +363 -0
- data/test/unit/garb/management/coverage/assets/0.3.9/fancybox/jquery.fancybox-1.3.1.pack.js +44 -0
- data/test/unit/garb/management/coverage/assets/0.3.9/favicon.png +0 -0
- data/test/unit/garb/management/coverage/assets/0.3.9/jquery-1.4.2.min.js +155 -0
- data/test/unit/garb/management/coverage/assets/0.3.9/jquery.dataTables.min.js +152 -0
- data/test/unit/garb/management/coverage/assets/0.3.9/jquery.timeago.js +141 -0
- data/test/unit/garb/management/coverage/assets/0.3.9/jquery.url.js +174 -0
- data/test/unit/garb/management/coverage/assets/0.3.9/loading.gif +0 -0
- data/test/unit/garb/management/coverage/assets/0.3.9/magnify.png +0 -0
- data/test/unit/garb/management/coverage/assets/0.3.9/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
- data/test/unit/garb/management/coverage/assets/0.3.9/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
- data/test/unit/garb/management/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
- data/test/unit/garb/management/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
- data/test/unit/garb/management/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
- data/test/unit/garb/management/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
- data/test/unit/garb/management/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
- data/test/unit/garb/management/coverage/assets/0.3.9/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
- data/test/unit/garb/management/coverage/assets/0.3.9/smoothness/images/ui-icons_222222_256x240.png +0 -0
- data/test/unit/garb/management/coverage/assets/0.3.9/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
- data/test/unit/garb/management/coverage/assets/0.3.9/smoothness/images/ui-icons_454545_256x240.png +0 -0
- data/test/unit/garb/management/coverage/assets/0.3.9/smoothness/images/ui-icons_888888_256x240.png +0 -0
- data/test/unit/garb/management/coverage/assets/0.3.9/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
- data/test/unit/garb/management/coverage/assets/0.3.9/smoothness/jquery-ui-1.8.4.custom.css +295 -0
- data/test/unit/garb/management/coverage/assets/0.3.9/stylesheet.css +341 -0
- data/test/unit/garb/management/coverage/index.html +100 -0
- data/test/unit/garb/management/coverage/resultset.yml +5 -0
- data/test/unit/garb/management/feed_test.rb +39 -0
- data/test/unit/garb/management/goal_test.rb +81 -0
- data/test/unit/garb/management/profile_test.rb +26 -4
- data/test/unit/garb/management/segment_test.rb +47 -0
- data/test/unit/garb/management/web_property_test.rb +6 -0
- metadata +199 -4
data/README.md
CHANGED
|
@@ -6,12 +6,14 @@ Garb
|
|
|
6
6
|
Important Changes
|
|
7
7
|
=================
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
and Garb::
|
|
12
|
-
|
|
13
|
-
I'
|
|
14
|
-
|
|
9
|
+
With The release of version 0.9.0 I have officially deprecated Garb::Report, Garb::Resource,
|
|
10
|
+
Garb::Profile, and Garb::Account. Garb::Report and Garb::Resource should be replaced by Garb::Model.
|
|
11
|
+
Garb::Profile and Garb::Account are supplanted by their Garb::Management::* counterparts.
|
|
12
|
+
|
|
13
|
+
I'll be working hard to update the documentation over the next day or so to highlight all of the
|
|
14
|
+
old features in the new classes, as well as any new features brought by the new classes. If you
|
|
15
|
+
are looking for something in particular, please open an issue and I will try to prioritize these
|
|
16
|
+
requests.
|
|
15
17
|
|
|
16
18
|
Please read CHANGELOG
|
|
17
19
|
|
|
@@ -35,47 +37,39 @@ OAuth Access Token
|
|
|
35
37
|
|
|
36
38
|
> Garb::Session.access_token = access_token # assign from oauth gem
|
|
37
39
|
|
|
38
|
-
Accounts
|
|
40
|
+
Accounts, WebProperties, Profiles, and Goals
|
|
39
41
|
--------
|
|
40
42
|
|
|
41
|
-
> Garb::Account.all
|
|
43
|
+
> Garb::Management::Account.all
|
|
44
|
+
> Garb::Management::WebProperty.all
|
|
45
|
+
> Garb::Management::Profile.all
|
|
46
|
+
> Garb::Management::Goal.all
|
|
42
47
|
|
|
43
|
-
Profiles
|
|
48
|
+
Profiles for a UA- Number (a WebProperty)
|
|
44
49
|
--------
|
|
45
50
|
|
|
46
|
-
> Garb::
|
|
47
|
-
|
|
48
|
-
> Garb::Profile.first('UA-XXXX-XX')
|
|
49
|
-
|
|
50
|
-
> Garb::Profile.all
|
|
51
|
-
> profile = Garb::Profile.all.first
|
|
51
|
+
> profile = profile = Garb::Management::Profile.all.detect {|p| p.web_property_id == 'UA-XXXXXXX-X'}
|
|
52
52
|
|
|
53
53
|
Define a Report Class
|
|
54
54
|
---------------------
|
|
55
55
|
|
|
56
56
|
class Exits
|
|
57
|
-
extend Garb::
|
|
57
|
+
extend Garb::Model
|
|
58
58
|
|
|
59
|
-
metrics :exits, :pageviews
|
|
59
|
+
metrics :exits, :pageviews
|
|
60
60
|
dimensions :page_path
|
|
61
|
-
sort :exits
|
|
62
|
-
|
|
63
|
-
filters do
|
|
64
|
-
eql(:page_path, 'season')
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
# alternative:
|
|
68
|
-
# filters :page_path.eql => 10
|
|
69
61
|
end
|
|
70
62
|
|
|
71
63
|
Get the Results
|
|
72
64
|
---------------
|
|
73
65
|
|
|
74
|
-
> Exits.results(profile)
|
|
66
|
+
> Exits.results(profile, :filters => {:page_path.eql => '/'})
|
|
75
67
|
|
|
76
68
|
OR shorthand
|
|
77
69
|
|
|
78
|
-
> profile.exits
|
|
70
|
+
> profile.exits(:filters => {:page_path.eql => '/'})
|
|
71
|
+
|
|
72
|
+
Be forewarned, these numbers are for the last **30** days and may be slightly different from the numbers displayed in Google Analytics' dashboard for **1 month**.
|
|
79
73
|
|
|
80
74
|
Other Parameters
|
|
81
75
|
----------------
|
|
@@ -88,7 +82,7 @@ Other Parameters
|
|
|
88
82
|
Metrics & Dimensions
|
|
89
83
|
--------------------
|
|
90
84
|
|
|
91
|
-
Metrics and Dimensions are very complex because of the ways in which the can and cannot be combined
|
|
85
|
+
**Metrics and Dimensions are very complex because of the ways in which the can and cannot be combined.**
|
|
92
86
|
|
|
93
87
|
I suggest reading the google documentation to familiarize yourself with this.
|
|
94
88
|
|
|
@@ -97,52 +91,6 @@ Metrics & Dimensions
|
|
|
97
91
|
When you've returned, you can pass the appropriate combinations (up to 50 metrics and 2 dimenstions)
|
|
98
92
|
to garb, as an array, of symbols. Or you can simply push a symbol into the array.
|
|
99
93
|
|
|
100
|
-
Sorting
|
|
101
|
-
-------
|
|
102
|
-
|
|
103
|
-
Sorting can be done on any metric or dimension defined in the request, with .desc reversing the sort.
|
|
104
|
-
|
|
105
|
-
Building a Report
|
|
106
|
-
-----------------
|
|
107
|
-
|
|
108
|
-
Given the class, session, and profile from above we can do:
|
|
109
|
-
|
|
110
|
-
Exits.results(profile, :limit => 10, :offset => 19)
|
|
111
|
-
|
|
112
|
-
Or, with sorting and filters:
|
|
113
|
-
|
|
114
|
-
Exits.results(profile, :limit => 10, :offset => 19) do
|
|
115
|
-
sort :exits
|
|
116
|
-
|
|
117
|
-
filters do
|
|
118
|
-
contains(:page_path, 'season')
|
|
119
|
-
gt(:exits, 100)
|
|
120
|
-
end
|
|
121
|
-
|
|
122
|
-
# or with a hash
|
|
123
|
-
# filters :page_path.contains => 'season', :exits.gt => 100
|
|
124
|
-
end
|
|
125
|
-
|
|
126
|
-
reports will be an array of OpenStructs with methods for the metrics and dimensions returned.
|
|
127
|
-
|
|
128
|
-
Build a One-Off Report
|
|
129
|
-
----------------------
|
|
130
|
-
|
|
131
|
-
report = Garb::Report.new(profile)
|
|
132
|
-
report.metrics :pageviews, :exits
|
|
133
|
-
report.dimensions :page_path
|
|
134
|
-
report.sort :exits
|
|
135
|
-
|
|
136
|
-
report.filters do
|
|
137
|
-
contains(:page_path, 'season')
|
|
138
|
-
gte(:exits, 10)
|
|
139
|
-
and
|
|
140
|
-
|
|
141
|
-
# or with a hash
|
|
142
|
-
# report.filters :page_path.contains => 'season', :exits.gt => 100
|
|
143
|
-
|
|
144
|
-
report.results
|
|
145
|
-
|
|
146
94
|
Filtering
|
|
147
95
|
---------
|
|
148
96
|
|
|
@@ -174,15 +122,9 @@ Filtering
|
|
|
174
122
|
substring => '=@',
|
|
175
123
|
not_substring => '!@'
|
|
176
124
|
|
|
177
|
-
Given the previous example
|
|
178
|
-
|
|
179
|
-
report.filters do
|
|
180
|
-
eql(:page_path, '/extend/effectively-using-git-with-subversion/')
|
|
181
|
-
end
|
|
182
|
-
|
|
183
|
-
Or, if you're comfortable using symbol operators:
|
|
125
|
+
Given the previous Exits example report, we can add an options for filter:
|
|
184
126
|
|
|
185
|
-
|
|
127
|
+
profile.exits(:filters => {:page_path.eql => '/extend/effectively-using-git-with-subversion/')
|
|
186
128
|
|
|
187
129
|
SSL
|
|
188
130
|
---
|
|
@@ -200,9 +142,7 @@ SSL
|
|
|
200
142
|
TODOS
|
|
201
143
|
-----
|
|
202
144
|
|
|
203
|
-
*
|
|
204
|
-
* Investigate new features from GA to see if they're in the API, implement if so
|
|
205
|
-
* clarify AND/OR filtering behavior in code and documentation
|
|
145
|
+
* rebuild AND/OR filtering in Garb::Model
|
|
206
146
|
|
|
207
147
|
Requirements
|
|
208
148
|
------------
|
|
@@ -213,13 +153,13 @@ Requirements
|
|
|
213
153
|
Requirements for Testing
|
|
214
154
|
------------------------
|
|
215
155
|
|
|
156
|
+
* shoulda
|
|
216
157
|
* jferris-mocha
|
|
217
|
-
* tpitale-shoulda (works with minitest)
|
|
218
158
|
|
|
219
159
|
Install
|
|
220
160
|
-------
|
|
221
161
|
|
|
222
|
-
|
|
162
|
+
gem install garb
|
|
223
163
|
|
|
224
164
|
Contributors
|
|
225
165
|
------------
|
data/lib/garb.rb
CHANGED
|
@@ -33,9 +33,11 @@ require 'garb/model'
|
|
|
33
33
|
|
|
34
34
|
# management
|
|
35
35
|
require 'garb/management/feed'
|
|
36
|
+
require 'garb/management/segment'
|
|
36
37
|
require 'garb/management/account'
|
|
37
38
|
require 'garb/management/web_property'
|
|
38
39
|
require 'garb/management/profile'
|
|
40
|
+
require 'garb/management/goal'
|
|
39
41
|
|
|
40
42
|
require 'support'
|
|
41
43
|
|
data/lib/garb/account.rb
CHANGED
|
@@ -15,11 +15,11 @@ module Garb
|
|
|
15
15
|
end
|
|
16
16
|
|
|
17
17
|
def entries
|
|
18
|
-
parsed_response ?
|
|
18
|
+
parsed_response ? Array(parsed_response['feed']['entry']).flatten.compact : []
|
|
19
19
|
end
|
|
20
20
|
|
|
21
21
|
def segments
|
|
22
|
-
parsed_response ?
|
|
22
|
+
parsed_response ? Array(parsed_response['feed']['dxp:segment']).flatten.compact : []
|
|
23
23
|
end
|
|
24
24
|
end
|
|
25
25
|
end
|
data/lib/garb/destination.rb
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
module Garb
|
|
2
2
|
class Destination
|
|
3
|
-
attr_reader :match_type, :expression, :steps
|
|
3
|
+
attr_reader :match_type, :expression, :steps, :case_sensitive
|
|
4
|
+
|
|
5
|
+
alias :case_sensitive? :case_sensitive
|
|
4
6
|
|
|
5
7
|
def initialize(attributes)
|
|
6
8
|
return unless attributes.is_a?(Hash)
|
|
@@ -12,9 +14,5 @@ module Garb
|
|
|
12
14
|
step_attributes = attributes[Garb.to_ga('step')]
|
|
13
15
|
@steps = Array(step_attributes.is_a?(Hash) ? [step_attributes] : step_attributes).map {|s| Step.new(s)}
|
|
14
16
|
end
|
|
15
|
-
|
|
16
|
-
def case_sensitive?
|
|
17
|
-
@case_sensitive
|
|
18
|
-
end
|
|
19
17
|
end
|
|
20
18
|
end
|
|
@@ -5,8 +5,7 @@ module Garb
|
|
|
5
5
|
attr_accessor :id, :title, :name
|
|
6
6
|
|
|
7
7
|
def self.all(session = Session)
|
|
8
|
-
feed = Feed.new(session, '/accounts')
|
|
9
|
-
|
|
8
|
+
feed = Feed.new(session, '/accounts')
|
|
10
9
|
feed.entries.map {|entry| new_from_entry(entry, session)}
|
|
11
10
|
end
|
|
12
11
|
|
|
@@ -14,7 +13,7 @@ module Garb
|
|
|
14
13
|
account = new
|
|
15
14
|
account.session = session
|
|
16
15
|
account.path = Garb.parse_link(entry, "self").gsub(Feed::BASE_URL, '')
|
|
17
|
-
account.title = entry['title'].gsub('Google Analytics Account ', '')
|
|
16
|
+
account.title = entry['title'].gsub('Google Analytics Account ', '') # can we get this in properties=?
|
|
18
17
|
account.properties = Garb.parse_properties(entry)
|
|
19
18
|
account
|
|
20
19
|
end
|
|
@@ -25,12 +24,16 @@ module Garb
|
|
|
25
24
|
end
|
|
26
25
|
|
|
27
26
|
def web_properties
|
|
28
|
-
@web_properties ||= WebProperty.for_account(self)
|
|
27
|
+
@web_properties ||= WebProperty.for_account(self)
|
|
29
28
|
end
|
|
30
29
|
|
|
31
30
|
def profiles
|
|
32
31
|
@profiles ||= Profile.for_account(self)
|
|
33
32
|
end
|
|
33
|
+
|
|
34
|
+
def goals
|
|
35
|
+
@goals ||= Goal.for_account(self)
|
|
36
|
+
end
|
|
34
37
|
end
|
|
35
38
|
end
|
|
36
39
|
end
|
data/lib/garb/management/feed.rb
CHANGED
|
@@ -15,7 +15,7 @@ module Garb
|
|
|
15
15
|
|
|
16
16
|
def entries
|
|
17
17
|
# possible to have nil entries, yuck
|
|
18
|
-
parsed_response ?
|
|
18
|
+
parsed_response ? Array(parsed_response['feed']['entry']).flatten.compact : []
|
|
19
19
|
end
|
|
20
20
|
|
|
21
21
|
def response
|
data/lib/garb/management/goal.rb
CHANGED
|
@@ -1,20 +1,44 @@
|
|
|
1
1
|
module Garb
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
module Management
|
|
3
|
+
class Goal
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
attr_accessor :session, :path
|
|
6
|
+
attr_accessor :name, :number, :value, :destination, :active
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
@number = attributes['number'].to_i
|
|
10
|
-
@value = attributes['value'].to_f
|
|
11
|
-
@active = (attributes['active'] == 'true')
|
|
8
|
+
alias :active? :active
|
|
12
9
|
|
|
13
|
-
|
|
14
|
-
|
|
10
|
+
def self.all(session = Session, path = '/accounts/~all/webproperties/~all/profiles/~all/goals')
|
|
11
|
+
feed = Feed.new(session, path)
|
|
12
|
+
feed.entries.map {|entry| new_from_entry(entry, session)}
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def self.for_account(account)
|
|
16
|
+
all(account.session, account.path + '/webproperties/~all/profiles/~all/goals')
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def self.for_web_property(web_property)
|
|
20
|
+
all(web_property.session, web_property.path + '/profiles/~all/goals')
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def self.for_profile(profile)
|
|
24
|
+
all(profile.session, profile.path + '/goals')
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def self.new_from_entry(entry, session)
|
|
28
|
+
goal = new
|
|
29
|
+
goal.session = session
|
|
30
|
+
goal.path = Garb.parse_link(entry, "self").gsub(Feed::BASE_URL, '')
|
|
31
|
+
goal.properties = entry[Garb.to_ga('goal')]
|
|
32
|
+
goal
|
|
33
|
+
end
|
|
15
34
|
|
|
16
|
-
|
|
17
|
-
|
|
35
|
+
def properties=(properties)
|
|
36
|
+
self.name = properties["name"]
|
|
37
|
+
self.number = properties["number"].to_i
|
|
38
|
+
self.value = properties["value"].to_f
|
|
39
|
+
self.active = (properties["active"] == "true")
|
|
40
|
+
self.destination = Destination.new(properties[Garb.to_ga('destination')])
|
|
41
|
+
end
|
|
18
42
|
end
|
|
19
43
|
end
|
|
20
44
|
end
|
|
@@ -22,11 +22,9 @@ module Garb
|
|
|
22
22
|
|
|
23
23
|
def self.new_from_entry(entry, session)
|
|
24
24
|
profile = new
|
|
25
|
-
|
|
26
25
|
profile.session = session
|
|
27
26
|
profile.path = Garb.parse_link(entry, "self").gsub(Feed::BASE_URL, '')
|
|
28
27
|
profile.properties = Garb.parse_properties(entry)
|
|
29
|
-
|
|
30
28
|
profile
|
|
31
29
|
end
|
|
32
30
|
|
|
@@ -38,8 +36,9 @@ module Garb
|
|
|
38
36
|
self.web_property_id = properties['web_property_id']
|
|
39
37
|
end
|
|
40
38
|
|
|
41
|
-
|
|
42
|
-
|
|
39
|
+
def goals
|
|
40
|
+
Goal.for_profile(self)
|
|
41
|
+
end
|
|
43
42
|
end
|
|
44
43
|
end
|
|
45
44
|
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
module Garb
|
|
2
|
+
module Management
|
|
3
|
+
class Segment
|
|
4
|
+
attr_accessor :session, :path
|
|
5
|
+
attr_accessor :id, :name, :definition
|
|
6
|
+
|
|
7
|
+
def self.all(session = Session)
|
|
8
|
+
feed = Feed.new(session, '/segments')
|
|
9
|
+
feed.entries.map {|entry| new_from_entry(entry, session)}
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def self.new_from_entry(entry, session)
|
|
13
|
+
segment = new
|
|
14
|
+
segment.session = session
|
|
15
|
+
segment.path = Garb.parse_link(entry, "self").gsub(Feed::BASE_URL, '')
|
|
16
|
+
segment.properties = entry['dxp:segment']
|
|
17
|
+
segment
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def properties=(properties)
|
|
21
|
+
self.id = properties['id']
|
|
22
|
+
self.name = properties['name']
|
|
23
|
+
self.definition = properties['dxp:definition']
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
data/lib/garb/resource.rb
CHANGED
|
@@ -10,7 +10,7 @@ module Garb
|
|
|
10
10
|
# returns Exits.results(self, options_hash, &block)
|
|
11
11
|
# every class defined which extends Resource will add to the module
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
ActiveSupport::Deprecation.warn("The use of Garb::Resource will be removed in favor of 'extend Garb::Model'")
|
|
14
14
|
ProfileReports.add_report_method(base)
|
|
15
15
|
end
|
|
16
16
|
|
data/lib/garb/version.rb
CHANGED
data/test/test_helper.rb
CHANGED
|
@@ -1,6 +1,14 @@
|
|
|
1
1
|
begin
|
|
2
2
|
require 'simplecov'
|
|
3
|
-
SimpleCov.
|
|
3
|
+
SimpleCov.adapters.define 'garb' do
|
|
4
|
+
add_filter '/test/'
|
|
5
|
+
add_filter '/config/'
|
|
6
|
+
add_filter 'version'
|
|
7
|
+
|
|
8
|
+
add_group 'Libraries', 'lib'
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
SimpleCov.start 'garb'
|
|
4
12
|
rescue LoadError
|
|
5
13
|
puts "Install simplecov if you use 1.9 and want coverage metrics"
|
|
6
14
|
end
|