riaction 0.2.1 → 0.3.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.md CHANGED
@@ -1,5 +1,19 @@
1
1
  # CHANGELOG #
2
2
 
3
+ ## 0.3.0 ##
4
+
5
+ * re-organized module and got rid of a memory leak that showed up in Rails apps running with cache\_classes set to false
6
+
7
+ ## 0.2.1 ##
8
+
9
+ * Fixed problematic load order of the IActionable objects
10
+
11
+
12
+ ## 0.2.0 ##
13
+
14
+ * Generator added to create YAML file for IActionable credentials
15
+
16
+
3
17
  ## 0.1.1 ##
4
18
 
5
19
  * Rake task `riaction:rails:list:achievements` produces formatted output of all achievements defined on IActionable
@@ -0,0 +1,11 @@
1
+ module Riaction
2
+ class Constants
3
+ def self.crud_actions
4
+ Set.new [:create, :update, :destroy]
5
+ end
6
+
7
+ def self.retry_attempts_for_internal_error
8
+ 3
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,28 @@
1
+ require "resque"
2
+ require 'riaction/event_performer'
3
+
4
+ module Riaction
5
+ class CrudEventCallback
6
+ def initialize(event_name)
7
+ @event_name = event_name
8
+ end
9
+
10
+ def after_create(record)
11
+ if record.riaction_log_event?(@event_name)
12
+ Resque.enqueue(::Riaction::EventPerformer, @event_name, record.class.base_class.to_s, record.id)
13
+ end
14
+ end
15
+
16
+ def after_update(record)
17
+ if record.riaction_log_event?(@event_name)
18
+ Resque.enqueue(::Riaction::EventPerformer, @event_name, record.class.base_class.to_s, record.id)
19
+ end
20
+ end
21
+
22
+ def after_destroy(record)
23
+ if record.riaction_log_event?(@event_name)
24
+ Resque.enqueue(::Riaction::EventPerformer, @event_name, record.class.base_class.to_s, record.id)
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,43 @@
1
+ require 'riaction/iactionable/api'
2
+ require 'riaction/constants'
3
+ require "resque"
4
+
5
+ module Riaction
6
+ class EventPerformer
7
+ @queue = :riaction_event_logger
8
+
9
+ def self.perform(event_name, klass_name, id, attempt=0)
10
+ iactionable_api = IActionable::Api.new
11
+
12
+ event_object = klass_name.constantize.find_by_id!(id)
13
+ event_details = event_object.riaction_event(event_name)
14
+ profile_keys = event_details[:profile].riaction_profile_keys
15
+
16
+ # assert the profile exists, and if not, create it
17
+ unless begin
18
+ !!iactionable_api.get_profile_summary(profile_keys[:profile_type], profile_keys[:id_type], profile_keys[:id])
19
+ rescue IActionable::Error::BadRequest => e
20
+ false
21
+ end
22
+ iactionable_api.create_profile(profile_keys[:profile_type], profile_keys[:id_type], profile_keys[:id])
23
+ end
24
+
25
+ # Log the event
26
+ iactionable_api.log_event(profile_keys[:profile_type], profile_keys[:id_type], profile_keys[:id], event_details[:key], event_details[:params])
27
+ rescue ActiveRecord::RecordNotFound => e
28
+ # event_object no longer exists; no means to recover
29
+ rescue IActionable::Error::BadRequest => e
30
+ # Log event should never throw this as of IActionable API v3
31
+ rescue NoMethodError => e
32
+ raise NoEventDefined.new
33
+ rescue IActionable::Error::Internal => e
34
+ # upon an intenal error from IActionable, retry some set number of times by requeueing the task through Resque
35
+ # after the max number of attempts, re-raise
36
+ if attempt < ::Riaction::Constants.retry_attempts_for_internal_error
37
+ Resque.enqueue(self, event_name, klass_name, id, attempt+1)
38
+ else
39
+ raise e
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,10 @@
1
+ require "resque"
2
+ require 'riaction/profile_creator'
3
+
4
+ module Riaction
5
+ class ProfileCreationCallback
6
+ def after_create(record)
7
+ Resque.enqueue(::Riaction::ProfileCreator, record.class.base_class.to_s, record.id)
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,33 @@
1
+ require 'riaction/iactionable/api'
2
+ require 'riaction/constants'
3
+ require "resque"
4
+
5
+ module Riaction
6
+ class ProfileCreator
7
+ @queue = :riaction_profile_creator
8
+
9
+ def self.perform(klass_name, id, attempt=0)
10
+ if klass_name.constantize.riaction_profile?
11
+ iactionable_api = IActionable::Api.new
12
+ profile_object = klass_name.constantize.find_by_id!(id)
13
+ profile_keys = profile_object.riaction_profile_keys
14
+ iactionable_api.create_profile(profile_keys[:profile_type], profile_keys[:id_type], profile_keys[:id])
15
+ else
16
+ raise NoProfileDefined.new
17
+ end
18
+ rescue ActiveRecord::RecordNotFound => e
19
+ # event_object no longer exists; no means to recover
20
+ rescue IActionable::Error::BadRequest => e
21
+ # This should only be thrown if the profile type names specified in the model don't match what's on IActionable's dashboard
22
+ raise e
23
+ rescue IActionable::Error::Internal => e
24
+ # upon an intenal error from IActionable, retry some set number of times by requeueing the task through Resque
25
+ # after the max number of attempts, re-raise
26
+ if attempt < ::Riaction::Constants.retry_attempts_for_internal_error
27
+ Resque.enqueue(self, klass_name, id, attempt+1)
28
+ else
29
+ raise e
30
+ end
31
+ end
32
+ end
33
+ end
@@ -1,388 +1,296 @@
1
- require 'riaction/iactionable/api.rb'
2
-
1
+ require 'riaction/iactionable/api'
3
2
  require "active_support"
