garb 0.2.3 → 0.2.4
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +17 -6
- data/Rakefile +1 -1
- data/lib/extensions/array.rb +16 -0
- data/lib/extensions/string.rb +5 -1
- data/lib/garb.rb +2 -1
- data/lib/garb/account.rb +15 -0
- data/lib/garb/profile.rb +15 -10
- data/lib/garb/version.rb +2 -2
- data/test/unit/account_test.rb +38 -0
- data/test/unit/profile_test.rb +8 -0
- data/test/unit/string_test.rb +4 -0
- metadata +13 -14
- data/lib/extensions/happymapper.rb +0 -67
data/README.md
CHANGED
@@ -5,12 +5,14 @@ garb
|
|
5
5
|
|
6
6
|
http://github.com/vigetlabs/garb
|
7
7
|
|
8
|
-
Changes
|
9
|
-
|
8
|
+
Important Changes
|
9
|
+
=================
|
10
|
+
|
11
|
+
Version 0.2.4 requires happymapper from rubygems, version 0.2.5. Be sure to update.
|
10
12
|
|
11
13
|
Version 0.2.0 makes major changes (compared to 0.1.0) to the way garb is used to build reports.
|
12
|
-
There is now both a module that gets included for generating defined classes
|
13
|
-
|
14
|
+
There is now both a module that gets included for generating defined classes,
|
15
|
+
as well as, slight changes to the way that the Report class can be used.
|
14
16
|
|
15
17
|
Description
|
16
18
|
-----------
|
@@ -27,9 +29,15 @@ Login
|
|
27
29
|
|
28
30
|
> Garb::Session.login(username, password)
|
29
31
|
|
32
|
+
Accounts
|
33
|
+
--------
|
34
|
+
> Garb::Account.all
|
35
|
+
|
30
36
|
Profiles
|
31
37
|
--------
|
32
38
|
|
39
|
+
> Garb::Account.first.profiles
|
40
|
+
|
33
41
|
> Garb::Profile.all
|
34
42
|
> profile = Garb::Profile.all.first
|
35
43
|
|
@@ -156,12 +164,15 @@ TODOS
|
|
156
164
|
Requirements
|
157
165
|
------------
|
158
166
|
|
159
|
-
libxml
|
160
|
-
happymapper
|
167
|
+
happymapper >= 0.2.5 (should also install libxml)
|
161
168
|
|
162
169
|
Install
|
163
170
|
-------
|
164
171
|
|
172
|
+
sudo gem install garb
|
173
|
+
|
174
|
+
OR
|
175
|
+
|
165
176
|
sudo gem install vigetlabs-garb -s http://gems.github.com
|
166
177
|
|
167
178
|
License
|
data/Rakefile
CHANGED
@@ -17,7 +17,7 @@ spec = Gem::Specification.new do |s|
|
|
17
17
|
s.files = %w(README.md Rakefile) + Dir.glob("lib/**/*")
|
18
18
|
s.test_files = Dir.glob("test/**/*")
|
19
19
|
|
20
|
-
s.add_dependency("
|
20
|
+
s.add_dependency("happymapper", [">= 0.2.5"])
|
21
21
|
end
|
22
22
|
|
23
23
|
Rake::GemPackageTask.new(spec) do |pkg|
|
data/lib/extensions/string.rb
CHANGED
data/lib/garb.rb
CHANGED
@@ -12,6 +12,7 @@ require 'garb/authentication_request'
|
|
12
12
|
require 'garb/data_request'
|
13
13
|
require 'garb/session'
|
14
14
|
require 'garb/profile'
|
15
|
+
require 'garb/account'
|
15
16
|
require 'garb/report_parameter'
|
16
17
|
require 'garb/report_response'
|
17
18
|
require 'garb/resource'
|
@@ -20,7 +21,7 @@ require 'garb/report'
|
|
20
21
|
require 'extensions/string'
|
21
22
|
require 'extensions/operator'
|
22
23
|
require 'extensions/symbol'
|
23
|
-
require 'extensions/
|
24
|
+
require 'extensions/array'
|
24
25
|
|
25
26
|
module Garb
|
26
27
|
# :stopdoc:
|
data/lib/garb/account.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
module Garb
|
2
|
+
class Account
|
3
|
+
attr_reader :id, :name, :profiles
|
4
|
+
|
5
|
+
def initialize(profiles)
|
6
|
+
@id = profiles.first.account_id
|
7
|
+
@name = profiles.first.account_name
|
8
|
+
@profiles = profiles
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.all
|
12
|
+
Profile.all.group_by{|p| p.account_id}.map{|profiles| new(profiles)}
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
data/lib/garb/profile.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module Garb
|
2
2
|
class Profile
|
3
3
|
|
4
|
-
attr_reader :table_id, :title, :account_name
|
4
|
+
attr_reader :table_id, :title, :account_name, :account_id
|
5
5
|
|
6
6
|
class Property
|
7
7
|
include HappyMapper
|
@@ -11,35 +11,40 @@ module Garb
|
|
11
11
|
|
12
12
|
attribute :name, String
|
13
13
|
attribute :value, String
|
14
|
+
|
15
|
+
def instance_name
|
16
|
+
name.from_ga.underscored
|
17
|
+
end
|
14
18
|
end
|
15
19
|
|
16
20
|
class Entry
|
17
21
|
include HappyMapper
|
18
22
|
|
19
23
|
tag 'entry'
|
20
|
-
|
21
|
-
element :id, Integer
|
24
|
+
|
22
25
|
element :title, String
|
23
26
|
element :tableId, String, :namespace => 'dxp'
|
24
|
-
|
25
|
-
# has_one :table_id, TableId
|
27
|
+
|
26
28
|
has_many :properties, Property
|
27
29
|
end
|
28
30
|
|
29
31
|
def initialize(entry)
|
30
32
|
@title = entry.title
|
31
33
|
@table_id = entry.tableId
|
32
|
-
|
34
|
+
|
35
|
+
entry.properties.each do |p|
|
36
|
+
instance_variable_set :"@#{p.instance_name}", p.value
|
37
|
+
end
|
33
38
|
end
|
34
|
-
|
39
|
+
|
35
40
|
def id
|
36
|
-
@table_id.
|
41
|
+
@table_id.from_ga
|
37
42
|
end
|
38
|
-
|
43
|
+
|
39
44
|
def self.all
|
40
45
|
url = "https://www.google.com/analytics/feeds/accounts/#{Session.email}"
|
41
46
|
response = DataRequest.new(url).send_request
|
42
|
-
Entry.parse(response.body).map {|
|
47
|
+
Entry.parse(response.body).map {|entry| new(entry)}
|
43
48
|
end
|
44
49
|
end
|
45
50
|
end
|
data/lib/garb/version.rb
CHANGED
@@ -0,0 +1,38 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', '/test_helper')
|
2
|
+
|
3
|
+
module Garb
|
4
|
+
class AccountTest < Test::Unit::TestCase
|
5
|
+
context "The Account class" do
|
6
|
+
should "have an array of accounts with all profiles" do
|
7
|
+
p1 = stub(:account_id => '1111', :account_name => 'Blog 1')
|
8
|
+
p2 = stub(:account_id => '1112', :account_name => 'Blog 2')
|
9
|
+
Profile.stubs(:all).returns([p1,p2,p1,p2])
|
10
|
+
Account.expects(:new).with([p1,p1]).returns('account1')
|
11
|
+
Account.expects(:new).with([p2,p2]).returns('account2')
|
12
|
+
assert_equal ['account1','account2'], Account.all
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
context "An instance of the Account class" do
|
17
|
+
context "when creating a new account from an array of profiles" do
|
18
|
+
setup do
|
19
|
+
profile = stub(:account_id => '1111', :account_name => 'Blog 1')
|
20
|
+
@profiles = [profile,profile]
|
21
|
+
@account = Account.new(@profiles)
|
22
|
+
end
|
23
|
+
|
24
|
+
should "take the account id from the first profile" do
|
25
|
+
assert_equal @profiles.first.account_id, @account.id
|
26
|
+
end
|
27
|
+
|
28
|
+
should "take the account name from the first profile" do
|
29
|
+
assert_equal @profiles.first.account_name, @account.name
|
30
|
+
end
|
31
|
+
|
32
|
+
should "store the array of profiles" do
|
33
|
+
assert_equal @profiles, @account.profiles
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
data/test/unit/profile_test.rb
CHANGED
@@ -51,6 +51,14 @@ module Garb
|
|
51
51
|
should "have a value for :id" do
|
52
52
|
assert_equal '12345', @profile.id
|
53
53
|
end
|
54
|
+
|
55
|
+
should "have a value for :account_id" do
|
56
|
+
assert_equal '1111', @profile.account_id
|
57
|
+
end
|
58
|
+
|
59
|
+
should "have a value for :account_name" do
|
60
|
+
assert_equal 'Blog Beta', @profile.account_name
|
61
|
+
end
|
54
62
|
|
55
63
|
end
|
56
64
|
|
data/test/unit/string_test.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: garb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tony Pitale
|
@@ -11,18 +11,18 @@ autorequire:
|
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
13
|
|
14
|
-
date: 2009-
|
14
|
+
date: 2009-06-19 00:00:00 -04:00
|
15
15
|
default_executable:
|
16
16
|
dependencies:
|
17
17
|
- !ruby/object:Gem::Dependency
|
18
|
-
name:
|
18
|
+
name: happymapper
|
19
19
|
type: :runtime
|
20
20
|
version_requirement:
|
21
21
|
version_requirements: !ruby/object:Gem::Requirement
|
22
22
|
requirements:
|
23
23
|
- - ">="
|
24
24
|
- !ruby/object:Gem::Version
|
25
|
-
version: 0.2.
|
25
|
+
version: 0.2.5
|
26
26
|
version:
|
27
27
|
description:
|
28
28
|
email: tony.pitale@viget.com
|
@@ -35,12 +35,11 @@ extra_rdoc_files: []
|
|
35
35
|
files:
|
36
36
|
- README.md
|
37
37
|
- Rakefile
|
38
|
-
- lib/extensions
|
39
|
-
- lib/extensions/happymapper.rb
|
38
|
+
- lib/extensions/array.rb
|
40
39
|
- lib/extensions/operator.rb
|
41
40
|
- lib/extensions/string.rb
|
42
41
|
- lib/extensions/symbol.rb
|
43
|
-
- lib/garb
|
42
|
+
- lib/garb/account.rb
|
44
43
|
- lib/garb/authentication_request.rb
|
45
44
|
- lib/garb/data_request.rb
|
46
45
|
- lib/garb/oauth_session.rb
|
@@ -52,12 +51,11 @@ files:
|
|
52
51
|
- lib/garb/session.rb
|
53
52
|
- lib/garb/version.rb
|
54
53
|
- lib/garb.rb
|
55
|
-
- test/fixtures
|
56
54
|
- test/fixtures/cacert.pem
|
57
55
|
- test/fixtures/profile_feed.xml
|
58
56
|
- test/fixtures/report_feed.xml
|
59
57
|
- test/test_helper.rb
|
60
|
-
- test/unit
|
58
|
+
- test/unit/account_test.rb
|
61
59
|
- test/unit/authentication_request_test.rb
|
62
60
|
- test/unit/data_request_test.rb
|
63
61
|
- test/unit/garb_test.rb
|
@@ -71,8 +69,10 @@ files:
|
|
71
69
|
- test/unit/session_test.rb
|
72
70
|
- test/unit/string_test.rb
|
73
71
|
- test/unit/symbol_test.rb
|
74
|
-
has_rdoc:
|
72
|
+
has_rdoc: true
|
75
73
|
homepage: http://github.com/vigetlabs/garb
|
74
|
+
licenses: []
|
75
|
+
|
76
76
|
post_install_message:
|
77
77
|
rdoc_options: []
|
78
78
|
|
@@ -93,17 +93,16 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
93
93
|
requirements: []
|
94
94
|
|
95
95
|
rubyforge_project:
|
96
|
-
rubygems_version: 1.3.
|
96
|
+
rubygems_version: 1.3.4
|
97
97
|
signing_key:
|
98
|
-
specification_version:
|
98
|
+
specification_version: 3
|
99
99
|
summary: Google Analytics API Ruby Wrapper
|
100
100
|
test_files:
|
101
|
-
- test/fixtures
|
102
101
|
- test/fixtures/cacert.pem
|
103
102
|
- test/fixtures/profile_feed.xml
|
104
103
|
- test/fixtures/report_feed.xml
|
105
104
|
- test/test_helper.rb
|
106
|
-
- test/unit
|
105
|
+
- test/unit/account_test.rb
|
107
106
|
- test/unit/authentication_request_test.rb
|
108
107
|
- test/unit/data_request_test.rb
|
109
108
|
- test/unit/garb_test.rb
|
@@ -1,67 +0,0 @@
|
|
1
|
-
require 'libxml'
|
2
|
-
|
3
|
-
module HappyMapper
|
4
|
-
|
5
|
-
module ClassMethods
|
6
|
-
include LibXML
|
7
|
-
|
8
|
-
def parse(xml, options = {})
|
9
|
-
# locally scoped copy of namespace for this parse run
|
10
|
-
namespace = @namespace
|
11
|
-
|
12
|
-
if xml.is_a?(XML::Node)
|
13
|
-
node = xml
|
14
|
-
else
|
15
|
-
if xml.is_a?(XML::Document)
|
16
|
-
node = xml.root
|
17
|
-
else
|
18
|
-
node = XML::Parser.string(xml).parse.root
|
19
|
-
end
|
20
|
-
|
21
|
-
root = node.name == tag_name
|
22
|
-
end
|
23
|
-
|
24
|
-
# This is the entry point into the parsing pipeline, so the default
|
25
|
-
# namespace prefix registered here will propagate down
|
26
|
-
namespaces = node.namespaces
|
27
|
-
if namespaces && namespaces.default
|
28
|
-
already_assigned = namespaces.definitions.detect do |defn|
|
29
|
-
namespaces.default && namespaces.default.href == defn.href && defn.prefix
|
30
|
-
end
|
31
|
-
namespaces.default_prefix = DEFAULT_NS unless already_assigned
|
32
|
-
namespace ||= DEFAULT_NS
|
33
|
-
end
|
34
|
-
|
35
|
-
xpath = root ? '/' : './/'
|
36
|
-
xpath += "#{namespace}:" if namespace
|
37
|
-
xpath += tag_name
|
38
|
-
# puts "parse: #{xpath}"
|
39
|
-
|
40
|
-
nodes = node.find(xpath)
|
41
|
-
collection = nodes.collect do |n|
|
42
|
-
obj = new
|
43
|
-
|
44
|
-
attributes.each do |attr|
|
45
|
-
obj.send("#{attr.method_name}=",
|
46
|
-
attr.from_xml_node(n, namespace))
|
47
|
-
end
|
48
|
-
|
49
|
-
elements.each do |elem|
|
50
|
-
obj.send("#{elem.method_name}=",
|
51
|
-
elem.from_xml_node(n, namespace))
|
52
|
-
end
|
53
|
-
|
54
|
-
obj
|
55
|
-
end
|
56
|
-
|
57
|
-
# per http://libxml.rubyforge.org/rdoc/classes/LibXML/XML/Document.html#M000354
|
58
|
-
nodes = nil
|
59
|
-
|
60
|
-
if options[:single] || root
|
61
|
-
collection.first
|
62
|
-
else
|
63
|
-
collection
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|
67
|
-
end
|