google_apps 0.4.9.2 → 0.4.9.9

Sign up to get free protection for your applications and to get access to all the features.
data/lib/google_apps.rb CHANGED
@@ -9,7 +9,6 @@ require 'google_apps/atom/user'
9
9
  require 'google_apps/atom/group'
10
10
  require 'google_apps/atom/public_key'
11
11
  require 'google_apps/atom/export'
12
- require 'google_apps/atom/message'
13
12
  require 'google_apps/atom/message_attributes'
14
13
  require 'google_apps/atom/group_member'
15
14
  require 'google_apps/atom/nickname'
@@ -33,6 +33,12 @@ module GoogleApps
33
33
  nickname: {
34
34
  name: :nickname,
35
35
  userName: :user
36
+ },
37
+ group: {
38
+ groupId: :id,
39
+ groupName: :name,
40
+ emailPermission: :permission,
41
+ description: :description
36
42
  }
37
43
  }
38
44
 
@@ -44,16 +44,49 @@ module GoogleApps
44
44
  # internal consistency in the object.
45
45
  #
46
46
  # find_values
47
- def find_values # Moved from User and Group, causing segfault but only at odd times
47
+ def find_values
48
48
  map_key = self.class.to_s.split(':').last.downcase.to_sym
49
49
  map = Atom::MAPS[map_key]
50
50
 
51
51
  @document.root.each do |entry|
52
52
  intersect = map.keys & entry.attributes.to_h.keys.map(&:to_sym)
53
- unless intersect.empty?
54
- intersect.each do |attribute|
55
- instance_variable_set "@#{map[attribute]}", check_value(entry.attributes[attribute])
56
- end
53
+ set_instances(intersect, entry, map) unless intersect.empty?
54
+ end
55
+ end
56
+
57
+
58
+ # Sets instance variables in the current object based on
59
+ # values found in the XML document and the mapping specified
60
+ # in GoogleApps::Atom::MAPS
61
+
62
+ #
63
+ # @param [Array] intersect
64
+ # @param [LibXML::XML::Node] node
65
+ # @param [Hash] map
66
+ #
67
+ # @visibility public
68
+ # @return
69
+ def set_instances(intersect, node, map)
70
+ intersect.each do |attribute|
71
+ instance_variable_set "@#{map[attribute]}", check_value(node.attributes[attribute])
72
+ end
73
+ end
74
+
75
+
76
+ #
77
+
78
+ # Sets instance variables for property list type documents.
79
+ #
80
+ # @visibility public
81
+ # @return
82
+ def attrs_from_props
83
+ map_key = self.class.to_s.split(':').last.downcase.to_sym
84
+ map = Atom::MAPS[map_key]
85
+
86
+ @document.find('//apps:property').each do |entry|
87
+ prop_name = entry.attributes['name'].to_sym
88
+ if map.keys.include?(prop_name)
89
+ instance_variable_set "@#{map[prop_name]}", check_value(entry.attributes['value'])
57
90
  end
58
91
  end
59
92
  end
@@ -115,6 +148,21 @@ module GoogleApps
115
148
 
116
149
  ns
117
150
  end
151
+
152
+
153
+ #
154
+ # Delete a node from the document
155
+ #
156
+ # @param [String] xpath is a node identifier in Xpath format
157
+ # @param [Array] attrs is an array of attr, value pairs
158
+ #
159
+ # @visibility public
160
+ # @return
161
+ def delete_node(xpath, attrs)
162
+ @document.find(xpath).each do |node|
163
+ node.remove! if node_match?(node, attrs)
164
+ end
165
+ end
118
166
  end
119
167
  end
120
168
  end
@@ -8,12 +8,18 @@ module GoogleApps
8
8
 
9
9
  attr_reader :xml, :items, :next_page
10
10
 
11
- TYPE_MATCH = /<id.*(user|group|nickname).*?<\/id/
12
- #TYPE_MATCH = /term.*?\#(\w*?)/
11
+ # TODO: Figure out how to handle Group Members. The regex below
12
+ # doesn't work in that case as group members also have group in
13
+ # the id url.
14
+ TYPE_MATCH = /<id.*(user|group.*member|nickname|group).*?<\/id/
15
+
13
16
 
14
17
  def initialize(xml)