4
3
  require "active_record"
5
- require "resque"
4
+ require 'riaction/event_performer'
5
+ require 'riaction/profile_creator'
6
+ require 'riaction/profile_creation_callback'
7
+ require 'riaction/crud_event_callback'
6
8
 
7
9
  module Riaction
8
- PROFILE_CLASSES = []
9
- EVENT_LOGGING_CLASSES = []
10
10
 
11
11
  class NoEventDefined < StandardError; end
12
12
  class NoProfileDefined < StandardError; end
13
-
14
- def self.included(base)
15
- base.extend(ClassMethods)
16
- end
17
-
18
- def self.crud_actions
19
- Set.new [:create, :update, :destroy]
20
- end
21
-
22
- def self.retry_attempts_for_internal_error
23
- 3
24
- end
25
-
26
- class ProfileCreator
27
- @queue = :riaction_profile_creator
28
-
29
- def self.perform(klass_name, id, attempt=0)
30
- if klass_name.constantize.riaction_profile?
31
- iactionable_api = IActionable::Api.new
32
- profile_object = klass_name.constantize.find_by_id!(id)
33
- profile_keys = profile_object.riaction_profile_keys
34
- iactionable_api.create_profile(profile_keys[:profile_type], profile_keys[:id_type], profile_keys[:id])
35
- else
36
- raise NoProfileDefined.new
37
- end
38
- rescue ActiveRecord::RecordNotFound => e
39
- # event_object no longer exists; no means to recover
40
- rescue IActionable::Error::BadRequest => e
41
- # This should only be thrown if the profile type names specified in the model don't match what's on IActionable's dashboard
42
- raise e
43
- rescue IActionable::Error::Internal => e
44
- # upon an intenal error from IActionable, retry some set number of times by requeueing the task through Resque
45
- # after the max number of attempts, re-raise
46
- if attempt < Riaction.retry_attempts_for_internal_error
47
- Resque.enqueue(Riaction::ProfileCreator, klass_name, id, attempt+1)
48
- else
49
- raise e
50
- end
51
- end
52
- end
53
-
54
- class EventPerformer
55
- @queue = :riaction_event_logger
56
-
57
- def self.perform(event_name, klass_name, id, attempt=0)
58
- iactionable_api = IActionable::Api.new
59
-
60
- event_object = klass_name.constantize.find_by_id!(id)
61
- event_details = event_object.riaction_event(event_name)
62
- profile_keys = event_details[:profile].riaction_profile_keys
63
-
64
- # assert the profile exists, and if not, create it
65
- unless begin
66
- !!iactionable_api.get_profile_summary(profile_keys[:profile_type], profile_keys[:id_type], profile_keys[:id])
67
- rescue IActionable::Error::BadRequest => e
68
- false
69
- end
70
- iactionable_api.create_profile(profile_keys[:profile_type], profile_keys[:id_type], profile_keys[:id])
71
- end
72
-
73
- # Log the event
74
- iactionable_api.log_event(profile_keys[:profile_type], profile_keys[:id_type], profile_keys[:id], event_details[:key], event_details[:params])
75
- rescue ActiveRecord::RecordNotFound => e
76
- # event_object no longer exists; no means to recover
77
- rescue IActionable::Error::BadRequest => e
78
- # Log event should never throw this as of IActionable API v3
79
- rescue NoMethodError => e
80
- raise NoEventDefined.new
81
- rescue IActionable::Error::Internal => e
82
- # upon an intenal error from IActionable, retry some set number of times by requeueing the task through Resque
83
- # after the max number of attempts, re-raise
84
- if attempt < Riaction.retry_attempts_for_internal_error
85
- Resque.enqueue(Riaction::EventPerformer, event_name, klass_name, id, attempt+1)
86
- else
87
- raise e
88
- end
89
- end
90
- end
91
-
92
- class CrudEventCallback
93
- def initialize(event_name)
94
- @event_name = event_name
95
- end
96
-
97
- def after_create(record)
98
- if record.riaction_log_event?(@event_name)
99
- Resque.enqueue(Riaction::EventPerformer, @event_name, record.class.base_class.to_s, record.id)
100
- end
101
- end
102
-
103
- def after_update(record)
104
- if record.riaction_log_event?(@event_name)
105
- Resque.enqueue(Riaction::EventPerformer, @event_name, record.class.base_class.to_s, record.id)
106
- end
107
- end
13
+
14
+ module Riaction
15
+ PROFILE_CLASSES = []
16
+ EVENT_LOGGING_CLASSES = []
108
17
 
