gdata4ruby 0.1.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/CHANGELOG ADDED
@@ -0,0 +1,3 @@
1
+ #=CHANGELOG
2
+ #==version 0.1.0
3
+ #* Initial Version
data/README ADDED
@@ -0,0 +1,38 @@
1
+ #=GData4Ruby
2
+ #
3
+ #==Introduction
4
+ #GData4Ruby is a full featured wrapper for the Google Data base API. GData4Ruby provides the ability
5
+ #to authenticate with GData using the ClientLogin method. The package also includes a base gdata object
6
+ #that can be subclassed to provide basic CRUD functions for all Google API service objects. Additionally,
7
+ #a basic ACL object is included for interacting with ACL feeds and setting access rules.
8
+ #
9
+ #==Author and Contact Information
10
+ #GData4Ruby was created and is maintained by {Mike Reich}[mailto:mike@seabourneconsulting.com]
11
+ #and is licenses under the GPL v2. Feel free to use and update, but be sure to contribute your
12
+ #code back to the project and attribute as required by the license.
13
+ #===Website
14
+ #http://cookingandcoding.com/gdata4ruby/
15
+ #
16
+ #==Description
17
+ #GData4Ruby has three major components: the service, the GData object and the AccessRule object. Each service
18
+ #represents a google account, and includes a username (email) and a password. You can use the GData service
19
+ #to authenticate either a google account or a google apps account.
20
+ #
21
+ #The GData object provides a base class for interacting with Google API objects, i.e. Documents, Events, etc. The
22
+ #GData object contains common attributes present in all Google API objects, and provides interfaces for basic CRUD
23
+ #functions. This class is meant to be subclassed.
24
+ #
25
+ #The AccessRule object provides a base class for interacting with Google Access Control Lists. ACLs provide the
26
+ #main permissions mechanism for most Google API services.
27
+ #
28
+ #==Examples
29
+ #Below are some common usage examples. For more examples, check the documentation.
30
+ #===Service
31
+ #1. Authenticate
32
+ # service = Service.new
33
+ # service.authenticate("user@gmail.com", "password", "cl")
34
+ #
35
+ #2. Authenticate with a specified GData version
36
+ # service = Service.new({:gdata_version => '3.0'})
37
+ # service.authenticate("user@gmail.com", "password", "cl")
38
+
@@ -0,0 +1,126 @@
1
+ # Author:: Mike Reich (mike@seabourneconsulting.com)
2
+ # Copyright:: Copyright (C) 2010 Mike Reich
3
+ # License:: GPL v2
4
+ #--
5
+ # Licensed under the General Public License (GPL), Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ #
15
+ # Feel free to use and update, but be sure to contribute your
16
+ # code back to the project and attribute as required by the license.
17
+ #++
18
+ require 'gdata4ruby/gdata_object'
19
+
20
+ module GData4Ruby
21
+
22
+ #Contains classes for interacting with Google ACL feeds
23
+ module ACL
24
+
25
+ #Represents an individual access rule entry in a Google ACL feed.
26
+ class AccessRule < GDataObject
27
+ XML = "<entry xmlns='http://www.w3.org/2005/Atom' xmlns:gAcl='http://schemas.google.com/acl/2007'>
28
+ <category scheme='http://schemas.google.com/g/2005#kind'
29
+ term='http://schemas.google.com/acl/2007#accessRule'/>
30
+ <gAcl:role value=''/>
31
+ <gAcl:scope type='user' value=''/>
32
+ </entry>"
33
+
34
+ #The Rule's user
35
+ attr_accessor :user
36
+
37
+ #The user's role
38
+ attr_accessor :role
39
+
40
+ #The parent GDataObject the rule applies to
41
+ attr_accessor :parent
42
+
43
+ #Creates a new AccessRule object. You must pass a valid Service and GDataObject, and can pass an optional hash
44
+ #of attributes to initialize the object with.
45
+ def initialize(service, parent, attributes = {})
46
+ super(service, attributes)
47
+ @xml = XML
48
+ raise ArgumentError, 'parent must be a GData4Ruby::GDataObject' if not parent.is_a? GData4Ruby::GDataObject
49
+ @parent = parent
50
+ @role = @user = nil
51
+ end
52
+
53
+ #Creates the AccessRule using the parent's acl_uri attribute.
54
+ def create
55
+ ret = service.send_request(Request.new(:post, @parent.acl_uri, to_xml))
56
+ if not ret or not load(ret.read_body)
57
+ raise SaveFailed, 'Could not create access rule'
58
+ end
59
+ return ret
60
+ end
61
+
62
+ #Loads data into the object. Accepts a string containing an XML <entry> object.
63
+ def load(string)
64
+ super(string)
65
+ @folders = []
66
+ xml = REXML::Document.new(string)
67
+ xml.root.elements.each(){}.map do |ele|
68
+ case ele.name
69
+ when 'role'
70
+ @role = ele.attributes['value']
71
+ when 'scope'
72
+ @user = ele.attributes['value'] ? ele.attributes['value'] : ele.attributes['type']
73
+ end
74
+ end
75
+ end
76
+
77
+ #Deletes the AccessRule
78
+ def delete
79
+ if @exists
80
+ service.send_request(Request.new(:delete, @parent.acl_uri+"/user:"+@user, nil, {"If-Match" => "*"}))
81
+ end
82
+ @exists = false
83
+ return true
84
+ end
85
+
86
+ #Finds an AccessRule based on the args passed.
87
+ #
88
+ #Args can be a hash containing either:
89
+ #*user*:: an email address/user id to search for. If found, returns the matching AccessRule object.
90
+ #*role*:: the role to search for. Returns an array of matching AccessRules, or an empty array if no matches are found.
91
+ def self.find(service, parent, args = {})
92
+ raise ArgumentError, 'Must supply a username or role to find by' if not args[:user] and not args[:role]
93
+ rules = []
94
+ ret = service.send_request(GData4Ruby::Request.new(:get, parent.acl_uri))
95
+ xml = REXML::Document.new(ret.read_body).root
96
+ xml.elements.each("entry") do |e|
97
+ e = GData4Ruby::Utils::add_namespaces(e)
98
+ rule = AccessRule.new(service, parent)
99
+ rule.load(e.to_s)
100
+ return rule if args[:user] and rule.user == args[:user]
101
+ rules << rule if args[:role] and rule.role == args[:role]
102
+ end
103
+ return args[:user] ? false : rules
104
+ end
105
+
106
+ #Returns a string containing the XML representation of the AccessRule
107
+ def to_xml
108
+ xml = REXML::Document.new(super)
109
+ xml.root.elements.each(){}.map do |ele|
110
+ case ele.name
111
+ when "role"
112
+ ele.attributes['value'] = @role
113
+ when 'scope'
114
+ if @user
115
+ ele.attributes['value'] = @user
116
+ else
117
+ ele.attributes['type'] = 'default'
118
+ ele.delete_attribute("value")
119
+ end
120
+ end
121
+ end
122
+ xml.to_s
123
+ end
124
+ end
125
+ end
126
+ end
@@ -0,0 +1,153 @@
1
+ # Author:: Mike Reich (mike@seabourneconsulting.com)
2
+ # Copyright:: Copyright (C) 2010 Mike Reich
3
+ # License:: GPL v2
4
+ #--
5
+ # Licensed under the General Public License (GPL), Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ #
15
+ # Feel free to use and update, but be sure to contribute your
16
+ # code back to the project and attribute as required by the license.
17
+ #++
18
+
19
+ require "net/http"
20
+ require "net/https"
21
+ require 'gdata4ruby/request'
22
+ require 'gdata4ruby/utils/utils'
23
+
24
+ Net::HTTP.version_1_2
25
+
26
+ # GData4Ruby is a full featured wrapper for the base google data API
27
+
28
+ module GData4Ruby
29
+
30
+ class AuthenticationFailed < StandardError; end #:nodoc: all
31
+
32
+ class NotAuthenticated < StandardError; end
33
+
34
+ class InvalidService < StandardError; end
35
+
36
+ class HTTPRequestFailed < StandardError; end
37
+
38
+ class QueryParameterError < StandardError; end
39
+
40
+ #The ProxyInfo class contains information for configuring a proxy connection
41
+
42
+ class ProxyInfo
43
+ attr_accessor :address, :port, :username, :password
44
+ @address = nil
45
+ @port = nil
46
+ @username = nil
47
+ @password = nil
48
+
49
+ #The initialize function accepts four variables for configuring the ProxyInfo object.
50
+ #The proxy connection is initiated using the builtin Net::HTTP proxy support.
51
+
52
+ def initialize(address, port, username=nil, password=nil)
53
+ @address = address
54
+ @port = port
55
+ @username = username
56
+ @password = password
57
+ end
58
+ end
59
+
60
+ #The Base class includes the basic HTTP methods for communicating with the Google Data API.
61
+ #You shouldn't use this class directly, rather access the functionality through
62
+ #the Service subclass.
63
+
64
+ class Base
65
+ AUTH_URL = "https://www.google.com/accounts/ClientLogin"
66
+ @proxy_info = nil
67
+ @auth_token = nil
68
+ @debug = false
69
+ @gdata_version = '2.1'
70
+
71
+ #Contains the ProxyInfo object for using a proxy server
72
+ attr_accessor :proxy_info
73
+
74
+ #If set to true, debug will dump all raw HTTP requests and responses
75
+ attr_accessor :debug
76
+
77
+ #The GData version used by the service
78
+ attr_accessor :gdata_version
79
+
80
+ #Optionally, pass a hash of attributes to populate the class. If you want to use a GData version
81
+ #other than the default (2.1), pass a key/value pair, i.e. {:gdata_version => '1.0'}
82
+ def initialize(attributes = {})
83
+ @gdata_version = attributes[:gdata_version] ? attributes[:gdata_version] : '2.1'
84
+ end
85
+
86
+ #Sends a request to the Google Data System. Accepts a valid Request object, and returns a
87
+ #HTTPResult class.
88
+ def send_request(request)
89
+ raise ArgumentError 'Request must be a GData4Ruby::Request object' if not request.is_a?Request
90
+ puts "sending #{request.type} to url = #{request.url.to_s}" if @debug
91
+ do_request(request)
92
+ end
93
+
94
+ private
95
+
96
+ def do_request(request)
97
+ ret = nil
98
+ add_auth_header(request)
99
+ http = get_http_object(request.url)
100
+ puts "Sending request\nHeader: #{request.headers.inspect.to_s}\nContent: #{request.content.to_s}\n" if @debug
101
+ http.start do |ht|
102
+ ret = case request.type
103
+ when :get
104
+ ht.get(request.url.to_s, request.headers)
105
+ when :post
106
+ ht.post(request.url.to_s, request.content, request.headers)
107
+ when :put
108
+ ht.put(request.url.to_s, request.content, request.headers)
109
+ when :delete
110
+ ht.delete(request.url.to_s, request.headers)
111
+ end
112
+ end
113
+
114
+ while ret.is_a?(Net::HTTPRedirection)
115
+ puts "Redirect received, resending post" if @debug
116
+ request.url = ret['location']
117
+ ret = do_request(request)
118
+ end
119
+ if not ret.is_a?(Net::HTTPSuccess)
120
+ puts "invalid response received: "+ret.code if @debug
121
+ raise HTTPRequestFailed, ret.body
122
+ end
123
+ puts "20x response received\nResponse: \n"+ret.read_body if @debug
124
+ return ret
125
+ end
126
+
127
+ def get_http_object(location)
128
+ if @proxy_info and @proxy_info.address
129
+ http = Net::HTTP.new(location.host, location.port, @proxy_info.address, @proxy_info.port, @proxy_info.username, @proxy_info.password)
130
+ else
131
+ http = Net::HTTP.new(location.host, location.port)
132
+ end
133
+ if location.scheme == 'https'
134
+ #fixed http/http misnaming via JohnMetta
135
+ puts "SSL True" if @debug
136
+ http.use_ssl = true
137
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE
138
+ end
139
+ return http
140
+ end
141
+
142
+ def add_auth_header(request)
143
+ if @auth_token
144
+ if request.headers
145
+ request.headers.merge!({'Authorization' => "GoogleLogin auth=#{@auth_token}", "GData-Version" => @gdata_version})
146
+ else
147
+ content_type = (request.type == :get or request.type == :delete) ? 'application/x-www-form-urlencoded' : 'application/atom+xml'
148
+ request.headers = {'Authorization' => "GoogleLogin auth=#{@auth_token}", "GData-Version" => @gdata_version, 'Content-Type' => content_type}
149
+ end
150
+ end
151
+ end
152
+ end
153
+ end
@@ -0,0 +1,160 @@
1
+ # Author:: Mike Reich (mike@seabourneconsulting.com)
2
+ # Copyright:: Copyright (C) 2010 Mike Reich
3
+ # License:: GPL v2
4
+ #--
5
+ # Licensed under the General Public License (GPL), Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ #
15
+ # Feel free to use and update, but be sure to contribute your
16
+ # code back to the project and attribute as required by the license.
17
+ #++
18
+
19
+ require 'gdata4ruby/service'
20
+
21
+ module GData4Ruby
22
+ #The GDataObject class represents any <entry> object returned by a Google Service. Includes
23
+ #attributes for accessing the common elements/parameters of the object, and methods for CRUD
24
+ #operations.
25
+ class GDataObject
26
+ #A Service object
27
+ attr_accessor :service
28
+
29
+ #The entry title.
30
+ attr_accessor :title
31
+
32
+ #The current instance etag for the entry
33
+ attr_reader :etag
34
+
35
+ #The parent URI, if any
36
+ attr_reader :parent_uri
37
+
38
+ #The edit URI, for making changes to the entry
39
+ attr_reader :edit_uri
40
+
41
+ #A hash of additional feedLinks
42
+ attr_reader :feed_links
43
+
44
+ #The unique entry id, as represented by the <gd:resourceId> tag. Not to be confused
45
+ #with the Atom <id> tag, which is accessible as the feed_uri attribute.
46
+ attr_reader :id
47
+
48
+ #The entry's feed uri, otherwise known as the Atom <id> element value.
49
+ attr_reader :feed_uri
50
+
51
+ #A hash of categories
52
+ attr_reader :categories
53
+
54
+ #The feedLink that represents the entry's ACL feed.
55
+ attr_reader :acl_uri
56
+
57
+ #Indicates whether the object exists on the Google servers, i.e. has been created/saved.
58
+ def exists?
59
+ return @exists
60
+ end
61
+
62
+ #Initializes a new GDataObject. You must pass a valid Service object, and can pass
63
+ #an optional array of attributes to initialize values. To load data into an object,
64
+ #use the load method.
65
+ def initialize(service, attributes = {})
66
+ @xml ||= ''
67
+ @service ||= service
68
+ @exists = false
69
+ @title = @etag = @acl_uri = @edit_uri = @parent_uri = @feed_uri = nil
70
+ @categories = @feed_links = []
71
+ @include_etag = true
72
+ attributes.each do |key, value|
73
+ self.send("#{key}=", value)
74
+ end
75
+ end
76
+
77
+ public
78
+ #Loads data into the object. Accepts a string containing an XML <entry> from a GData
79
+ #compliant feed.
80
+ def load(string)
81
+ @exists = @include_etag = true
82
+ @xml = string
83
+ xml = REXML::Document.new(string)
84
+ xml.root.elements.each(){}.map do |ele|
85
+ @etag = xml.root.attributes['etag'] if xml.root.attributes['etag']
86
+ case ele.name
87
+ when "id"
88
+ puts 'setting id' if service.debug
89
+ @feed_uri = ele.text
90
+ when 'resourceId'
91
+ @id = ele.text
92
+ when 'title'
93
+ @title = ele.text
94
+ when 'category'
95
+ @categories << {:label => ele.attributes['label'],
96
+ :scheme => ele.attributes['scheme'],
97
+ :term => ele.attributes['term']}
98
+ when 'link'
99
+ case ele.attributes['rel']
100
+ when 'http://schemas.google.com/docs/2007#parent'
101
+ @parent_uri = ele.attributes['href']
102
+ when 'edit'
103
+ @edit_uri = ele.attributes['href']
104
+ end
105
+ when 'feedLink'
106
+ @feed_links << {:rel => ele.attributes['rel'], :href => ele.attributes['href']}
107
+ @acl_uri = ele.attributes['href'] if ele.attributes['rel'].include? 'accessControlList'
108
+ end
109
+ end
110
+ return xml.root
111
+ end
112
+
113
+ #Saves the object if it exsits, otherwise creates it.
114
+ def save
115
+ if @exists
116
+ ret = service.send_request(Request.new(:put, @edit_uri, to_xml))
117
+ else
118
+ ret = create
119
+ end
120
+ if not ret or not load(ret.read_body)
121
+ raise SaveFailed, 'Could not save object'
122
+ end
123
+ return true
124
+ end
125
+
126
+ #Creates the object. This must be overridden in a subclass, as the feed url for creating new
127
+ #objects/entries is service dependent. In other words, each google service uses a different
128
+ #URI for saving new objects.
129
+ def create
130
+ return false
131
+ end
132
+
133
+ #Deletes the object.
134
+ def delete
135
+ if @exists
136
+ service.send_request(Request.new(:delete, @feed_uri, nil, {"If-Match" => "*"}))
137
+ end
138
+ @exists = false
139
+ return true
140
+ end
141
+
142
+ #Creates a new string containing the XML representation of the object as a GData compliant <entry>
143
+ #element.
144
+ def to_xml
145
+ xml = REXML::Document.new(@xml)
146
+ xml.root.elements.each(){}.map do |ele|
147
+ if @include_etag
148
+ xml.root.attributes['gd:etag'] = @etag if @etag and @etag != ''
149
+ else
150
+ xml.root.delete_attribute('gd:etag')
151
+ end
152
+ case ele.name
153
+ when "title"
154
+ ele.text = @title
155
+ end
156
+ end
157
+ xml.to_s
158
+ end
159
+ end
160
+ end
@@ -0,0 +1,61 @@
1
+ # Author:: Mike Reich (mike@seabourneconsulting.com)
2
+ # Copyright:: Copyright (C) 2010 Mike Reich
3
+ # License:: GPL v2
4
+ #--
5
+ # Licensed under the General Public License (GPL), Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ #
15
+ # Feel free to use and update, but be sure to contribute your
16
+ # code back to the project and attribute as required by the license.
17
+ #++
18
+ require "uri"
19
+
20
+ module GData4Ruby
21
+ #The Request class holds all information needed to make a Request to a Google service.
22
+ class Request
23
+ #The HTTP request type, must be one of :get, :post, :put, :delete
24
+ attr_accessor :type
25
+
26
+ #The HTTP request content, only valid for :put and :post requests
27
+ attr_accessor :content
28
+
29
+ #Optional. Additional headers to pass with the request.
30
+ attr_accessor :headers
31
+
32
+ #Optional. Additional query parameters (i.e. "?param=value") to append to the request url
33
+ attr_reader :parameters
34
+
35
+ #Creates a new request object.
36
+ def initialize(type, url, content = nil, headers = nil, query_parameters = nil)
37
+ @parameters = nil
38
+ @headers = headers
39
+ @content = content
40
+ @type = type
41
+ @url = URI.parse(url)
42
+ self.parameters = query_parameters
43
+ end
44
+
45
+ #The HTTP url to send the request to
46
+ def url=(new_url)
47
+ @url = new_url
48
+ end
49
+
50
+ #A hash of additional query parameters (i.e. {'param' => 'value') to append to the request url
51
+ def parameters=(query_parameters)
52
+ raise ArgumentError, 'Query parameters must be a Hash' if query_parameters and not query_parameters.is_a? Hash
53
+ @parameters = "?#{query_parameters.to_a.collect{|a| a.join("=")}.join("&")}" if query_parameters
54
+ end
55
+
56
+ #The HTTP url to send the request to
57
+ def url
58
+ return URI.parse("#{@url+(@parameters ? @parameters : '')}")
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,55 @@
1
+ # Author:: Mike Reich (mike@seabourneconsulting.com)
2
+ # Copyright:: Copyright (C) 2010 Mike Reich
3
+ # License:: GPL v2
4
+ #--
5
+ # Licensed under the General Public License (GPL), Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ #
15
+ # Feel free to use and update, but be sure to contribute your
16
+ # code back to the project and attribute as required by the license.
17
+ #++
18
+ require 'gdata4ruby/base'
19
+
20
+ module GData4Ruby
21
+ #The service class is the main handler for all direct interactions with the
22
+ #Google Data API.
23
+
24
+ class Service < Base
25
+ #Convenience attribute contains the currently authenticated account name
26
+ attr_reader :account
27
+
28
+ # The token returned by the Google servers, used to authorize all subsequent messages
29
+ attr_reader :auth_token
30
+
31
+ #Accepts an optional attributes hash for initialization values, most likely :gdata_version
32
+ def initialize(attributes = {})
33
+ super(attributes)
34
+ attributes.each do |key, value|
35
+ self.send("#{key}=", value)
36
+ end
37
+ end
38
+
39
+ # The authenticate method passes the username and password to google servers.
40
+ # If authentication succeeds, returns true, otherwise raises the AuthenticationFailed error.
41
+ def authenticate(username, password, service)
42
+ @auth_token = nil
43
+ ret = nil
44
+ ret = send_request(Request.new(:post, AUTH_URL, "Email=#{username}&Passwd=#{password}&source=GCal4Ruby&service=#{service}&accountType=HOSTED_OR_GOOGLE"))
45
+ if ret.class == Net::HTTPOK
46
+ @auth_token = ret.read_body.to_a[2].gsub("Auth=", "").strip
47
+ @account = username
48
+ @password = password
49
+ return true
50
+ else
51
+ raise AuthenticationFailed
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,33 @@
1
+ # Author:: Mike Reich (mike@seabourneconsulting.com)
2
+ # Copyright:: Copyright (C) 2010 Mike Reich
3
+ # License:: GPL v2
4
+ #--
5
+ # Licensed under the General Public License (GPL), Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ #
15
+ # Feel free to use and update, but be sure to contribute your
16
+ # code back to the project and attribute as required by the license.
17
+ #++
18
+ module GData4Ruby
19
+ #A helper class that includes commonly used utility methods.
20
+ class Utils
21
+ #Adds common Google namespaces to an element. Useful for processing individual events returned from in a feed.
22
+ def self.add_namespaces(entry)
23
+ entry.attributes["xmlns:openSearch"] = "http://a9.com/-/spec/opensearch/1.1/"
24
+ entry.attributes["xmlns:gAcl"] = "http://schemas.google.com/acl/2007"
25
+ entry.attributes["xmlns:gCal"] = "http://schemas.google.com/gCal/2005"
26
+ entry.attributes["xmlns:gd"] = "http://schemas.google.com/g/2005"
27
+ entry.attributes["xmlns:app"] = "http://www.w3.org/2007/app"
28
+ entry.attributes["xmlns:docs"] = "http://schemas.google.com/docs/2007"
29
+ entry.attributes["xmlns"] = "http://www.w3.org/2005/Atom"
30
+ entry
31
+ end
32
+ end
33
+ end
data/lib/gdata4ruby.rb ADDED
@@ -0,0 +1 @@
1
+ require "gdata4ruby/service"
data/test/unit.rb ADDED
@@ -0,0 +1,55 @@
1
+ #!/usr/bin/ruby
2
+
3
+ require 'rubygems'
4
+ require 'gdata4ruby'
5
+ include GData4Ruby
6
+
7
+ @service = Service.new
8
+ @username = nil
9
+ @password = nil
10
+
11
+ def tester
12
+ if ARGV.include?("-d")
13
+ @service.debug = true
14
+ end
15
+ ARGV.each do |ar|
16
+ if ar.match("username=")
17
+ @username = ar.gsub("username=", "")
18
+ end
19
+ if ar.match("password=")
20
+ @password = ar.gsub("password=", "")
21
+ end
22
+ end
23
+ service_test
24
+ end
25
+
26
+ def service_test
27
+ puts "---Starting Service Test---"
28
+ puts "1. Authenticate"
29
+ if @service.authenticate(@username, @password, 'cl')
30
+ successful
31
+ else
32
+ failed
33
+ end
34
+
35
+ puts "2. Authenticate with GData version 3.0"
36
+ @service = Service.new({:gdata_version => '3.0'})
37
+ if @service.authenticate(@username, @password, 'cl') and @service.gdata_version == '3.0'
38
+ successful
39
+ else
40
+ failed
41
+ end
42
+ end
43
+
44
+ def failed(m = nil)
45
+ puts "Test Failed"
46
+ puts m if m
47
+ exit()
48
+ end
49
+
50
+ def successful(m = nil)
51
+ puts "Test Successful"
52
+ puts m if m
53
+ end
54
+
55
+ tester
metadata ADDED
@@ -0,0 +1,63 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: gdata4ruby
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Mike Reich
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2010-04-28 00:00:00 +10:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description: A full featured wrapper for interacting with the base Google Data API, including authentication and basic object handling
17
+ email: mike@seabourneconsulting.com
18
+ executables: []
19
+
20
+ extensions: []
21
+
22
+ extra_rdoc_files: []
23
+
24
+ files:
25
+ - README
26
+ - CHANGELOG
27
+ - lib/gdata4ruby.rb
28
+ - lib/gdata4ruby/base.rb
29
+ - lib/gdata4ruby/service.rb
30
+ - lib/gdata4ruby/request.rb
31
+ - lib/gdata4ruby/gdata_object.rb
32
+ - lib/gdata4ruby/utils/utils.rb
33
+ - lib/gdata4ruby/acl/access_rule.rb
34
+ has_rdoc: true
35
+ homepage: http://cookingandcoding.com/gdata4ruby/
36
+ licenses: []
37
+
38
+ post_install_message:
39
+ rdoc_options: []
40
+
41
+ require_paths:
42
+ - lib
43
+ required_ruby_version: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: "0"
48
+ version:
49
+ required_rubygems_version: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: "0"
54
+ version:
55
+ requirements: []
56
+
57
+ rubyforge_project: gdata4ruby
58
+ rubygems_version: 1.3.5
59
+ signing_key:
60
+ specification_version: 3
61
+ summary: A full featured wrapper for interacting with the base Google Data API
62
+ test_files:
63
+ - test/unit.rb