18
+ type = xml.match(TYPE_MATCH).captures[0]
19
+ type.sub!(/\//, '_')
20
+
15
21
  @xml = parse(xml)
16
- @items = entries_from document: @xml, type: @xml.to_s.match(TYPE_MATCH).captures[0], entry_tag: 'entry'
22
+ @items = entries_from document: @xml, type: type, entry_tag: 'entry'
17
23
  end
18
24
 
19
25
  # TODO: Need to make sure this works for feeds other than user.
@@ -74,7 +80,7 @@ module GoogleApps
74
80
  #
75
81
  # add_category returns the modified content_array
76
82
  def add_category(content_array, type)
77
- content_array.unshift(create_node(type: 'atom:category', attrs: Atom::CATEGORY[type.to_sym]).to_s)
83
+ content_array.unshift(create_node(type: 'atom:category', attrs: Atom::CATEGORY[type.to_sym]).to_s) if Atom::CATEGORY[type.to_sym]
78
84
  end
79
85
 
80
86
 
@@ -11,6 +11,7 @@ module GoogleApps
11
11
  def initialize(xml = nil)
12
12
  if xml
13
13
  @document = parse(xml)
14
+ attrs_from_props
14
15
  else
15
16
  @document = Atom::XML::Document.new
16
17
  @document.root = build_root
@@ -97,18 +98,6 @@ module GoogleApps
97
98
  private
98
99
 
99
100
 
100
- def check_value(value)
101
- case value
102
- when 'true'
103
- true
104
- when 'false'
105
- false
106
- else
107
- value
108
- end
109
- end
110
-
111
-
112
101
  # prop_name takes a LibXML::XML::Node object and
113
102
  # sets the name attribute based on the provided
114
103
  # key.
@@ -4,11 +4,16 @@ module GoogleApps
4
4
  include Atom::Node
5
5
  include Atom::Document
6
6
 
7
- attr_accessor :member
7
+ attr_accessor :member, :type
8
8
 
9
- def initialize
10
- @document = Atom::XML::Document.new
11
- @document.root = build_root
9
+ def initialize(xml = nil)
10
+ if xml
11
+ @document = parse(xml)
12
+ populate_self
13
+ else
14
+ @document = Atom::XML::Document.new
15
+ @document.root = build_root
16
+ end
12
17
  end
13
18
 
14
19
 
@@ -20,10 +25,21 @@ module GoogleApps
20
25
  #
21
26
  # member= returns the value of @member
22
27
  def member=(member)
23
- @member.nil? ? set_member(member) : change_member(member)
28
+ @member.nil? ? add_node('memberId', member) : change_node('memberId', member)
29
+
30
+ @document = parse(@document)
31
+ @member = member
24
32
  end
25
33
 
26
34
 
35
+ def type=(type)
36
+ @type.nil? ? add_node('memberType', type) : change_node('memberType', type)
37
+
38
+ @document = parse(@document)
39
+ @type = type
40
+ end
41
+
42
+
27
43
  # to_s returns @document as a string.
28
44
  def to_s
29
45
  @document.to_s
@@ -32,20 +48,23 @@ module GoogleApps
32
48
 
33
49
  private
34
50
 
35
- # set_member adds a memberId property element to
36
- # the XML document and sets @member to the given
37
- # value.
38
- #
39
- # set_member 'test_user@cnm.edu'
40
- #
41
- # set_member returns the value of @member
42
- def set_member(member)
43
- @document.root << create_node(type: 'apps:property', attrs: [['name', 'memberId'], ['value', member]])
44
-
45
- @member = member
51
+ #
52
+ # @param [] type
53
+ # @param [] value
54
+ #
55
+ # @visibility private
56
+ # @return
57
+ def add_node(type, value)
58
+ @document.root << create_node(type: 'apps:property', attrs: [['name', type], ['value', value]])
46
59
  end
47
60
 
48
61
 
62
+ def change_node(type, value)
63
+ @document.find('//apps:property').each do |node|
64
+ node.attributes['value'] = value if node.attributes['name'] == type
65
+ end
66
+ end
67
+
49
68
  # change_member changes the value attribute of the
50
69
  # apps:property element in @document to the value
51
70
  # of the provided argument. It also sets @member
@@ -64,10 +83,16 @@ module GoogleApps
64
83
  @member = member
65
84
  end
66
85
 
67
- # parse_doc parses the current @document so that it can
68
- # be searched with find.
69
- def parse_doc(document = @document)
70
- Atom::XML::Parser.document(document).parse
86
+
87
+ #
88
+ #
89
+ # @visibility private
90
+ # @return
91
+ def populate_self
92
+ @document.find('//apps:property').each do |node|
93
+ @member = node.attributes['value'] if node.attributes['name'] == 'memberId'
94
+ @type = node.attributes['value'] if node.attributes['name'] == 'memberType'
95
+ end
71
96
  end
72
97
  end
73
98
  end
@@ -24,6 +24,7 @@ module GoogleApps
24
24
  property['value'] = prop
25
25
 
26
26
  @document.root << property
27
+ @document = parse(@document)
27
28
  end
28
29
 
29
30
  def property=(value)
@@ -36,6 +37,7 @@ module GoogleApps
36
37
 
37
38
  @document.root << label
38
39
  @labels << name
40
+ @document = parse(@document)
39
41
  end
40
42
 
41
43
  def <<(value)
@@ -44,7 +46,7 @@ module GoogleApps
44
46
 
45
47
  def remove_label(value)
46
48
  @labels.delete(value)
47
- # Need a way to remove a node from the document.
49
+ delete_node('//apps:label', labelName: [value])
48
50
  end
49
51
 
50
52
  def to_s
@@ -104,6 +104,25 @@ module GoogleApps
104
104
  values
105
105
  end
106
106
  end
107
+
108
+
109
+ # Returns true if "true" and false if "false"
110
+
111
+ #
112
+ # @param [String] value
113
+ #
114
+ # @visibility public
115
+ # @return
116
+ def check_value(value)
117
+ case value
118
+ when 'true'
119
+ true
120
+ when 'false'
121
+ false
122
+ else
123
+ value
124
+ end
125
+ end
107
126
  end
108
127
  end
109
128
  end
@@ -164,18 +164,6 @@ module GoogleApps
164
164
  def new_doc
165
165
  @document = Atom::XML::Document.new
166
166
  end
167
-
168
-
169
- def check_value(value)
170
- case value
171
- when 'true'
172
- true
173
- when 'false'
174
- false
175
- else
176
- value
177
- end
178
- end
179
167
  end
180
168
  end
181
169
  end
@@ -184,11 +184,24 @@ module GoogleApps
184
184
  type = normalize_type type
185
185
 
186
186
  options[:limit] ? limit = options[:limit] : limit = 1000000
187
- options[:start] ? get(instance_variable_get("@#{type}") + "?#{start_query(type)}=#{options[:start]}", :feed) : get(instance_variable_get("@#{type}"), :feed)
187
+ options[:start] ? get(instance_variable_get("@#{type}") + "#{options[:extra]}" + "?#{start_query(type)}=#{options[:start]}", :feed) : get(instance_variable_get("@#{type}") + "#{options[:extra]}", :feed)
188
188
 
189
189
  fetch_feed(page, limit, :feed)
190
190
 
191
- @response
191
+ #@response
192
+ return_all
193
+ end
194
+
195
+
196
+ # Retrieves the members of the requested group.
197
+ #
198
+ # @param [String] group_id the Group ID in the Google Apps Environment
199
+ #
200
+ # @visibility public
201
+ # @return
202
+ def get_members_of(group_id, options = {})
203
+ options[:extra] = "/#{group_id}/member"
204
+ get_all :groups, options
192
205
  end
193
206
 
194
207
 
@@ -373,6 +386,18 @@ module GoogleApps
373
386
  SUCCESS_CODES.include?(@response.code.to_i)
374
387
  end
375
388
 
389
+
390
+ #
391
+ # Takes all the items in each feed and puts them into one array.
392
+ #
393
+ # @visibility private
394
+ # @return Array of Documents
395
+ def return_all
396
+ @feeds.inject([]) do |results, feed|
397
+ results | feed.items
398
+ end
399
+ end
400
+
376
401
 
377
402
  # Grab the auth token from the response body
378
403
  def set_auth_token
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: google_apps
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.9.2
4
+ version: 0.4.9.9
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-08-13 00:00:00.000000000 Z
12
+ date: 2012-08-15 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: libxml-ruby
@@ -40,7 +40,6 @@ files:
40
40
  - lib/google_apps/atom/feed.rb
41
41
  - lib/google_apps/atom/group.rb
42
42
  - lib/google_apps/atom/group_member.rb
43
- - lib/google_apps/atom/message.rb
44
43
  - lib/google_apps/atom/message_attributes.rb
45
44
  - lib/google_apps/atom/nickname.rb
46
45
  - lib/google_apps/atom/node.rb
@@ -1,21 +0,0 @@
1
- module GoogleApps
2
- module Atom
3
- class Message
4
- def initialize
5
- @document = Atom::XML::Document.new
6
- end
7
-
8
- def from(filename)
9
- message = File.read(filename)
10
- @document.root = Atom::XML::Node.new('apps:rfc822Msg', message)
11
- Atom::XML::Namespace.new(@document.root, 'apps', 'http://schemas.google.com/apps/2006')
12
-
13
- @document
14
- end
15
-
16
- def to_s
17
- @document.to_s
18
- end
19
- end
20
- end
21
- end