109
- def after_destroy(record)
110
- if record.riaction_log_event?(@event_name)
111
- Resque.enqueue(Riaction::EventPerformer, @event_name, record.class.base_class.to_s, record.id)
112
- end
113
- end
114
- end
115
-
116
- class ProfileCreationCallback
117
- def after_create(record)
118
- Resque.enqueue(Riaction::ProfileCreator, record.class.base_class.to_s, record.id)
119
- end
120
- end
121
-
122
- module ClassMethods
123
18
  def riaction(object_type, opts)
124
19
  if object_type == :profile
125
- (PROFILE_CLASSES << self).uniq!
126
- define_profile(opts.delete(:type), opts)
127
- include Riaction::ProfileInstanceMethods unless instance_methods.include? :riaction_profile
128
- send "after_create".to_sym, Riaction::ProfileCreationCallback.new
20
+ unless riaction_profile?
21
+ (PROFILE_CLASSES << self.to_s).uniq!
22
+ define_profile(opts.delete(:type), opts)
23
+ include Riaction::ProfileInstanceMethods
24
+ send :after_create, ::Riaction::ProfileCreationCallback.new
25
+ end
129
26
  elsif object_type == :event
130
- (EVENT_LOGGING_CLASSES << self).uniq!
131
- define_event(opts[:name], opts[:trigger], opts[:profile], opts[:params], opts[:if])
132
- include Riaction::EventInstanceMethods unless instance_methods.include? :riaction_event
27
+ unless riaction_defines_events?
28
+ make_events_definable
29
+ end
30
+ unless riaction_defines_event?(opts[:name])
31
+ (EVENT_LOGGING_CLASSES << self.to_s).uniq!
32
+ define_event(opts[:name], opts[:trigger], opts[:profile], opts[:params], opts[:if])
33
+ include Riaction::EventInstanceMethods
34
+ end
133
35
  end
134
36
  end
135
37
 
136
- def define_event(name, trigger, profile, params = {}, guard = nil)
38
+ def make_events_definable
137
39
  class << self
138
40
  def riaction_events
139
- class_variable_defined?(:@@riaction_events) ? class_variable_get(:@@riaction_events) : class_variable_set(:@@riaction_events, {})
41
+ @riaction_events ||= {}
140
42
  end
141
- end
142
43
 
143
- events = riaction_events
44
+ def riaction_defines_events?
45
+ true
46
+ end
47
+ end
48
+ end
49
+
50
+ def define_event(name, trigger, profile, params = {}, guard = nil)
144
51
  trigger = name unless trigger
145
-
52
+
146
53
  # store the event
147
- events[name] = {:trigger => trigger, :profile => profile, :params => params, :guard => guard}
148
- class_variable_set(:@@riaction_events, events)
149
-
54
+ riaction_events.store(name, {:trigger => trigger, :profile => profile, :params => params, :guard => guard})
55
+
150
56
  # Create the callback or the means to trigger it
151
- if Riaction.crud_actions.include? trigger
152
- send "after_#{trigger}".to_sym, Riaction::CrudEventCallback.new(name)
153
-
57
+ if ::Riaction::Constants.crud_actions.include? trigger
58
+ send "after_#{trigger}".to_sym, ::Riaction::CrudEventCallback.new(name)
59
+
154
60
  define_method("trigger_#{name}!") do
155
61
  if self.riaction_log_event?(name)
156
- Resque.enqueue(Riaction::EventPerformer, name, self.class.base_class.to_s, self.id)
62
+ Resque.enqueue(::Riaction::EventPerformer, name, self.class.base_class.to_s, self.id)
157
63
  end
158
64
  end
159
65
  else
160
66
  define_method("trigger_#{trigger}!") do
161
67
  if self.riaction_log_event?(name)
162
- Resque.enqueue(Riaction::EventPerformer, name, self.class.base_class.to_s, self.id)
68
+ Resque.enqueue(::Riaction::EventPerformer, name, self.class.base_class.to_s, self.id)
163
69
  end
164
70
  end
165
71
  end
166
72
  end
167
-
73
+
168
74
  def define_profile(type, fields)
169
75
  class << self
170
76
  def riaction_profiles
171
- class_variable_defined?(:@@riaction_profiles) ? class_variable_get(:@@riaction_profiles) : class_variable_set(:@@riaction_profiles, {})
77
+ @riaction_profiles ||= {}
172
78
  end
173
- end
174
79
 
175
- profiles = riaction_profiles
176
-
177
- # store the profile
178
- profiles[type] = fields
179
- class_variable_set(:@@riaction_profiles, profiles)
180
-
181
- class << self
182
80
  def riaction_profile?
183
81
  true
184
82
  end
185
83
  end
186
- end
187
84
 
