riaction 1.3.5 → 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,5 +1,10 @@
1
1
  # CHANGELOG #
2
2
 
3
+ ## 1.4.0 ##
4
+
5
+ * Since IActionable creates non-existent profiles named in an event logging, the event logger no longer tries to confirm profile existence as a pre-condition.
6
+ * Adding support to provide custom behavior when the API returns a 500 on creating a profile or logging an event.
7
+
3
8
  ## 1.3.4 ##
4
9
 
5
10
  * background logging of events will first check if the profile exists, and re-enqueue the job if it doesn't, up to a max number of retries, at which point it will log the event regardless.
data/README.md CHANGED
@@ -16,7 +16,9 @@ Riaction uses [Resque](https://github.com/defunkt/resque) to schedule and perfor
16
16
 
17
17
  Riaction comes with a generator for creating a YAML file to contain your credentials for each environment of your application. The YAML file is necessary for riaction to run correctly in your rails app.
18
18
 
19
- rails g riaction development:12345:abcde production:54321:edcba
19
+ rails g riaction:install development:12345:abcde production:54321:edcba
20
+
21
+ This generator will also create an initializer in config/initializers/riaction.rb, where you can provide custom error handling if you wish (see below in *Custom API Error Handling*).
20
22
 
21
23
  ### Declaring A Model As A Profile ###
22
24
 
@@ -177,6 +179,23 @@ If you want to avoid the automatic creation of a profile, or the automatic loggi
177
179
  Review.riactionless{ @user_instance.reviews.create(:text => "loved it!") } # won't fire the 'write_a_review' event
178
180
  Review.riactionless{ @review_instance.trigger_thumbs_up! } # won't fire the 'receive_thumbs_up' event
179
181
 
182
+ #### Custom API Error Handling ####
183
+
184
+ When the API returns a status code 500 on internal error the [Ruby-IActionable gem](https://github.com/zortnac/Ruby-IActionable) will raise an exception of class IActionable::Error::Internal. The default behavior in riaction is to re-raise the error. You can create custom behavior to log the error through a third party service (like Airbrake), have riaction re-schedule the task to try again, save the information to have it be re-attempted later through your own means, or any combination of the above:
185
+
186
+ ::Riaction::EventPerformer.handle_api_failure_with do |exception, event_name, class_name, id|
187
+ # log the error through a third party service and then re-attempt
188
+ Airbrake.notify(exception)
189
+ true
190
+ end
191
+
192
+ ::Riaction::ProfileCreator.handle_api_failure_with do |exception, class_name, id|
193
+ # log the error through a third party service, punish the user for their failure, and do not re-attempt
194
+ Airbrake.notify(exception)
195
+ class_name.constantize.find_by_id(id).flog(:lashes => 100)
196
+ false
197
+ end
198
+
180
199
  ### Rails Rake Tasks ###
181
200
 
182
201
  There are 3 rake tasks included for summarizing all of your models' declarations as well as a way to initialize profiles on IActionable. To see a report of all the events declared across your application, run the following:
@@ -2,7 +2,7 @@ Description:
2
2
  Generate a Yaml file in your config directory to contain your IActionable credentials.
3
3
 
4
4
  Example:
5
- rails generate riaction ENVIRONMENT:APP_KEY:API_KEY ENVIRONMENT:APP_KEY:API_KEY
5
+ rails generate riaction:install ENVIRONMENT:APP_KEY:API_KEY ENVIRONMENT:APP_KEY:API_KEY
6
6
 
7
7
  This will create:
8
8
  config/i_actionable.yml
@@ -0,0 +1,23 @@
1
+ require 'generators/riaction_generator'
2
+
3
+ module Riaction
4
+ module Generators
5
+ class InstallGenerator < Base
6
+ argument :credentials, :type => :array, :required => true, :banner => "environment:app_key:api_key environment:app_key:api_key"
7
+
8
+ def create_credentials_file
9
+ credentials.map!{|credential| { :env => credential[credential_regexp,1],
10
+ :app_key => credential[credential_regexp,2],
11
+ :api_key => credential[credential_regexp,3] } }
12
+ template "i_actionable.yml", "config/i_actionable.yml"
13
+ template "riaction.rb", "config/initializers/riaction.rb"
14
+ end
15
+
16
+ private
17
+
18
+ def credential_regexp
19
+ /^(\w+):(\w+):(\w+)$/
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,21 @@
1
+ # When the IActionable API returns a 500 for logging an event or creating a profile, a custom handler can be defined below,
2
+ # useful for making calls to external exception notifier services (airbrake, etc), or handling the failure in some specific way
3
+ # useful to the application.
4
+ #
5
+ # ::Riaction::EventPerformer.handle_api_failure_with do |exception, event_name, class_name, id|
6
+ # # re-raise the exception
7
+ # raise exception
8
+ # # return true to have the event rescheduled
9
+ # true
10
+ # # return false to not have the event rescheduled
11
+ # false
12
+ # end
13
+ #
14
+ # ::Riaction::ProfileCreator.handle_api_failure_with do |exception, class_name, id|
15
+ # # re-raise the exception
16
+ # raise exception
17
+ # # return true to have the event rescheduled
18
+ # true
19
+ # # return false to not have the event rescheduled
20
+ # false
21
+ # end
@@ -0,0 +1,11 @@
1
+ require 'rails/generators/named_base'
2
+
3
+ module Riaction
4
+ module Generators
5
+ class Base < Rails::Generators::Base
6
+ def self.source_root
7
+ @_riaction_source_root ||= File.expand_path(File.join(File.dirname(__FILE__), 'riaction', generator_name, 'templates'))
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,21 @@
1
+ module Riaction
2
+ module ApiFailure
3
+ def handle_api_failure(exception)
4
+ if @api_failure_handler_block
5
+ @api_failure_handler_block.call(exception)
6
+ else
7
+ default_behavior(exception)
8
+ end
9
+ end
10
+
11
+ def handle_api_failure_with(&block)
12
+ if block_given?
13
+ @api_failure_handler_block = block
14
+ end
15
+ end
16
+
17
+ def default_behavior(exception)
18
+ raise exception
19
+ end
20
+ end
21
+ end
@@ -3,56 +3,56 @@ require "resque"
3
3
 
4
4
  module Riaction
5
5
  class EventPerformer
6
+ extend ::Riaction::ApiFailure
7
+
6
8
  @queue = :riaction_event_logger
7
9
 
8
10
  # Sends an event to IActionable based on the name of a riaction class and the ID used to locate the instance
9
11
  def self.perform(event_name, klass_name, id, attempt=0)
10
- event_name_sym = event_name.to_sym
11
- iactionable_api = IActionable::Api.new
12
- event_object = klass_name.constantize.find_by_id!(id)
13
- event_params = event_object.riaction_event_params
14
-
15
- if ( klass_name.constantize.riactionary? &&
16
- klass_name.constantize.riaction_events? &&
17
- klass_name.constantize.riaction_defines_event?(event_name_sym) )
18
- if event_params.has_key?(event_name_sym)
19
- begin
20
- iactionable_api.get_profile_summary(event_params[event_name_sym][:profile][:type],
21
- event_params[event_name_sym][:profile][:id_type],
22
- event_params[event_name_sym][:profile][:id])
23
- iactionable_api.log_event( event_params[event_name_sym][:profile][:type],
24
- event_params[event_name_sym][:profile][:id_type],
25
- event_params[event_name_sym][:profile][:id],
26
- event_name_sym,
27
- event_params[event_name_sym][:params])
28
- rescue IActionable::Error::BadRequest => e
29
- if attempt < ::Riaction::Constants.retry_attempts_for_missing_profile
30
- Resque.enqueue(self, event_name, klass_name, id, attempt+1)
31
- else
32
- iactionable_api.log_event( event_params[event_name_sym][:profile][:type],
33
- event_params[event_name_sym][:profile][:id_type],
34
- event_params[event_name_sym][:profile][:id],
35
- event_name_sym,
36
- event_params[event_name_sym][:params])
37
- end
38
- end
12
+ check_class_requirements!(event_name, klass_name)
13
+ begin
14
+ log_event(event_name, klass_name, id)
15
+ rescue IActionable::Error::BadRequest => e
16
+ # Log event should never throw this as of IActionable API v3
17
+ rescue Faraday::Error::TimeoutError, Timeout::Error => e
18
+ Resque.enqueue(self, event_name, klass_name, id, attempt+1)
19
+ rescue IActionable::Error::Internal => e
20
+ # handle_api_failure(event_name, klass_name, id, attempt)
21
+ handle_api_failure(e, event_name, klass_name, id)
22
+ end
23
+ end
24
+
25
+ def self.check_class_requirements!(event_name, klass_name)
26
+ unless klass_name.constantize.riactionary? &&
27
+ klass_name.constantize.riaction_events? &&
28
+ klass_name.constantize.riaction_defines_event?(event_name.to_sym)
29
+ raise ::Riaction::ConfigurationError.new("#{klass_name} does not define event #{event_name}")
30
+ end
31
+ end
32
+
33
+ def self.log_event(event_name, klass_name, id)
34
+ iactionable_api = IActionable::Api.new
35
+ if event_object = klass_name.constantize.find_by_id(id)
36
+ event_params = event_object.riaction_event_params
37
+ if event_params.has_key?(event_name.to_sym)
38
+ iactionable_api.log_event( event_params[event_name.to_sym][:profile][:type],
39
+ event_params[event_name.to_sym][:profile][:id_type],
40
+ event_params[event_name.to_sym][:profile][:id],
41
+ event_name.to_sym,
42
+ event_params[event_name.to_sym][:params])
39
43
  else
40
44
  raise ::Riaction::ConfigurationError.new("Instance of #{klass_name} with ID #{id} could not construct event parameters for event #{event_name}. Is the profile a valid one?")
41
45
  end
42
- else
43
- raise ::Riaction::ConfigurationError.new("#{klass_name} does not define event #{event_name}")
44
46
  end
45
- rescue ActiveRecord::RecordNotFound => e
46
- # event_object no longer exists; no means to recover
47
- rescue IActionable::Error::BadRequest => e
48
- # Log event should never throw this as of IActionable API v3
49
- rescue IActionable::Error::Internal, Faraday::Error::TimeoutError, Timeout::Error => e
50
- # upon an intenal error from IActionable, retry some set number of times by requeueing the task through Resque
51
- # after the max number of attempts, re-raise
52
- if attempt < ::Riaction::Constants.retry_attempts_for_internal_error
53
- Resque.enqueue(self, event_name, klass_name, id, attempt+1)
47
+ end
48
+
49
+ def self.handle_api_failure(exception, event_name, klass_name, id)
50
+ if @api_failure_handler_block
51
+ if @api_failure_handler_block.call(exception, event_name, klass_name, id)
52
+ Resque.enqueue(self, event_name, klass_name, id)
53
+ end
54
54
  else
55
- raise e
55
+ default_behavior(exception)
56
56
  end
57
57
  end
58
58
  end
@@ -3,14 +3,33 @@ require "resque"
3
3
 
4
4
  module Riaction
5
5
  class ProfileCreator
6
+ extend ::Riaction::ApiFailure
7
+
6
8
  @queue = :riaction_profile_creator
7
9
 
8
10
  def self.perform(klass_name, id, attempt=0)
9
- if klass_name.constantize.riactionary? &&
10
- klass_name.constantize.riaction_profile? &&
11
- klass_name.constantize.riaction_profile_types_defined > 0
12
- record = klass_name.constantize.find_by_id!(id)
13
- iactionable_api = IActionable::Api.new
11
+ check_class_requirements!(klass_name)
12
+ create_profile(klass_name, id)
13
+ rescue IActionable::Error::BadRequest => e
14
+ # This should only be thrown if the profile type names specified in the model don't match what's on IActionable's dashboard
15
+ raise e
16
+ rescue Faraday::Error::TimeoutError, Timeout::Error => e
17
+ Resque.enqueue(self, klass_name, id, attempt+1)
18
+ rescue IActionable::Error::Internal => e
19
+ handle_api_failure(e, klass_name, id)
20
+ end
21
+
22
+ def self.check_class_requirements!(klass_name)
23
+ unless klass_name.constantize.riactionary? &&
24
+ klass_name.constantize.riaction_profile? &&
25
+ klass_name.constantize.riaction_profile_types_defined > 0
26
+ raise ::Riaction::RuntimeError.new("#{klass_name} does not define any riaction profiles")
27
+ end
28
+ end
29
+
30
+ def self.create_profile(klass_name, id)
31
+ iactionable_api = IActionable::Api.new
32
+ if record = klass_name.constantize.find_by_id(id)
14
33
  record.riaction_profile_keys.each_pair do |profile_type, ids|
15
34
  identifiers = ids.to_a
16
35
  first_defined = identifiers.shift
@@ -19,21 +38,16 @@ module Riaction
19
38
  iactionable_api.add_profile_identifier(profile_type.to_s, first_defined.first.to_s, first_defined.last.to_s, identifier.first.to_s, identifier.last.to_s)
20
39
  end
21
40
  end
22
- else
23
- raise ::Riaction::RuntimeError.new("#{klass_name} does not define any riaction profiles")
24
41
  end
25
- rescue ActiveRecord::RecordNotFound => e
26
- # event_object no longer exists; no means to recover
27
- rescue IActionable::Error::BadRequest => e
28
- # This should only be thrown if the profile type names specified in the model don't match what's on IActionable's dashboard
29
- raise e
30
- rescue IActionable::Error::Internal, Faraday::Error::TimeoutError, Timeout::Error => e
31
- # upon an intenal error from IActionable, retry some set number of times by requeueing the task through Resque
32
- # after the max number of attempts, re-raise
33
- if attempt < ::Riaction::Constants.retry_attempts_for_internal_error
34
- Resque.enqueue(self, klass_name, id, attempt+1)
42
+ end
43
+
44
+ def self.handle_api_failure(exception, klass_name, id)
45
+ if @api_failure_handler_block
46
+ if @api_failure_handler_block.call(exception, klass_name, id)
47
+ Resque.enqueue(self, klass_name, id)
48
+ end
35
49
  else
36
- raise e
50
+ default_behavior(exception)
37
51
  end
38
52
  end
39
53
  end
@@ -6,10 +6,6 @@ module Riaction
6
6
  load "tasks/riaction.rake"
7
7
  end
8
8
 
9
- generators do
10
- require "generators/riaction/riaction_generator"
11
- end
12
-
13
9
  initializer "riaction_railtie.configure_i_actionable_creds" do |app|
14
10
  begin
15
11
  IActionable::Api.init_settings(YAML.load_file("#{::Rails.root}/config/i_actionable.yml")[::Rails.env].symbolize_keys!)
@@ -1,5 +1,6 @@
1
1
  require "active_support"
2
2
  require "active_record"
3
+ require 'riaction/api_failure'
3
4
  require 'riaction/event_performer'
4
5
  require 'riaction/profile_creator'
5
6
  require 'riaction/profile_creation_callback'
@@ -1,3 +1,3 @@
1
1
  module Riaction
2
- VERSION = "1.3.5"
2
+ VERSION = "1.4.0"
3
3
  end
@@ -93,36 +93,6 @@ describe "sending an event to IActionable from the name of a riaction class and
93
93
  end
94
94
  end
95
95
 
96
- describe "when the profile attached to the event does not exist on IActionable" do
97
- before do
98
- Comment.class_eval do
99
- riaction :event, :name => :make_a_comment, :trigger => :create, :profile => :user, :profile_type => :player
100
- end
101
-
102
- @comment = Comment.riactionless{ Comment.create(:user_id => @user.id, :content => 'this is a comment') }
103
-
104
- @api.stub!(:get_profile_summary).and_raise(IActionable::Error::BadRequest.new(nil))
105
- end
106
-
107
- it "should not log the event, but reschedule the job with an incremented attempt count" do
108
- @api.should_not_receive(:log_event)
109
- Resque.should_receive(:enqueue).once.with(Riaction::EventPerformer, :make_a_comment, 'Comment', @comment.id, 1)
110
- ::Riaction::EventPerformer.perform(:make_a_comment, 'Comment', @comment.id)
111
- end
112
-
113
- describe "and the number of attempts has reached the max" do
114
- it "should log the event, and not re-enqueue" do
115
- @api.should_receive(:log_event).once.with(@comment.riaction_event_params[:make_a_comment][:profile][:type],
116
- @comment.riaction_event_params[:make_a_comment][:profile][:id_type],
117
- @comment.riaction_event_params[:make_a_comment][:profile][:id],
118
- :make_a_comment,
119
- {})
120
- Resque.should_not_receive(:enqueue)
121
- ::Riaction::EventPerformer.perform(:make_a_comment, 'Comment', @comment.id, Riaction::Constants.retry_attempts_for_missing_profile)
122
- end
123
- end
124
- end
125
-
126
96
  describe "when fetching the event params raises a" do
127
97
  before do
128
98
  Comment.class_eval do
@@ -135,7 +105,7 @@ describe "sending an event to IActionable from the name of a riaction class and
135
105
  describe "RuntimeError" do
136
106
  before do
137
107
  @comment.stub!(:riaction_event_params).and_raise(::Riaction::RuntimeError)
138
- Comment.stub!(:find_by_id!).and_return(@comment)
108
+ Comment.stub!(:find_by_id).and_return(@comment)
139
109
  end
140
110
 
141
111
  it "should not try to create the event" do
@@ -154,7 +124,7 @@ describe "sending an event to IActionable from the name of a riaction class and
154
124
  describe "ConfigurationError" do
155
125
  before do
156
126
  @comment.stub!(:riaction_event_params).and_raise(::Riaction::ConfigurationError)
157
- Comment.stub!(:find_by_id!).and_return(@comment)
127
+ Comment.stub!(:find_by_id).and_return(@comment)
158
128
  end
159
129
 
160
130
  it "should not try to create the event" do
@@ -266,17 +236,59 @@ describe "sending an event to IActionable from the name of a riaction class and
266
236
 
267
237
  describe "when the call to IActionable, through API wrapper, fails" do
268
238
  before do
269
- @api.stub!(:log_event).and_raise(IActionable::Error::Internal.new(""))
239
+ @exception = IActionable::Error::Internal.new("")
240
+ @api.stub!(:log_event).and_raise(@exception)
270
241
  Comment.class_eval do
271
242
  riaction :event, :name => :make_a_comment, :trigger => :create, :profile => :user, :profile_type => :npc, :params => {:foo => 'bar'}
272
243
  end
273
244
  @comment = Comment.riactionless{ Comment.create(:user_id => @user.id, :content => 'this is a comment') }
274
245
  end
275
246
 
276
- it "should re-enqueue the job with an attempt count" do
277
- Resque.should_receive(:enqueue).once.with(Riaction::EventPerformer, :make_a_comment, 'Comment', @comment.id, 1)
247
+ it "should handle the failure passing the exception, event name, class name, and model id" do
248
+ ::Riaction::EventPerformer.should_receive(:handle_api_failure).once.with(@exception, :make_a_comment, 'Comment', @comment.id)
278
249
  ::Riaction::EventPerformer.perform(:make_a_comment, 'Comment', @comment.id)
279
250
  end
251
+
252
+ describe "and the default behavior of the failure handler is in place" do
253
+ it "should re-raise the exception" do
254
+ lambda{::Riaction::EventPerformer.perform(:make_a_comment, 'Comment', @comment.id)}.should raise_error(@exception)
255
+ end
256
+ end
257
+
258
+ describe "and custom behavior of the failure handler is in place" do
259
+ before do
260
+ ::Riaction::EventPerformer.handle_api_failure_with do |exception, event_name, class_name, id|
261
+ 5.times do
262
+ exception.inspect
263
+ end
264
+ end
265
+ end
266
+
267
+ it "should perform the custom behavior" do
268
+ @exception.should_receive(:inspect).exactly(5).times
269
+ ::Riaction::EventPerformer.perform(:make_a_comment, 'Comment', @comment.id)
270
+ end
271
+
272
+ describe "and that custom behavior evaluates to true" do
273
+ it "should reschedule the event" do
274
+ Resque.should_receive(:enqueue).once.with(Riaction::EventPerformer, :make_a_comment, 'Comment', @comment.id)
275
+ ::Riaction::EventPerformer.perform(:make_a_comment, 'Comment', @comment.id)
276
+ end
277
+ end
278
+
279
+ describe "and that custom behavior evaluates to false" do
280
+ before do
281
+ ::Riaction::EventPerformer.handle_api_failure_with do |exception, event_name, class_name, id|
282
+ false
283
+ end
284
+ end
285
+
286
+ it "should not reschedule the event" do
287
+ Resque.should_not_receive(:enqueue)
288
+ ::Riaction::EventPerformer.perform(:make_a_comment, 'Comment', @comment.id)
289
+ end
290
+ end
291
+ end
280
292
  end
281
293
 
282
294
  describe "when the call to IActionable, through API wrapper, times out" do
@@ -114,16 +114,58 @@ describe "automatic profile creation from riaction definitions:" do
114
114
 
115
115
  describe "when the call to IActionable, through API wrapper, fails" do
116
116
  before do
117
- @api.stub!(:create_profile).and_raise(IActionable::Error::Internal.new(""))
117
+ @exception = IActionable::Error::Internal.new("")
118
+ @api.stub!(:create_profile).and_raise(@exception)
118
119
  User.class_eval do
119
120
  riaction :profile, :type => :player, :custom => :id, :username => :name
120
121
  end
121
122
  @user = User.riactionless{ User.create(:name => 'zortnac') }
122
123
  end
123
124
 
124
- it "should re-enqueue the job with an attempt count" do
125
- Resque.should_receive(:enqueue).once.with(Riaction::ProfileCreator, "User", @user.id, 1)
126
- ::Riaction::ProfileCreator.perform('User', @user.id, 0)
125
+ it "should handle the failure passing the exception, class name, and model id" do
126
+ ::Riaction::ProfileCreator.should_receive(:handle_api_failure).once.with(@exception, 'User', @user.id)
127
+ ::Riaction::ProfileCreator.perform('User', @user.id)
128
+ end
129
+
130
+ describe "and the default behavior of the failure handler is in place" do
131
+ it "should re-raise the exception" do
132
+ lambda{::Riaction::ProfileCreator.perform('User', @user.id)}.should raise_error(@exception)
133
+ end
134
+ end
135
+
136
+ describe "and custom behavior of the failure handler is in place" do
137
+ before do
138
+ ::Riaction::ProfileCreator.handle_api_failure_with do |exception, class_name, id|
139
+ 3.times do
140
+ exception.inspect
141
+ end
142
+ end
143
+ end
144
+
145
+ it "should perform the custom behavior" do
146
+ @exception.should_receive(:inspect).exactly(3).times
147
+ ::Riaction::ProfileCreator.perform('User', @user.id)
148
+ end
149
+
150
+ describe "and that custom behavior evaluates to true" do
151
+ it "should reschedule the event" do
152
+ Resque.should_receive(:enqueue).once.with(Riaction::ProfileCreator, "User", @user.id)
153
+ ::Riaction::ProfileCreator.perform('User', @user.id)
154
+ end
155
+ end
156
+
157
+ describe "and that custom behavior evaluates to false" do
158
+ before do
159
+ ::Riaction::ProfileCreator.handle_api_failure_with do |exception, class_name, id|
160
+ false
161
+ end
162
+ end
163
+
164
+ it "should not reschedule the event" do
165
+ Resque.should_not_receive(:enqueue)
166
+ ::Riaction::ProfileCreator.perform('User', @user.id)
167
+ end
168
+ end
127
169
  end
128
170
  end
129
171
 
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: 1.3.5
4
+ version: 1.4.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -11,11 +11,11 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2012-05-21 00:00:00.000000000Z
14
+ date: 2012-06-27 00:00:00.000000000Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: rspec
18
- requirement: &2155998120 !ruby/object:Gem::Requirement
18
+ requirement: &2164272500 !ruby/object:Gem::Requirement
19
19
  none: false
20
20
  requirements:
21
21
  - - ! '>='
@@ -23,10 +23,10 @@ dependencies:
23
23
  version: '2.8'
24
24
  type: :development
25
25
  prerelease: false
26
- version_requirements: *2155998120
26
+ version_requirements: *2164272500
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: sqlite3
29
- requirement: &2155997120 !ruby/object:Gem::Requirement
29
+ requirement: &2164271940 !ruby/object:Gem::Requirement
30
30
  none: false
31
31
  requirements:
32
32
  - - ! '>='
@@ -34,10 +34,10 @@ dependencies:
34
34
  version: '0'
35
35
  type: :development
36
36
  prerelease: false
37
- version_requirements: *2155997120
37
+ version_requirements: *2164271940
38
38
  - !ruby/object:Gem::Dependency
39
39
  name: ruby-debug19
40
- requirement: &2155996280 !ruby/object:Gem::Requirement
40
+ requirement: &2164271140 !ruby/object:Gem::Requirement
41
41
  none: false
42
42
  requirements:
43
43
  - - ! '>='
@@ -45,10 +45,10 @@ dependencies:
45
45
  version: '0'
46
46
  type: :development
47
47
  prerelease: false
48
- version_requirements: *2155996280
48
+ version_requirements: *2164271140
49
49
  - !ruby/object:Gem::Dependency
50
50
  name: yard
51
- requirement: &2155995260 !ruby/object:Gem::Requirement
51
+ requirement: &2164270380 !ruby/object:Gem::Requirement
52
52
  none: false
53
53
  requirements:
54
54
  - - ! '>='
@@ -56,10 +56,10 @@ dependencies:
56
56
  version: '0'
57
57
  type: :development
58
58
  prerelease: false
59
- version_requirements: *2155995260
59
+ version_requirements: *2164270380
60
60
  - !ruby/object:Gem::Dependency
61
61
  name: redcarpet
62
- requirement: &2155994000 !ruby/object:Gem::Requirement
62
+ requirement: &2164268920 !ruby/object:Gem::Requirement
63
63
  none: false
64
64
  requirements:
65
65
  - - ! '>='
@@ -67,10 +67,10 @@ dependencies:
67
67
  version: '0'
68
68
  type: :development
69
69
  prerelease: false
70
- version_requirements: *2155994000
70
+ version_requirements: *2164268920
71
71
  - !ruby/object:Gem::Dependency
72
72
  name: rake
73
- requirement: &2155993080 !ruby/object:Gem::Requirement
73
+ requirement: &2164268200 !ruby/object:Gem::Requirement
74
74
  none: false
75
75
  requirements:
76
76
  - - ! '>='
@@ -78,10 +78,10 @@ dependencies:
78
78
  version: '0'
79
79
  type: :runtime
80
80
  prerelease: false
81
- version_requirements: *2155993080
81
+ version_requirements: *2164268200
82
82
  - !ruby/object:Gem::Dependency
83
83
  name: activerecord
84
- requirement: &2155992240 !ruby/object:Gem::Requirement
84
+ requirement: &2164267400 !ruby/object:Gem::Requirement
85
85
  none: false
86
86
  requirements:
87
87
  - - ! '>='
@@ -89,10 +89,10 @@ dependencies:
89
89
  version: 3.0.0
90
90
  type: :runtime
91
91
  prerelease: false
92
- version_requirements: *2155992240
92
+ version_requirements: *2164267400
93
93
  - !ruby/object:Gem::Dependency
94
94
  name: activesupport
95
- requirement: &2155991400 !ruby/object:Gem::Requirement
95
+ requirement: &2164266480 !ruby/object:Gem::Requirement
96
96
  none: false
97
97
  requirements:
98
98
  - - ! '>='
@@ -100,10 +100,10 @@ dependencies:
100
100
  version: 3.0.0
101
101
  type: :runtime
102
102
  prerelease: false
103
- version_requirements: *2155991400
103
+ version_requirements: *2164266480
104
104
  - !ruby/object:Gem::Dependency
105
105
  name: resque
106
- requirement: &2155990540 !ruby/object:Gem::Requirement
106
+ requirement: &2164265680 !ruby/object:Gem::Requirement
107
107
  none: false
108
108
  requirements:
109
109
  - - ! '>='
@@ -111,10 +111,10 @@ dependencies:
111
111
  version: '0'
112
112
  type: :runtime
113
113
  prerelease: false
114
- version_requirements: *2155990540
114
+ version_requirements: *2164265680
115
115
  - !ruby/object:Gem::Dependency
116
116
  name: ruby-iactionable
117
- requirement: &2155989360 !ruby/object:Gem::Requirement
117
+ requirement: &2164264420 !ruby/object:Gem::Requirement
118
118
  none: false
119
119
  requirements:
120
120
  - - ! '>='
@@ -122,7 +122,7 @@ dependencies:
122
122
  version: 0.1.2
123
123
  type: :runtime
124
124
  prerelease: false
125
- version_requirements: *2155989360
125
+ version_requirements: *2164264420
126
126
  description: Wrapper for IActionable's restful API and an "acts-as" style interface
127
127
  for models to behave as profiles and drive game events.
128
128
  email:
@@ -175,10 +175,13 @@ files:
175
175
  - doc/js/jquery.js
176
176
  - doc/method_list.html
177
177
  - doc/top-level-namespace.html
178
- - lib/generators/riaction/USAGE
179
- - lib/generators/riaction/riaction_generator.rb
180
- - lib/generators/riaction/templates/i_actionable.yml
178
+ - lib/generators/riaction/install/USAGE
179
+ - lib/generators/riaction/install/install_generator.rb
180
+ - lib/generators/riaction/install/templates/i_actionable.yml
181
+ - lib/generators/riaction/install/templates/riaction.rb
182
+ - lib/generators/riaction_generator.rb
181
183
  - lib/riaction.rb
184
+ - lib/riaction/api_failure.rb
182
185
  - lib/riaction/constants.rb
183
186
  - lib/riaction/crud_event_callback.rb
184
187
  - lib/riaction/event_performer.rb
@@ -189,7 +192,6 @@ files:
189
192
  - lib/riaction/version.rb
190
193
  - lib/rspec/matchers/riaction.rb
191
194
  - lib/tasks/riaction.rake
192
- - riaction-1.3.5.gem
193
195
  - riaction.gemspec
194
196
  - spec/custom_matchers_spec.rb
195
197
  - spec/event_performer_spec.rb
@@ -1,17 +0,0 @@
1
- class RiactionGenerator < Rails::Generators::Base
2
- source_root File.expand_path("../templates", __FILE__)
3
- argument :credentials, :type => :array, :required => true, :banner => "environment:app_key:api_key environment:app_key:api_key"
4
-
5
- def create_credentials_file
6
- credentials.map!{|credential| { :env => credential[credential_regexp,1],
7
- :app_key => credential[credential_regexp,2],
8
- :api_key => credential[credential_regexp,3] } }
9
- template "i_actionable.yml", "config/i_actionable.yml"
10
- end
11
-
12
- private
13
-
14
- def credential_regexp
15
- /^(\w+):(\w+):(\w+)$/
16
- end
17
- end