simple_crowd 1.0.5 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,199 +1,199 @@
1
- module SimpleCrowd
2
- class ExtendedProperty < Hashie::Dash
3
- property :name
4
- property :default
5
- property :attribute
6
- property :immutable
7
- property :maps, :default => {}
8
- property :mappers, :default => {}
9
- def immutable?; @immutable; end
10
- def is_attribute?; @attribute end
11
- end
12
- class CrowdEntity < Hashie::Mash
13
- def initialize(data = {}, notused = nil)
14
- self.class.properties.each do |prop|
15
- self.send("#{prop.name}=", self.class.defaults[prop.name.to_sym])
16
- end
17
- attrs = data[:attributes].nil? ? [] : data[:attributes].keys
18
- data.merge! data[:attributes] unless attrs.empty?
19
- data.delete :attributes
20
- data.each_pair do |att, value|
21
- #ruby_att = att_to_ruby att
22
- ruby_att = att
23
- real_att = real_key_for ruby_att
24
- (@attributes ||= []) << real_att if attrs.include?(att)
25
- prop = self.class.property_by_name(real_att)
26
- self.send("#{real_att}=", value) unless prop.nil?
27
- self[real_att] = value if prop.nil?
28
- end
29
- # We just initialized the attributes so clear the dirty status
30
- dirty_properties.clear
31
- end
32
- def self.property(property_name, options = {})
33
- property_name = property_name.to_sym
34
-
35
- maps = options.inject({}) {|map, (key, value)| map[$1.to_sym] = value.to_sym if key.to_s =~ /^map_(.*)$/; map }
36
- mappers = options.inject({}) {|map, (key, value)| map[$1.to_sym] = value if key.to_s =~ /^mapper_(.*)$/; map }
37
- options.reject! {|key, val| key.to_s =~ /^map_(.*)$/ || key.to_s =~ /^mapper_(.*)$/ }
38
- (@properties ||= []) << ExtendedProperty.new({:name => property_name, :maps => maps, :mappers => mappers}.merge(options))
39
- (@attributes ||= []) << property_name if options[:attribute]
40
-
41
- class_eval <<-RUBY
42
- def #{property_name}
43
- self[:#{property_name}]
44
- end
45
- def #{property_name}=(val)
46
- (dirty_properties << :#{property_name}).uniq! unless val == self[:#{property_name}]
47
- self[:#{property_name}] = val
48
- end
49
- RUBY
50
-
51
- maps.each_value do |v|
52
- alias_method v, property_name
53
- alias_method :"#{v}=", :"#{property_name}="
54
- end
55
- end
56
-
57
- def self.properties
58
- properties = []
59
- ancestors.each do |elder|
60
- if elder.instance_variable_defined?("@properties")
61
- properties << elder.instance_variable_get("@properties")
62
- end
63
- end
64
-
65
- properties.reverse.flatten
66
- end
67
-
68
- def self.property_by_name(property_name)
69
- property_name = property_name.to_sym
70
- properties.detect {|p| p.name == property_name || p.maps.value?(property_name)}
71
- end
72
-
73
- def self.properties_by_name(property_name)
74
- property_name = property_name.to_sym
75
- properties.select {|p| p.name == property_name || p.maps.value?(property_name)}
76
- end
77
-
78
- def self.property?(prop)
79
- !property_by_name(prop.to_sym).nil?
80
- end
81
-
82
- def self.defaults
83
- properties.inject({}) {|hash, prop| hash[prop.name] = prop['default'] unless prop['default'].nil?; hash }
84
- end
85
-
86
- def self.attribute_mappers hash = nil
87
- @attribute_mappers ||= {:soap => SimpleCrowd::Mappers::SoapAttributes}
88
- unless hash.nil?
89
- @attribute_mappers.merge! hash if hash.is_a? Hash
90
- end
91
- @attribute_mappers
92
- end
93
-
94
- def self.map_for type
95
- type = type.to_sym
96
- properties.inject({}) {|hash, prop| hash[prop.name] = prop.maps[type] unless prop.maps[type].nil?; hash }
97
- end
98
-
99
- def self.map_to type, entity
100
- map = map_for type
101
- attrs = {}
102
- out = entity.inject({}) do |hash, (key, val)|
103
- key = key.to_sym
104
- catch(:skip_prop) do
105
- unless val.nil?
106
- mapped_key = map[key].nil? ? key : map[key]
107
- prop = property_by_name key
108
- if prop.nil?
109
- attrs[mapped_key] = val
110
- throw :skip_prop
111
- end
112
- mapper = prop.mappers[type]
113
- #val = val.inject({}) {|attrs, (k, v)| attrs[property_by_name(k).maps[type]]= v unless v.nil?; attrs} if key == :attributes
114
- val = mapper.produce val unless mapper.nil?
115
- if prop.attribute || entity.attributes_keys.include?(key)
116
- attrs[mapped_key] = val
117
- else
118
- hash[mapped_key] = val
119
- end
120
- end
121
- end
122
- hash
123
- end
124
- out[:attributes] = attribute_mappers[type].produce attrs
125
- out
126
- end
127
-
128
- def self.parse_from type, entity
129
- entity[:attributes] = attribute_mappers[type].parse entity[:attributes]
130
- parsed_entity = entity.inject({}) do |hash, (key, val)|
131
- prop = property_by_name key
132
- unless prop.nil?
133
- mapper = prop.mappers[type]
134
- val = mapper.parse val unless mapper.nil?
135
- end
136
- hash[key] = val
137
- hash
138
- end
139
- self.new(parsed_entity)
140
- end
141
-
142
- def map_to type
143
- self.class.map_to type, self
144
- end
145
-
146
- def attributes_keys
147
- keys = []
148
- self.class.ancestors.each do |elder|
149
- if elder.instance_variable_defined?("@attributes")
150
- keys << elder.instance_variable_get("@attributes")
151
- end
152
- end
153
- keys << @attributes unless @attributes.nil?
154
- keys.flatten.uniq
155
- end
156
-
157
- def attributes
158
- self.inject({}) {|hash, (k, v)| hash[k] = v if attributes_keys.include?(k.to_sym); hash}
159
- end
160
-
161
- def dirty_properties
162
- @dirty_properties ||= Array.new
163
- end
164
-
165
- def dirty_attributes
166
- dirty_properties & attributes_keys
167
- end
168
-
169
- def dirty? prop = nil
170
- prop.nil? ? !@dirty_properties.empty? : @dirty_properties.include?(prop)
171
- end
172
-
173
- def clean
174
- @dirty_properties = Array.new
175
- end
176
-
177
- def update_with attrs
178
- current_keys = attributes_keys
179
- attrs.each_pair {|k, v| self.send(:"#{k}=", v) if current_keys.include?(k.to_sym) && v != self.send(k.to_sym)}
180
- end
181
-
182
- def []= key, val
183
- prop = self.class.property_by_name key
184
- (@attributes ||= []) << key if prop.nil?
185
- super
186
- end
187
-
188
- private
189
- def self.real_key_for att
190
- p = property_by_name att
191
- p.nil? ? att : p.name
192
- end
193
- def self.att_to_ruby att
194
- att.to_s =~ /^[a-z]*([A-Z][^A-Z]*)*$/ ? att.to_s.underscore.to_sym : att.to_sym
195
- end
196
- def real_key_for att; self.class.real_key_for att; end
197
- def att_to_ruby att; self.class.att_to_ruby att; end
198
- end
199
- end
1
+ module SimpleCrowd
2
+ class ExtendedProperty < Hashie::Dash
3
+ property :name
4
+ property :default
5
+ property :attribute
6
+ property :immutable
7
+ property :maps, :default => {}
8
+ property :mappers, :default => {}
9
+ def immutable?; @immutable; end
10
+ def is_attribute?; @attribute end
11
+ end
12
+ class CrowdEntity < Hashie::Mash
13
+ def initialize(data = {}, notused = nil)
14
+ self.class.properties.each do |prop|
15
+ self.send("#{prop.name}=", self.class.defaults[prop.name.to_sym])
16
+ end
17
+ attrs = data[:attributes].nil? ? [] : data[:attributes].keys
18
+ data.merge! data[:attributes] unless attrs.empty?
19
+ data.delete :attributes
20
+ data.each_pair do |att, value|
21
+ #ruby_att = att_to_ruby att
22
+ ruby_att = att
23
+ real_att = real_key_for ruby_att
24
+ (@attributes ||= []) << real_att if attrs.include?(att)
25
+ prop = self.class.property_by_name(real_att)
26
+ self.send("#{real_att}=", value) unless prop.nil?
27
+ self[real_att] = value if prop.nil?
28
+ end
29
+ # We just initialized the attributes so clear the dirty status
30
+ dirty_properties.clear
31
+ end
32
+ def self.property(property_name, options = {})
33
+ property_name = property_name.to_sym
34
+
35
+ maps = options.inject({}) {|map, (key, value)| map[$1.to_sym] = value.to_sym if key.to_s =~ /^map_(.*)$/; map }
36
+ mappers = options.inject({}) {|map, (key, value)| map[$1.to_sym] = value if key.to_s =~ /^mapper_(.*)$/; map }
37
+ options.reject! {|key, val| key.to_s =~ /^map_(.*)$/ || key.to_s =~ /^mapper_(.*)$/ }
38
+ (@properties ||= []) << ExtendedProperty.new({:name => property_name, :maps => maps, :mappers => mappers}.merge(options))
39
+ (@attributes ||= []) << property_name if options[:attribute]
40
+
41
+ class_eval <<-RUBY
42
+ def #{property_name}
43
+ self[:#{property_name}]
44
+ end
45
+ def #{property_name}=(val)
46
+ (dirty_properties << :#{property_name}).uniq! unless val == self[:#{property_name}]
47
+ self[:#{property_name}] = val
48
+ end
49
+ RUBY
50
+
51
+ maps.each_value do |v|
52
+ alias_method v, property_name
53
+ alias_method :"#{v}=", :"#{property_name}="
54
+ end
55
+ end
56
+
57
+ def self.properties
58
+ properties = []
59
+ ancestors.each do |elder|
60
+ if elder.instance_variable_defined?("@properties")
61
+ properties << elder.instance_variable_get("@properties")
62
+ end
63
+ end
64
+
65
+ properties.reverse.flatten
66
+ end
67
+
68
+ def self.property_by_name(property_name)
69
+ property_name = property_name.to_sym
70
+ properties.detect {|p| p.name == property_name || p.maps.value?(property_name)}
71
+ end
72
+
73
+ def self.properties_by_name(property_name)
74
+ property_name = property_name.to_sym
75
+ properties.select {|p| p.name == property_name || p.maps.value?(property_name)}
76
+ end
77
+
78
+ def self.property?(prop)
79
+ !property_by_name(prop.to_sym).nil?
80
+ end
81
+
82
+ def self.defaults
83
+ properties.inject({}) {|hash, prop| hash[prop.name] = prop['default'] unless prop['default'].nil?; hash }
84
+ end
85
+
86
+ def self.attribute_mappers hash = nil
87
+ @attribute_mappers ||= {:soap => SimpleCrowd::Mappers::SoapAttributes}
88
+ unless hash.nil?
89
+ @attribute_mappers.merge! hash if hash.is_a? Hash
90
+ end
91
+ @attribute_mappers
92
+ end
93
+
94
+ def self.map_for type
95
+ type = type.to_sym
96
+ properties.inject({}) {|hash, prop| hash[prop.name] = prop.maps[type] unless prop.maps[type].nil?; hash }
97
+ end
98
+
99
+ def self.map_to type, entity
100
+ map = map_for type
101
+ attrs = {}
102
+ out = entity.inject({}) do |hash, (key, val)|
103
+ key = key.to_sym
104
+ catch(:skip_prop) do
105
+ unless val.nil?
106
+ mapped_key = map[key].nil? ? key : map[key]
107
+ prop = property_by_name key
108
+ if prop.nil?
109
+ attrs[mapped_key] = val
110
+ throw :skip_prop
111
+ end
112
+ mapper = prop.mappers[type]
113
+ #val = val.inject({}) {|attrs, (k, v)| attrs[property_by_name(k).maps[type]]= v unless v.nil?; attrs} if key == :attributes
114
+ val = mapper.produce val unless mapper.nil?
115
+ if prop.attribute || entity.attributes_keys.include?(key)
116
+ attrs[mapped_key] = val
117
+ else
118
+ hash[mapped_key] = val
119
+ end
120
+ end
121
+ end
122
+ hash
123
+ end
124
+ out[:attributes] = attribute_mappers[type].produce attrs
125
+ out
126
+ end
127
+
128
+ def self.parse_from type, entity
129
+ entity[:attributes] = attribute_mappers[type].parse entity[:attributes]
130
+ parsed_entity = entity.inject({}) do |hash, (key, val)|
131
+ prop = property_by_name key
132
+ unless prop.nil?
133
+ mapper = prop.mappers[type]
134
+ val = mapper.parse val unless mapper.nil?
135
+ end
136
+ hash[key] = val
137
+ hash
138
+ end
139
+ self.new(parsed_entity)
140
+ end
141
+
142
+ def map_to type
143
+ self.class.map_to type, self
144
+ end
145
+
146
+ def attributes_keys
147
+ keys = []
148
+ self.class.ancestors.each do |elder|
149
+ if elder.instance_variable_defined?("@attributes")
150
+ keys << elder.instance_variable_get("@attributes")
151
+ end
152
+ end
153
+ keys << @attributes unless @attributes.nil?
154
+ keys.flatten.uniq
155
+ end
156
+
157
+ def attributes
158
+ self.inject({}) {|hash, (k, v)| hash[k] = v if attributes_keys.include?(k.to_sym); hash}
159
+ end
160
+
161
+ def dirty_properties
162
+ @dirty_properties ||= Array.new
163
+ end
164
+
165
+ def dirty_attributes
166
+ dirty_properties & attributes_keys
167
+ end
168
+
169
+ def dirty? prop = nil
170
+ prop.nil? ? !@dirty_properties.empty? : @dirty_properties.include?(prop)
171
+ end
172
+
173
+ def clean
174
+ @dirty_properties = Array.new
175
+ end
176
+
177
+ def update_with attrs
178
+ current_keys = attributes_keys
179
+ attrs.each_pair {|k, v| self.send(:"#{k}=", v) if current_keys.include?(k.to_sym) && v != self.send(k.to_sym)}
180
+ end
181
+
182
+ def []= key, val
183
+ prop = self.class.property_by_name key
184
+ (@attributes ||= []) << key if prop.nil?
185
+ super
186
+ end
187
+
188
+ private
189
+ def self.real_key_for att
190
+ p = property_by_name att
191
+ p.nil? ? att : p.name
192
+ end
193
+ def self.att_to_ruby att
194
+ att.to_s =~ /^[a-z]*([A-Z][^A-Z]*)*$/ ? att.to_s.underscore.to_sym : att.to_sym
195
+ end
196
+ def real_key_for att; self.class.real_key_for att; end
197
+ def att_to_ruby att; self.class.att_to_ruby att; end
198
+ end
199
+ end
@@ -1,15 +1,24 @@
1
- module SimpleCrowd
2
- class CrowdError < StandardError
3
- attr_accessor :response
4
- attr_reader :type
5
- def initialize string, data = nil
6
- super string
7
- self.response = data unless data.nil?
8
- @type = data[:detail].keys.first unless data.nil?
9
- end
10
-
11
- def type? type
12
- @type == type.to_sym
13
- end
14
- end
15
- end
1
+ module SimpleCrowd
2
+ class CrowdError < StandardError
3
+ attr_reader :response
4
+ attr_reader :type
5
+ attr_reader :original
6
+
7
+ def initialize(string, original)
8
+ super string
9
+ @original = original
10
+
11
+ if original.is_a?(Savon::SOAP::Fault)
12
+ @response = original.http
13
+ @type = original.to_hash[:fault][:detail].keys.first rescue nil
14
+ elsif original.is_a?(Savon::HTTP::Error)
15
+ @response = original.http
16
+ @type = :http
17
+ end
18
+ end
19
+
20
+ def type? type
21
+ @type == type.to_sym
22
+ end
23
+ end
24
+ end
@@ -1,11 +1,11 @@
1
- module SimpleCrowd
2
- class Group < CrowdEntity
3
- property :id
4
- property :name
5
- property :active, :default => true
6
- property :description
7
- property :directory_id
8
-
9
- property :members
10
- end
11
- end
1
+ module SimpleCrowd
2
+ class Group < CrowdEntity
3
+ property :id
4
+ property :name
5
+ property :active, :default => true
6
+ property :description
7
+ property :directory_id
8
+
9
+ property :members
10
+ end
11
+ end