85
+ # store the profile
86
+ riaction_profiles.store(type, fields)
87
+ end
88
+
188
89
  def riaction_profile?
189
90
  false
190
91
  end
191
- end
92
+
93
+ def riaction_defines_events?
94
+ false
95
+ end
96
+
97
+ def riaction_defines_event?(event_name)
98
+ if riaction_defines_events?
99
+ riaction_events[event_name].present?
100
+ else
101
+ false
102
+ end
103
+ end
104
+ # end
192
105
 
193
- module EventInstanceMethods
194
- def riaction_event(event_name)
195
- events = self.class.class_variable_defined?(:@@riaction_events) ? self.class.class_variable_get(:@@riaction_events) : {}
196
- event = events.fetch(event_name.to_sym)
106
+ module EventInstanceMethods
107
+ def riaction_event(event_name)
108
+ event = self.class.riaction_events.fetch(event_name.to_sym)
109
+ profile = riaction_event_profile(event[:profile])
110
+
111
+ unless profile.class.respond_to?(:riaction_profile?) && profile.class.riaction_profile?
112
+ raise TypeError.new("Object defined for #{self.class} on event #{event_name} as a profile must itself declare riaction(:profile ...)")
113
+ end
114
+
115
+ params = riaction_event_params(event[:params])
116
+
117
+ raise TypeError.new("Params defined for #{self.class} on event #{event_name} must be a hash") unless params.kind_of? Hash
197
118
 
198
- profile = riaction_event_profile(event[:profile])
199
- unless profile.class.respond_to?(:riaction_profile?) && profile.class.riaction_profile?
200
- raise TypeError.new("Object defined for #{self.class} on event #{event_name} as a profile must itself declare riaction(:profile ...)")
119
+ {
120
+ :key => event_name.to_sym,
121
+ :profile => profile,
122
+ :params => params
123
+ }
124
+ rescue KeyError => e
125
+ raise NoEventDefined.new("no such event #{event_name} defined on #{self.class}")
201
126
  end
202
- params = riaction_event_params(event[:params])
203
- raise TypeError.new("Params defined for #{self.class} on event #{event_name} must be a hash") unless params.kind_of? Hash
204
-
205
- {
206
- :key => event_name.to_sym,
207
- :profile => profile,
208
- :params => params
209
- }
210
- rescue KeyError => e
211
- raise NoEventDefined.new("no such event #{event_name} defined on #{self.class}")
212
- end
213
127
 
214
- def riaction_log_event?(event_name)
215
- events = self.class.class_variable_defined?(:@@riaction_events) ? self.class.class_variable_get(:@@riaction_events) : {}
216
- event = events.fetch(event_name.to_sym)
217
- guard = event[:guard]
128
+ def riaction_log_event?(event_name)
129
+ event = self.class.riaction_events.fetch(event_name.to_sym)
130
+ guard = event[:guard]
218
131
 
219
- case guard
220
- when NilClass
221
- true
222
- when Symbol
223
- self.send guard
224
- when Proc
225
- guard.call self
226
- else
227
- true
132
+ case guard
133
+ when NilClass
134
+ true
135
+ when Symbol
136
+ self.send guard
137
+ when Proc
138
+ guard.call self
139
+ else
140
+ true
141
+ end
142
+ rescue KeyError => e
143
+ raise NoEventDefined.new("no such event #{event_name} defined on #{self.class}")
228
144
  end
229
- rescue KeyError => e
230
- raise NoEventDefined.new("no such event #{event_name} defined on #{self.class}")
231
- end
232
145
 
233
- private
146
+ private
234
147
 
235
- def riaction_event_profile(profile)
236
- if profile == :self
237
- self
238
- elsif profile.kind_of? Symbol
239
- self.send(profile)
240
- elsif profile.kind_of? Proc
241
- profile.call
242
- else
243
- nil
148
+ def riaction_event_profile(profile)
149
+ if profile == :self
150
+ self
151
+ elsif profile.kind_of? Symbol
152
+ self.send(profile)
153
+ elsif profile.kind_of? Proc
154
+ profile.call
155
+ else
156
+ nil
157
+ end
158
+ rescue Exception => e
159
+ raise
244
160
  end
245
- rescue Exception => e
246
- raise
247
- end
248
161
 
249
- def riaction_event_params(params)
250
- if params.kind_of? Symbol
251
- self.send(params)
252
- elsif params.kind_of? Proc
253
- params.call
254
- elsif params.kind_of? Hash
255
- resolved_params = {}
256
- params.each_pair do |key, value|
257
- resolved_params[key] = self.respond_to?(value) ? self.send(value) : value
162
+ def riaction_event_params(params)
163
+ if params.kind_of? Symbol
164
+ self.send(params)
165
+ elsif params.kind_of? Proc
166
+ params.call
167
+ elsif params.kind_of? Hash
168
+ resolved_params = {}
169
+ params.each_pair do |key, value|
170
+ resolved_params[key] = self.respond_to?(value) ? self.send(value) : value
171
+ end
172
+ resolved_params
173
+ else
174
+ {}
258
175
  end
