google_apps 0.4.9.2 → 0.4.9.9

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/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