259
- resolved_params
260
- else
261
- {}
176
+ rescue Exception => e
177
+ raise
262
178
  end
263
- rescue Exception => e
264
- raise
265
179
  end
266
- end
267
180
 
268
- module ProfileInstanceMethods
269
- def riaction_profile_keys(profile_type=nil, id_type=nil)
270
- profiles = self.class.class_variable_defined?(:@@riaction_profiles) ? self.class.class_variable_get(:@@riaction_profiles) : {}
271
-
272
- if profiles.size > 0
273
- if profile_type && profiles.has_key?(profile_type)
274
- ids = profiles.fetch(profile_type)
275
- else
276
- profile_type = profiles.first[0]
277
- ids = profiles.first[1]
278
- end
181
+ module ProfileInstanceMethods
182
+ def riaction_profile_keys(profile_type=nil, id_type=nil)
183
+ if self.class.riaction_profiles.size > 0
184
+ if profile_type && self.class.riaction_profiles.has_key?(profile_type)
185
+ ids = self.class.riaction_profiles.fetch(profile_type)
186
+ else
187
+ profile_type = self.class.riaction_profiles.first[0]
188
+ ids = self.class.riaction_profiles.first[1]
189
+ end
279
190
 
280
- if id_type && ids.has_key?(id_type)
281
- {:profile_type => profile_type.to_s, :id_type => id_type.to_s, :id => self.send(ids.fetch(id_type)).to_s}
191
+ if id_type && ids.has_key?(id_type)
192
+ {:profile_type => profile_type.to_s, :id_type => id_type.to_s, :id => self.send(ids.fetch(id_type)).to_s}
193
+ else
194
+ {:profile_type => profile_type.to_s, :id_type => ids.first[0].to_s, :id => self.send(ids.first[1]).to_s}
195
+ end
282
196
  else
283
- {:profile_type => profile_type.to_s, :id_type => ids.first[0].to_s, :id => self.send(ids.first[1]).to_s}
197
+ {}
284
198
  end
285
- else
199
+ rescue KeyError, NoMethodError => e
286
200
  {}
287
201
  end
288
- rescue KeyError, NoMethodError => e
289
- {}
290
- end
291
202
 
292
- #################
293
- # API wrappers #
294
- #################
203
+ #################
204
+ # API wrappers #
205
+ #################
295
206
 
296
- def riaction_profile_summary(achievement_count=nil)
297
- keys = riaction_profile_keys
298
- unless keys.empty?
299
- @iactionable_api ||= IActionable::Api.new
300
- @iactionable_api.get_profile_summary(keys[:profile_type], keys[:id_type], keys[:id], achievement_count)
301
- else
302
- raise NoProfileDefined.new("Class #{self.class} does not adequately define itself as an IActionable profile")
207
+ def riaction_profile_summary(achievement_count=nil)
208
+ keys = riaction_profile_keys
209
+ unless keys.empty?
210
+ @iactionable_api ||= IActionable::Api.new
211
+ @iactionable_api.get_profile_summary(keys[:profile_type], keys[:id_type], keys[:id], achievement_count)
212
+ else
213
+ raise NoProfileDefined.new("Class #{self.class} does not adequately define itself as an IActionable profile")
214
+ end
215
+ rescue IActionable::Error::BadRequest => e
216
+ nil
303
217
  end
304
- rescue IActionable::Error::BadRequest => e
305
- nil
306
- end
307
218
 
308
- def riaction_create_profile
309
- keys = riaction_profile_keys
310
- unless keys.empty?
311
- existing = riaction_profile_summary
312
- unless existing
313
- @iactionable_api ||= IActionable::Api.new
314
- @iactionable_api.create_profile(keys[:profile_type], keys[:id_type], keys[:id])
219
+ def riaction_create_profile
220
+ keys = riaction_profile_keys
221
+ unless keys.empty?
222
+ existing = riaction_profile_summary
223
+ unless existing
224
+ @iactionable_api ||= IActionable::Api.new
225
+ @iactionable_api.create_profile(keys[:profile_type], keys[:id_type], keys[:id])
226
+ else
227
+ existing
228
+ end
315
229
  else
316
- existing
230
+ raise NoProfileDefined.new("Class #{self.class} does not adequately define itself as an IActionable profile")
317
231
  end
318
- else
319
- raise NoProfileDefined.new("Class #{self.class} does not adequately define itself as an IActionable profile")
320
232
  end
321
- end
322
233
 
323
- def riaction_update_profile(new_id_type)
324
- old_keys = riaction_profile_keys
325
- new_keys = riaction_profile_keys(old_keys[:profile_type], new_id_type)
326
- unless old_keys.empty? || new_keys.empty?
327
- @iactionable_api ||= IActionable::Api.new
328
- @iactionable_api.add_profile_identifier(old_keys[:profile_type], old_keys[:id_type], old_keys[:id], new_keys[:id_type], new_keys[:id])
329
- else
330
- raise NoProfileDefined.new("Class #{self.class} does not adequately define itself as an IActionable profile")
234
+ def riaction_update_profile(new_id_type)
235
+ old_keys = riaction_profile_keys
236
+ new_keys = riaction_profile_keys(old_keys[:profile_type], new_id_type)
237
+ unless old_keys.empty? || new_keys.empty?
238
+ @iactionable_api ||= IActionable::Api.new
239
+ @iactionable_api.add_profile_identifier(old_keys[:profile_type], old_keys[:id_type], old_keys[:id], new_keys[:id_type], new_keys[:id])
240
+ else
241
+ raise NoProfileDefined.new("Class #{self.class} does not adequately define itself as an IActionable profile")
242
+ end
331
243
  end
332
- end
333
244
 
334
- def riaction_profile_achievements(filter_type=nil)
335
- keys = riaction_profile_keys
336
- unless keys.empty?
337
- @iactionable_api ||= IActionable::Api.new
338
- @iactionable_api.get_profile_achievements(keys[:profile_type], keys[:id_type], keys[:id], filter_type)
339
- else
340
- raise NoProfileDefined.new("Class #{self.class} does not adequately define itself as an IActionable profile")
245
+ def riaction_profile_achievements(filter_type=nil)
246
+ keys = riaction_profile_keys
247
+ unless keys.empty?
248
+ @iactionable_api ||= IActionable::Api.new
249
+ @iactionable_api.get_profile_achievements(keys[:profile_type], keys[:id_type], keys[:id], filter_type)
250
+ else
251
+ raise NoProfileDefined.new("Class #{self.class} does not adequately define itself as an IActionable profile")
252
+ end
253
+ rescue IActionable::Error::BadRequest => e
254
+ nil
341
255
  end
342
- rescue IActionable::Error::BadRequest => e
343
- nil
344
- end
345
256
 
346
- def riaction_profile_challenges(filter_type=nil)
347
- keys = riaction_profile_keys
348
- unless keys.empty?
349
- @iactionable_api ||= IActionable::Api.new
350
- @iactionable_api.get_profile_challenges(keys[:profile_type], keys[:id_type], keys[:id], filter_type)
351
- else
352
- raise NoProfileDefined.new("Class #{self.class} does not adequately define itself as an IActionable profile")
257
+ def riaction_profile_challenges(filter_type=nil)
258
+ keys = riaction_profile_keys
259
+ unless keys.empty?
260
+ @iactionable_api ||= IActionable::Api.new
261
+ @iactionable_api.get_profile_challenges(keys[:profile_type], keys[:id_type], keys[:id], filter_type)
262
+ else
263
+ raise NoProfileDefined.new("Class #{self.class} does not adequately define itself as an IActionable profile")
264
+ end
265
+ rescue IActionable::Error::BadRequest => e
266
+ nil
353
267
  end
354
- rescue IActionable::Error::BadRequest => e
355
- nil
356
- end
357
268
 
358
- def riaction_profile_goals(filter_type=nil)
359
- keys = riaction_profile_keys
360
- unless keys.empty?
361
- @iactionable_api ||= IActionable::Api.new
362
- @iactionable_api.get_profile_goals(keys[:profile_type], keys[:id_type], keys[:id], filter_type)
363
- else
364
- raise NoProfileDefined.new("Class #{self.class} does not adequately define itself as an IActionable profile")
269
+ def riaction_profile_goals(filter_type=nil)
270
+ keys = riaction_profile_keys
271
+ unless keys.empty?
272
+ @iactionable_api ||= IActionable::Api.new
273
+ @iactionable_api.get_profile_goals(keys[:profile_type], keys[:id_type], keys[:id], filter_type)
274
+ else
275
+ raise NoProfileDefined.new("Class #{self.class} does not adequately define itself as an IActionable profile")
276
+ end
277
+ rescue IActionable::Error::BadRequest => e
278
+ nil
365
279
  end
366
- rescue IActionable::Error::BadRequest => e
367
- nil
368
- end
369
280
 
370
- def riaction_profile_notifications
371
- keys = riaction_profile_keys
372
- unless keys.empty?
373
- @iactionable_api ||= IActionable::Api.new
374
- @iactionable_api.get_profile_notifications(keys[:profile_type], keys[:id_type], keys[:id])
375
- else
376
- raise NoProfileDefined.new("Class #{self.class} does not adequately define itself as an IActionable profile")
281
+ def riaction_profile_notifications
282
+ keys = riaction_profile_keys
283
+ unless keys.empty?
284
+ @iactionable_api ||= IActionable::Api.new
285
+ @iactionable_api.get_profile_notifications(keys[:profile_type], keys[:id_type], keys[:id])
286
+ else
287
+ raise NoProfileDefined.new("Class #{self.class} does not adequately define itself as an IActionable profile")
288
+ end
289
+ rescue IActionable::Error::BadRequest => e
290
+ nil
377
291
  end
378
- rescue IActionable::Error::BadRequest => e
379
- nil
380
292
  end
381
293
  end
382
294
  end
383
295
 
384
- begin
385
- ActiveRecord::Base.send(:include, Riaction)
386
- rescue NameError => e
387
- #
388
- end
296
+ ActiveRecord::Base.extend ::Riaction::Riaction
@@ -1,3 +1,3 @@
1
1
  module Riaction
2
- VERSION = "0.2.1"
2
+ VERSION = "0.3.0"
3
3
  end
@@ -7,7 +7,8 @@ namespace 'riaction' do
7
7
  require rbfile
8
8
  end
9
9
 
10
- Riaction::EVENT_LOGGING_CLASSES.each do |klass|
10
+ Riaction::EVENT_LOGGING_CLASSES.each do |class_name|
11
+ klass = class_name.constantize
11
12
  puts "#{klass} defines the following events:"
12
13
  klass.riaction_events.each_pair do |name, deets|
13
14
  puts " :#{name}:"
@@ -75,7 +76,8 @@ namespace 'riaction' do
75
76
  require rbfile
76
77
  end
77
78
 
78
- Riaction::PROFILE_CLASSES.each do |klass|
79
+ Riaction::PROFILE_CLASSES.each do |class_name|
80
+ klass = class_name.constantize
79
81
  begin
80
82
  klass.all.each do |obj|
81
83
  declaration = klass.riaction_profiles.first
@@ -3,7 +3,7 @@ require 'spec_helper.rb'
3
3
  describe Riaction do
4
4
  class RiactionTestBase
5
5
  extend ActiveModel::Callbacks
6
- include Riaction
6
+ extend Riaction::Riaction
7
7
 
8
8
  define_model_callbacks :create, :update, :destroy
9
9
 
@@ -34,6 +34,74 @@ describe Riaction do
34
34
  Resque.stub!(:enqueue)
35
35
  end
36
36
 
37
+ describe "using riaction" do
38
+ describe "to define a profile" do
39
+ before do
40
+ class RiactionClass < RiactionTestBase
41
+ end
42
+ end
43
+
44
+ describe "the first time" do
45
+ it "should set up the profile info" do
46
+ RiactionClass.riaction_profile?.should be_false
47
+ RiactionClass.class_eval do
48
+ riaction :profile, :type => :user, :custom => :id
49
+ end
50
+ RiactionClass.riaction_profile?.should be_true
51
+ hash_including(:custom => :id).should == RiactionClass.riaction_profiles[:user]
52
+ end
53
+ end
54
+
55
+ describe "a second time" do
56
+ before do
57
+ RiactionClass.class_eval do
58
+ riaction :profile, :type => :user, :custom => :id
59
+ end
60
+ end
61
+ it "should not try to invoke any internal config methods" do
62
+ RiactionClass.should_not_receive(:define_profile)
63
+ RiactionClass.should_not_receive(:include)
64
+ RiactionClass.should_not_receive(:after_create)
65
+ RiactionClass.class_eval do
66
+ riaction :profile, :type => :user, :custom => :id
67
+ end
68
+ end
69
+ end
70
+ end
71
+
72
+ describe "to define an event" do
73
+ before do
74
+ class RiactionClass < RiactionTestBase
75
+ end
76
+ end
77
+
78
+ describe "the first time" do
79
+ it "should set up the event info" do
80
+ RiactionClass.riaction_defines_event?(:create_profile).should be_false
81
+ RiactionClass.class_eval do
82
+ riaction :event, :name => :create_profile, :trigger => :create, :profile => :self, :params => {:foo => "bar"}
83
+ end
84
+ RiactionClass.riaction_defines_event?(:create_profile).should be_true
85
+ end
86
+ end
87
+
88
+ describe "a second time" do
89
+ before do
90
+ RiactionClass.class_eval do
91
+ riaction :event, :name => :create_profile, :trigger => :create, :profile => :self, :params => {:foo => "bar"}
92
+ end
93
+ end
94
+ it "should not try to invoke any internal config methods" do
95
+ RiactionClass.should_not_receive(:define_event)
96
+ RiactionClass.should_not_receive(:include)
97
+ RiactionClass.class_eval do
98
+ riaction :event, :name => :create_profile, :trigger => :create, :profile => :self, :params => {:foo => "bar"}
99
+ end
100
+ end
101
+ end
102
+ end
103
+ end
104
+
37
105
  describe "logging events" do
38
106
  class MyClass < RiactionTestBase
39
107
  riaction :profile, :type => :user, :custom => :id
@@ -96,12 +164,12 @@ describe Riaction do
96
164
  end
97
165
 
98
166
  it "should re-schedule the task some defined number of times before re-raising again on the last attempt" do
99
- Resque.should_receive(:enqueue).exactly(Riaction.retry_attempts_for_internal_error).times.with(Riaction::EventPerformer, :create_profile, "MyClass", @instance.id, instance_of(Fixnum))
167
+ Resque.should_receive(:enqueue).exactly(Riaction::Constants.retry_attempts_for_internal_error).times.with(Riaction::EventPerformer, :create_profile, "MyClass", @instance.id, instance_of(Fixnum))
100
168
 
101
- (Riaction.retry_attempts_for_internal_error).times do |i|
169
+ (Riaction::Constants.retry_attempts_for_internal_error).times do |i|
102
170
  lambda { Riaction::EventPerformer.perform(:create_profile, "MyClass", @bad_instance.id, i) }.should_not raise_error
103
171
  end
104
- lambda { Riaction::EventPerformer.perform(:create_profile, "MyClass", @bad_instance.id, Riaction.retry_attempts_for_internal_error) }.should raise_error(IActionable::Error::Internal)
172
+ lambda { Riaction::EventPerformer.perform(:create_profile, "MyClass", @bad_instance.id, Riaction::Constants.retry_attempts_for_internal_error) }.should raise_error(IActionable::Error::Internal)
105
173
  end
106
174
  end
107
175
  end
@@ -147,12 +215,12 @@ describe Riaction do
147
215
  end
148
216
 
149
217
  it "should re-schedule the task some defined number of times before re-raising again on the last attempt" do
150
- Resque.should_receive(:enqueue).exactly(Riaction.retry_attempts_for_internal_error).times.with(Riaction::ProfileCreator, "MyClass", @instance.id, instance_of(Fixnum))
218
+ Resque.should_receive(:enqueue).exactly(Riaction::Constants.retry_attempts_for_internal_error).times.with(Riaction::ProfileCreator, "MyClass", @instance.id, instance_of(Fixnum))
151
219
 
152
- (Riaction.retry_attempts_for_internal_error).times do |i|
220
+ (Riaction::Constants.retry_attempts_for_internal_error).times do |i|
153
221
  lambda { Riaction::ProfileCreator.perform("MyClass", @instance.id, i) }.should_not raise_error
154
222
  end
155
- lambda { Riaction::ProfileCreator.perform("MyClass", @instance.id, Riaction.retry_attempts_for_internal_error) }.should raise_error(IActionable::Error::Internal)
223
+ lambda { Riaction::ProfileCreator.perform("MyClass", @instance.id, Riaction::Constants.retry_attempts_for_internal_error) }.should raise_error(IActionable::Error::Internal)
156
224
  end
157
225
  end
158
226
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: riaction
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.3.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-11-28 00:00:00.000000000Z
12
+ date: 2011-12-02 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
16
- requirement: &2161282420 !ruby/object:Gem::Requirement
16
+ requirement: &2153241880 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '2.6'
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *2161282420
24
+ version_requirements: *2153241880
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rake
27
- requirement: &2161282000 !ruby/object:Gem::Requirement
27
+ requirement: &2153241460 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *2161282000
35
+ version_requirements: *2153241460
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: faraday
38
- requirement: &2161281500 !ruby/object:Gem::Requirement
38
+ requirement: &2153240920 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *2161281500
46
+ version_requirements: *2153240920
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: faraday-stack
49
- requirement: &2161281060 !ruby/object:Gem::Requirement
49
+ requirement: &2153235960 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: '0'
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *2161281060
57
+ version_requirements: *2153235960
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: activerecord
60
- requirement: &2161280420 !ruby/object:Gem::Requirement
60
+ requirement: &2153235400 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: 3.0.0
66
66
  type: :runtime
67
67
  prerelease: false
68
- version_requirements: *2161280420
68
+ version_requirements: *2153235400
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: activesupport
71
- requirement: &2161279800 !ruby/object:Gem::Requirement
71
+ requirement: &2153234880 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ! '>='
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: 3.0.0
77
77
  type: :runtime
78
78
  prerelease: false
79
- version_requirements: *2161279800
79
+ version_requirements: *2153234880
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: resque
82
- requirement: &2161279200 !ruby/object:Gem::Requirement
82
+ requirement: &2153234500 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ! '>='
@@ -87,7 +87,7 @@ dependencies:
87
87
  version: '0'
88
88
  type: :runtime
89
89
  prerelease: false
90
- version_requirements: *2161279200
90
+ version_requirements: *2153234500
91
91
  description: Wrapper for IActionable's restful API and an "acts-as" style interface
92
92
  for models to behave as profiles and drive game events.
93
93
  email:
@@ -105,6 +105,9 @@ files:
105
105
  - lib/generators/riaction/riaction_generator.rb
106
106
  - lib/generators/riaction/templates/i_actionable.yml
107
107
  - lib/riaction.rb
108
+ - lib/riaction/constants.rb
109
+ - lib/riaction/crud_event_callback.rb
110
+ - lib/riaction/event_performer.rb
108
111
  - lib/riaction/iactionable/api.rb
109
112
  - lib/riaction/iactionable/connection.rb
110
113
  - lib/riaction/iactionable/error.rb
@@ -125,6 +128,8 @@ files:
125
128
  - lib/riaction/iactionable/objects/profile_summary.rb
126
129
  - lib/riaction/iactionable/objects/progress.rb
127
130
  - lib/riaction/iactionable/settings.rb
131
+ - lib/riaction/profile_creation_callback.rb
132
+ - lib/riaction/profile_creator.rb
128
133
  - lib/riaction/railtie.rb
129
134
  - lib/riaction/riaction.rb
130
135
  - lib/riaction/version.rb