state_machines-activemodel 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.travis.yml +14 -10
  4. data/Appraisals +4 -15
  5. data/Gemfile +3 -0
  6. data/LICENSE.txt +1 -1
  7. data/README.md +9 -6
  8. data/Rakefile +5 -6
  9. data/gemfiles/active_model_4.1.gemfile +5 -1
  10. data/gemfiles/active_model_4.2.gemfile +11 -0
  11. data/lib/state_machines/integrations/active_model.rb +105 -108
  12. data/lib/state_machines/integrations/active_model/locale.rb +8 -8
  13. data/lib/state_machines/integrations/{version.rb → active_model/version.rb} +1 -1
  14. data/state_machines-activemodel.gemspec +10 -9
  15. data/{spec/support → test/files}/en.yml +1 -1
  16. data/test/integration_test.rb +23 -0
  17. data/test/machine_by_default_test.rb +24 -0
  18. data/test/machine_errors_test.rb +19 -0
  19. data/test/machine_multiple_test.rb +18 -0
  20. data/test/machine_with_callbacks_test.rb +130 -0
  21. data/test/machine_with_dirty_attribute_and_custom_attributes_during_loopback_test.rb +26 -0
  22. data/test/machine_with_dirty_attribute_and_state_events_test.rb +23 -0
  23. data/test/machine_with_dirty_attributes_and_custom_attribute_test.rb +34 -0
  24. data/test/machine_with_dirty_attributes_during_loopback_test.rb +49 -0
  25. data/test/machine_with_dirty_attributes_test.rb +33 -0
  26. data/test/machine_with_dynamic_initial_state_test.rb +14 -0
  27. data/test/machine_with_events_test.rb +13 -0
  28. data/test/machine_with_failed_after_callbacks_test.rb +31 -0
  29. data/test/machine_with_failed_before_callbacks_test.rb +32 -0
  30. data/test/machine_with_initialized_state_test.rb +35 -0
  31. data/test/machine_with_internationalization_test.rb +190 -0
  32. data/test/machine_with_model_state_attribute_test.rb +31 -0
  33. data/test/machine_with_non_model_state_attribute_undefined_test.rb +26 -0
  34. data/test/machine_with_state_driven_validations_test.rb +31 -0
  35. data/test/machine_with_states_test.rb +13 -0
  36. data/test/machine_with_static_initial_state_test.rb +13 -0
  37. data/test/machine_with_validations_and_custom_attribute_test.rb +22 -0
  38. data/test/machine_with_validations_test.rb +46 -0
  39. data/test/test_helper.rb +58 -0
  40. metadata +83 -36
  41. data/gemfiles/active_model_3.2.gemfile +0 -7
  42. data/gemfiles/active_model_3.2.gemfile.lock +0 -50
  43. data/gemfiles/active_model_4.0.gemfile +0 -7
  44. data/gemfiles/active_model_4.0.gemfile.lock +0 -56
  45. data/gemfiles/active_model_4.1.gemfile.lock +0 -57
  46. data/gemfiles/active_model_edge.gemfile +0 -7
  47. data/gemfiles/active_model_edge.gemfile.lock +0 -62
  48. data/spec/active_model_spec.rb +0 -801
  49. data/spec/integration_spec.rb +0 -26
  50. data/spec/spec_helper.rb +0 -8
  51. data/spec/support/helpers.rb +0 -48
  52. data/spec/support/migration_helpers.rb +0 -43
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b5e81550481dde36492aae79d59f69ee5f599927
4
- data.tar.gz: 05248350d267f60ad3cb5ed43c89d00c2cd143d0
3
+ metadata.gz: 0f82de01738a5f173a174e6ccafb88d4b068ddf0
4
+ data.tar.gz: 2a53957a4121e365e978f093bfafca9f50b9dafd
5
5
  SHA512:
6
- metadata.gz: 16f73d32b72ebd5ca59bd45676281c87511f915a16968ecb6648ff3409745c49caa1fe25b46c212a742aca1cc3696ea8b0c7954029d27e7eca0af5b154e76fe8
7
- data.tar.gz: 087afbda3cff8e922bd1e88d3858e73244ef779ada26903b5ed4f12d2f006fcafc48f4119b76c7c1e6413923c8f8cd6f5dbe33e239a19d8fde3c3c4fbc171741
6
+ metadata.gz: f8ba8dc5b7b59fc95208faaa2735476e89e669509037f8dfb1a3a7c799fafd53ca9964822694228d3ed1afccd8af035e7ab53cea989854fbd099ba078afcda5e
7
+ data.tar.gz: fbbb9bb8aa367b9b9a37a55f8b8b2fdafcec6cf914f417fc3135c63ae8f80e2c482df959886cd9ef6a5fc3be559805ca5764d872c11551809edd83586a00b7a3
data/.gitignore CHANGED
@@ -19,3 +19,4 @@ tmp
19
19
  *.a
20
20
  mkmf.log
21
21
  .idea/
22
+ *.lock
@@ -1,16 +1,20 @@
1
1
  language: ruby
2
- before_install:
3
- - gem install bundler
4
- - bundle install
5
- script: bundle exec rake
2
+ sudo: false
3
+ cache: bundler
4
+
6
5
  rvm:
7
- - 1.9.3
8
- - 2.0.0
9
- - 2.1.2
6
+ - 2.1
7
+ - 2.2
10
8
  - jruby-19mode
9
+ - jruby
11
10
  - rbx-2
11
+
12
12
  gemfile:
13
- - gemfiles/active_model_3.2.gemfile
14
- - gemfiles/active_model_4.0.gemfile
15
13
  - gemfiles/active_model_4.1.gemfile
16
- - gemfiles/active_model_edge.gemfile
14
+ - gemfiles/active_model_4.2.gemfile
15
+
16
+ matrix:
17
+ allow_failures:
18
+ - rvm: jruby
19
+ - rvm: jruby-19mode
20
+ - rvm: rbx-2
data/Appraisals CHANGED
@@ -1,19 +1,8 @@
1
1
  # ActiveModel integrations
2
- appraise "active_model_3.2" do
3
- gem "activemodel", "~> 3.2.0"
2
+ appraise 'active_model_4.1' do
3
+ gem 'activemodel', github: 'rails/rails', branch: '4-2-stable'
4
4
  end
5
5
 
6
- appraise "active_model_4.0" do
7
- gem "activemodel", "~> 4.0.0"
6
+ appraise 'active_model_4.2' do
7
+ gem 'activemodel', github: 'rails/rails', branch: '4-2-stable'
8
8
  end
9
-
10
-
11
- appraise 'active_model_4.1' do
12
- gem 'activemodel', '~> 4.1.0'
13
- end
14
-
15
- appraise 'active_model_edge' do
16
- gem 'activemodel', github: 'rails/rails'
17
- end
18
-
19
-
data/Gemfile CHANGED
@@ -3,3 +3,6 @@ source 'https://rubygems.org'
3
3
  # Specify your gem's dependencies in state_machine2_activemodel.gemspec
4
4
  gemspec
5
5
 
6
+ platforms :mri_20, :mri_21 do
7
+ gem 'pry-byebug'
8
+ end
@@ -1,5 +1,5 @@
1
1
  Copyright (c) 2006-2012 Aaron Pfeifer
2
- Copyright (c) 2014 Abdelkader Boudih
2
+ Copyright (c) 2014-2015 Abdelkader Boudih
3
3
 
4
4
  MIT License
5
5
 
data/README.md CHANGED
@@ -1,12 +1,11 @@
1
- [![Build Status](https://travis-ci.org/seuros/state_machines-activemodel.svg?branch=master)](https://travis-ci.org/seuros/state_machines-activemodel)
2
- [![Code Climate](https://codeclimate.com/github/seuros/state_machines-activemodel.png)](https://codeclimate.com/github/seuros/state_machines-activemodel)
1
+ [![Build Status](https://travis-ci.org/state-machines/state_machines-activemodel.svg?branch=master)](https://travis-ci.org/state-machines/state_machines-activemodel)
2
+ [![Code Climate](https://codeclimate.com/github/state-machines/state_machines-activemodel.png)](https://codeclimate.com/github/state-machines/state_machines-activemodel)
3
3
 
4
4
  # StateMachines ActiveModel Integration
5
5
 
6
6
  The ActiveModel integration is useful for both standalone usage and for providing
7
7
  the base implementation for ORMs which implement the ActiveModel API. This
8
- integration adds support for validation errors, dirty attribute tracking, and
9
- observers.
8
+ integration adds support for validation errors and dirty attribute tracking.
10
9
 
11
10
  ## Installation
12
11
 
@@ -29,7 +28,6 @@ Or install it yourself as:
29
28
  class Vehicle
30
29
  include ActiveModel::Dirty
31
30
  include ActiveModel::Validations
32
- include ActiveModel::Observing
33
31
 
34
32
  attr_accessor :state
35
33
  define_attribute_methods [:state]
@@ -80,9 +78,14 @@ end
80
78
 
81
79
  ```
82
80
 
81
+ Dependencies
82
+
83
+ Active Model 4.1+
84
+
85
+
83
86
  ## Contributing
84
87
 
85
- 1. Fork it ( https://github.com/seuros/state_machines-activemodel/fork )
88
+ 1. Fork it ( https://github.com/state-machines/state_machines-activemodel/fork )
86
89
  2. Create your feature branch (`git checkout -b my-new-feature`)
87
90
  3. Commit your changes (`git commit -am 'Add some feature'`)
88
91
  4. Push to the branch (`git push origin my-new-feature`)
data/Rakefile CHANGED
@@ -1,10 +1,9 @@
1
- require 'rubygems'
2
- require 'bundler/setup'
1
+ require 'bundler/gem_tasks'
2
+ require 'rake/testtask'
3
3
 
4
- require 'rspec/core/rake_task'
5
- RSpec::Core::RakeTask.new do |t|
6
- t.pattern = 'spec/**/*_spec.rb'
4
+ Rake::TestTask.new do |t|
5
+ t.test_files = FileList['test/*_test.rb']
7
6
  end
8
7
 
9
8
  desc 'Default: run all tests.'
10
- task :default => :spec
9
+ task default: :test
@@ -2,6 +2,10 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
- gem "activemodel", "~> 4.1.0"
5
+ gem "activemodel", :github => "rails/rails", :branch => "4-2-stable"
6
+
7
+ platforms :mri_20, :mri_21 do
8
+ gem "pry-byebug"
9
+ end
6
10
 
7
11
  gemspec :path => "../"
@@ -0,0 +1,11 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "activemodel", :github => "rails/rails", :branch => "4-2-stable"
6
+
7
+ platforms :mri_20, :mri_21 do
8
+ gem "pry-byebug"
9
+ end
10
+
11
+ gemspec :path => "../"
@@ -1,70 +1,72 @@
1
1
  require 'active_model'
2
- require 'active_support/all'
2
+ require 'active_support/core_ext/hash/keys'
3
+ require 'active_support/core_ext/module/attribute_accessors.rb'
3
4
  require 'state_machines'
4
- require 'state_machines/integrations/version'
5
+ require 'state_machines/integrations/base'
6
+ require 'state_machines/integrations/active_model/version'
5
7
 
6
8
  module StateMachines
7
9
  module Integrations #:nodoc:
8
10
  # Adds support for integrating state machines with ActiveModel classes.
9
- #
11
+ #
10
12
  # == Examples
11
- #
13
+ #
12
14
  # If using ActiveModel directly within your class, then any one of the
13
15
  # following features need to be included in order for the integration to be
14
16
  # detected:
15
17
  # * ActiveModel::Observing
16
18
  # * ActiveModel::Validations
17
- #
19
+ #
18
20
  # Below is an example of a simple state machine defined within an
19
21
  # ActiveModel class:
20
- #
22
+ #
21
23
  # class Vehicle
22
24
  # include ActiveModel::Observing
23
25
  # include ActiveModel::Validations
24
- #
26
+ #
25
27
  # attr_accessor :state
26
28
  # define_attribute_methods [:state]
27
- #
29
+ #
28
30
  # state_machine :initial => :parked do
29
31
  # event :ignite do
30
32
  # transition :parked => :idling
31
33
  # end
32
34
  # end
33
35
  # end
34
- #
36
+ #
35
37
  # The examples in the sections below will use the above class as a
36
38
  # reference.
37
- #
39
+ #
38
40
  # == Actions
39
- #
41
+ #
40
42
  # By default, no action will be invoked when a state is transitioned. This
41
43
  # means that if you want to save changes when transitioning, you must
42
44
  # define the action yourself like so:
43
- #
45
+ #
44
46
  # class Vehicle
45
47
  # include ActiveModel::Validations
46
48
  # attr_accessor :state
47
- #
49
+ #
48
50
  # state_machine :action => :save do
49
51
  # ...
50
52
  # end
51
- #
53
+ #
52
54
  # def save
53
55
  # # Save changes
54
56
  # end
55
57
  # end
56
- #
58
+ #
57
59
  # == Validations
58
- #
60
+ #
59
61
  # As mentioned in StateMachine::Machine#state, you can define behaviors,
60
62
  # like validations, that only execute for certain states. One *important*
61
63
  # caveat here is that, due to a constraint in ActiveModel's validation
62
64
  # framework, custom validators will not work as expected when defined to run
63
65
  # in multiple states. For example:
64
- #
66
+ #
65
67
  # class Vehicle
66
68
  # include ActiveModel::Validations
67
- #
69
+ #
68
70
  # state_machine do
69
71
  # ...
70
72
  # state :first_gear, :second_gear do
@@ -72,14 +74,14 @@ module StateMachines
72
74
  # end
73
75
  # end
74
76
  # end
75
- #
77
+ #
76
78
  # In this case, the <tt>:speed_is_legal</tt> validation will only get run
77
79
  # for the <tt>:second_gear</tt> state. To avoid this, you can define your
78
80
  # custom validation like so:
79
- #
81
+ #
80
82
  # class Vehicle
81
83
  # include ActiveModel::Validations
82
- #
84
+ #
83
85
  # state_machine do
84
86
  # ...
85
87
  # state :first_gear, :second_gear do
@@ -87,103 +89,103 @@ module StateMachines
87
89
  # end
88
90
  # end
89
91
  # end
90
- #
92
+ #
91
93
  # == Validation errors
92
- #
94
+ #
93
95
  # In order to hook in validation support for your model, the
94
96
  # ActiveModel::Validations feature must be included. If this is included
95
97
  # and an event fails to successfully fire because there are no matching
96
98
  # transitions for the object, a validation error is added to the object's
97
99
  # state attribute to help in determining why it failed.
98
- #
100
+ #
99
101
  # For example,
100
- #
102
+ #
101
103
  # vehicle = Vehicle.new
102
104
  # vehicle.ignite # => false
103
105
  # vehicle.errors.full_messages # => ["State cannot transition via \"ignite\""]
104
- #
106
+ #
105
107
  # In addition, if you're using the <tt>ignite!</tt> version of the event,
106
108
  # then the failure reason (such as the current validation errors) will be
107
109
  # included in the exception that gets raised when the event fails. For
108
110
  # example, assuming there's a validation on a field called +name+ on the class:
109
- #
111
+ #
110
112
  # vehicle = Vehicle.new
111
113
  # vehicle.ignite! # => StateMachine::InvalidTransition: Cannot transition state via :ignite from :parked (Reason(s): Name cannot be blank)
112
- #
114
+ #
113
115
  # === Security implications
114
- #
116
+ #
115
117
  # Beware that public event attributes mean that events can be fired
116
118
  # whenever mass-assignment is being used. If you want to prevent malicious
117
119
  # users from tampering with events through URLs / forms, the attribute
118
120
  # should be protected like so:
119
- #
121
+ #
120
122
  # class Vehicle
121
123
  # include ActiveModel::MassAssignmentSecurity
122
124
  # attr_accessor :state
123
- #
125
+ #
124
126
  # attr_protected :state_event
125
127
  # # attr_accessible ... # Alternative technique
126
- #
128
+ #
127
129
  # state_machine do
128
130
  # ...
129
131
  # end
130
132
  # end
131
- #
133
+ #
132
134
  # If you want to only have *some* events be able to fire via mass-assignment,
133
135
  # you can build two state machines (one public and one protected) like so:
134
- #
136
+ #
135
137
  # class Vehicle
136
138
  # include ActiveModel::MassAssignmentSecurity
137
139
  # attr_accessor :state
138
- #
140
+ #
139
141
  # attr_protected :state_event # Prevent access to events in the first machine
140
- #
142
+ #
141
143
  # state_machine do
142
144
  # # Define private events here
143
145
  # end
144
- #
146
+ #
145
147
  # # Public machine targets the same state as the private machine
146
148
  # state_machine :public_state, :attribute => :state do
147
149
  # # Define public events here
148
150
  # end
149
151
  # end
150
- #
152
+ #
151
153
  # == Callbacks
152
- #
154
+ #
153
155
  # All before/after transition callbacks defined for ActiveModel models
154
156
  # behave in the same way that other ActiveSupport callbacks behave. The
155
157
  # object involved in the transition is passed in as an argument.
156
- #
158
+ #
157
159
  # For example,
158
- #
160
+ #
159
161
  # class Vehicle
160
162
  # include ActiveModel::Validations
161
163
  # attr_accessor :state
162
- #
164
+ #
163
165
  # state_machine :initial => :parked do
164
166
  # before_transition any => :idling do |vehicle|
165
167
  # vehicle.put_on_seatbelt
166
168
  # end
167
- #
169
+ #
168
170
  # before_transition do |vehicle, transition|
169
171
  # # log message
170
172
  # end
171
- #
173
+ #
172
174
  # event :ignite do
173
175
  # transition :parked => :idling
174
176
  # end
175
177
  # end
176
- #
178
+ #
177
179
  # def put_on_seatbelt
178
180
  # ...
179
181
  # end
180
182
  # end
181
- #
183
+ #
182
184
  # Note, also, that the transition can be accessed by simply defining
183
185
  # additional arguments in the callback block.
184
- #
186
+ #
185
187
  # == Observers
186
- #
188
+ #
187
189
  # In order to hook in observer support for your application, the
188
190
  # ActiveModel::Observing feature must be included. Because of the way
189
191
  # ActiveModel observers are designed, there is less flexibility around the
@@ -200,49 +202,49 @@ module StateMachines
200
202
  # * before/after/after_failure_to-_transition_state_to_idling
201
203
  # * before/after/after_failure_to-_transition_state
202
204
  # * before/after/after_failure_to-_transition
203
- #
205
+ #
204
206
  # The following class shows an example of some of these hooks:
205
- #
207
+ #
206
208
  # class VehicleObserver < ActiveModel::Observer
207
209
  # # Callback for :ignite event *before* the transition is performed
208
210
  # def before_ignite(vehicle, transition)
209
211
  # # log message
210
212
  # end
211
- #
213
+ #
212
214
  # # Callback for :ignite event *after* the transition has been performed
213
215
  # def after_ignite(vehicle, transition)
214
216
  # # put on seatbelt
215
217
  # end
216
- #
218
+ #
217
219
  # # Generic transition callback *before* the transition is performed
218
220
  # def after_transition(vehicle, transition)
219
221
  # Audit.log(vehicle, transition)
220
222
  # end
221
- #
223
+ #
222
224
  # def after_failure_to_transition(vehicle, transition)
223
225
  # Audit.error(vehicle, transition)
224
226
  # end
225
227
  # end
226
- #
228
+ #
227
229
  # More flexible transition callbacks can be defined directly within the
228
230
  # model as described in StateMachine::Machine#before_transition
229
231
  # and StateMachine::Machine#after_transition.
230
- #
232
+ #
231
233
  # To define a single observer for multiple state machines:
232
- #
234
+ #
233
235
  # class StateMachineObserver < ActiveModel::Observer
234
236
  # observe Vehicle, Switch, Project
235
- #
237
+ #
236
238
  # def after_transition(object, transition)
237
239
  # Audit.log(object, transition)
238
240
  # end
239
241
  # end
240
- #
242
+ #
241
243
  # == Internationalization
242
- #
244
+ #
243
245
  # Any error message that is generated from performing invalid transitions
244
246
  # can be localized. The following default translations are used:
245
- #
247
+ #
246
248
  # en:
247
249
  # activemodel:
248
250
  # errors:
@@ -252,16 +254,16 @@ module StateMachines
252
254
  # invalid_event: "cannot transition when %{state}"
253
255
  # # %{value} = attribute value, %{event} = Human event name, %{state} = Human current state name
254
256
  # invalid_transition: "cannot transition via %{event}"
255
- #
257
+ #
256
258
  # You can override these for a specific model like so:
257
- #
259
+ #
258
260
  # en:
259
261
  # activemodel:
260
262
  # errors:
261
263
  # models:
262
264
  # user:
263
265
  # invalid: "is not valid"
264
- #
266
+ #
265
267
  # In addition to the above, you can also provide translations for the
266
268
  # various states / events in each state machine. Using the Vehicle example,
267
269
  # state translations will be looked for using the following keys, where
@@ -270,16 +272,16 @@ module StateMachines
270
272
  # * <tt>activemodel.state_machines.#{model_name}.states.#{state_name}</tt>
271
273
  # * <tt>activemodel.state_machines.#{machine_name}.states.#{state_name}</tt>
272
274
  # * <tt>activemodel.state_machines.states.#{state_name}</tt>
273
- #
275
+ #
274
276
  # Event translations will be looked for using the following keys, where
275
277
  # +model_name+ = "vehicle", +machine_name+ = "state" and +event_name+ = "ignite":
276
278
  # * <tt>activemodel.state_machines.#{model_name}.#{machine_name}.events.#{event_name}</tt>
277
279
  # * <tt>activemodel.state_machines.#{model_name}.events.#{event_name}</tt>
278
280
  # * <tt>activemodel.state_machines.#{machine_name}.events.#{event_name}</tt>
279
281
  # * <tt>activemodel.state_machines.events.#{event_name}</tt>
280
- #
282
+ #
281
283
  # An example translation configuration might look like so:
282
- #
284
+ #
283
285
  # es:
284
286
  # activemodel:
285
287
  # state_machines:
@@ -287,83 +289,81 @@ module StateMachines
287
289
  # parked: 'estacionado'
288
290
  # events:
289
291
  # park: 'estacionarse'
290
- #
292
+ #
291
293
  # == Dirty Attribute Tracking
292
- #
294
+ #
293
295
  # When using the ActiveModel::Dirty extension, your model will keep track of
294
296
  # any changes that are made to attributes. Depending on your ORM, an object
295
297
  # will only be saved when there are attributes that have changed on the
296
298
  # object. When integrating with state_machine, typically the +state+ field
297
299
  # will be marked as dirty after a transition occurs. In some situations,
298
300
  # however, this isn't the case.
299
- #
301
+ #
300
302
  # If you define loopback transitions in your state machine, the value for
301
303
  # the machine's attribute (e.g. state) will not change. Unless you explicitly
302
304
  # indicate so, this means that your object won't persist anything on a
303
305
  # loopback. For example:
304
- #
306
+ #
305
307
  # class Vehicle
306
308
  # include ActiveModel::Validations
307
309
  # include ActiveModel::Dirty
308
310
  # attr_accessor :state
309
- #
311
+ #
310
312
  # state_machine :initial => :parked do
311
313
  # event :park do
312
314
  # transition :parked => :parked, ...
313
315
  # end
314
316
  # end
315
317
  # end
316
- #
318
+ #
317
319
  # If, instead, you'd like your object to always persist regardless of
318
320
  # whether the value actually changed, you can do so by using the
319
321
  # <tt>#{attribute}_will_change!</tt> helpers or defining a +before_transition+
320
322
  # callback that actually changes an attribute on the model. For example:
321
- #
323
+ #
322
324
  # class Vehicle
323
325
  # ...
324
326
  # state_machine :initial => :parked do
325
327
  # before_transition all => same do |vehicle|
326
328
  # vehicle.state_will_change!
327
- #
329
+ #
328
330
  # # Alternative solution, updating timestamp
329
- # # vehicle.updated_at = Time.curent
331
+ # # vehicle.updated_at = Time.current
330
332
  # end
331
333
  # end
332
334
  # end
333
- #
335
+ #
334
336
  # == Creating new integrations
335
- #
337
+ #
336
338
  # If you want to integrate state_machine with an ORM that implements parts
337
339
  # or all of the ActiveModel API, only the machine defaults need to be
338
340
  # specified. Otherwise, the implementation is similar to any other
339
341
  # integration.
340
- #
342
+ #
341
343
  # For example,
342
- #
344
+ #
343
345
  # module StateMachine::Integrations::MyORM
344
- # include StateMachine::Integrations::ActiveModel
345
- #
346
- # @defaults = {:action => :persist}
347
- #
346
+ # include ActiveModel
347
+ #
348
+ # mattr_accessor(:defaults) { :action => :persist }
349
+ #
348
350
  # def self.matches?(klass)
349
351
  # defined?(::MyORM::Base) && klass <= ::MyORM::Base
350
352
  # end
351
- #
353
+ #
352
354
  # protected
353
- # def runs_validations_on_action?
354
- # action == :persist
355
- # end
355
+ #
356
+ # def runs_validations_on_action?
357
+ # action == :persist
358
+ # end
356
359
  # end
357
- #
360
+ #
358
361
  # If you wish to implement other features, such as attribute initialization
359
362
  # with protected attributes, named scopes, or database transactions, you
360
363
  # must add these independent of the ActiveModel integration. See the
361
364
  # ActiveRecord implementation for examples of these customizations.
362
365
  module ActiveModel
363
-
364
- include StateMachines::Integrations::Base
365
- extend ClassMethods
366
-
366
+ include Base
367
367
 
368
368
  @defaults = {}
369
369
 
@@ -373,11 +373,11 @@ module StateMachines
373
373
  %w(ActiveModel ActiveModel::Validations)
374
374
  end
375
375
 
376
- # Adds a validation error to the given object
376
+ # Adds a validation error to the given object
377
377
  def invalidate(object, attribute, message, values = [])
378
378
  if supports_validations?
379
379
  attribute = self.attribute(attribute)
380
- options = values.inject({}) do |h, (key, value)|
380
+ options = values.reduce({}) do |h, (key, value)|
381
381
  h[key] = value
382
382
  h
383
383
  end
@@ -400,7 +400,7 @@ module StateMachines
400
400
 
401
401
  # Runs state events around the object's validation process
402
402
  def around_validation(object)
403
- object.class.state_machines.transitions(object, action, :after => false).perform { yield }
403
+ object.class.state_machines.transitions(object, action, after: false).perform { yield }
404
404
  end
405
405
 
406
406
  protected
@@ -420,7 +420,7 @@ module StateMachines
420
420
 
421
421
  # Gets the terminator to use for callbacks
422
422
  def callback_terminator
423
- @terminator ||= lambda { |result| result == false }
423
+ @terminator ||= ->(result) { result == false }
424
424
  end
425
425
 
426
426
  # Determines the base scope to use when looking up translations
@@ -430,8 +430,8 @@ module StateMachines
430
430
 
431
431
  # The default options to use when generating messages for validation
432
432
  # errors
433
- def default_error_message_options(object, attribute, message)
434
- {:message => @messages[message]}
433
+ def default_error_message_options(_object, _attribute, message)
434
+ { message: @messages[message] }
435
435
  end
436
436
 
437
437
  # Translates the given key / value combo. Translation keys are looked
@@ -451,7 +451,7 @@ module StateMachines
451
451
  translations = ancestors.map { |ancestor| :"#{ancestor.model_name.to_s.underscore}.#{name}.#{group}.#{value}" }
452
452
  translations.concat(ancestors.map { |ancestor| :"#{ancestor.model_name.to_s.underscore}.#{group}.#{value}" })
453
453
  translations.concat([:"#{name}.#{group}.#{value}", :"#{group}.#{value}", value.humanize.downcase])
454
- I18n.translate(translations.shift, :default => translations, :scope => [i18n_scope(klass), :state_machines])
454
+ I18n.translate(translations.shift, default: translations, scope: [i18n_scope(klass), :state_machines])
455
455
  end
456
456
 
457
457
  # Build a list of ancestors for the given class to use when
@@ -475,12 +475,11 @@ module StateMachines
475
475
  "#{File.dirname(__FILE__)}/active_model/locale.rb"
476
476
  end
477
477
 
478
-
479
478
  # Skips defining reader/writer methods since this is done automatically
480
479
  def define_state_accessor
481
480
  name = self.name
482
481
 
483
- owner_class.validates_each(attribute) do |object, attr, value|
482
+ owner_class.validates_each(attribute) do |object|
484
483
  machine = object.class.state_machine(name)
485
484
  machine.invalidate(object, :state, :invalid) unless machine.states.match(object)
486
485
  end if supports_validations?
@@ -495,7 +494,7 @@ module StateMachines
495
494
  # Hooks into validations by defining around callbacks for the
496
495
  # :validation event
497
496
  def define_validation_hook
498
- owner_class.set_callback(:validation, :around, self, :prepend => true)
497
+ owner_class.set_callback(:validation, :around, self, prepend: true)
499
498
  end
500
499
 
501
500
  # Creates a new callback in the callback chain, always inserting it
@@ -507,20 +506,18 @@ module StateMachines
507
506
  end
508
507
 
509
508
  # Configures new states with the built-in humanize scheme
510
- def add_states(new_states)
509
+ def add_states(*)
511
510
  super.each do |new_state|
512
- new_state.human_name = lambda { |state, klass| translate(klass, :state, state.name) }
511
+ new_state.human_name = ->(state, klass) { translate(klass, :state, state.name) }
513
512
  end
514
513
  end
515
514
 
516
515
  # Configures new event with the built-in humanize scheme
517
- def add_events(new_events)
516
+ def add_events(*)
518
517
  super.each do |new_event|
519
- new_event.human_name = lambda { |event, klass| translate(klass, :event, event.name) }
518
+ new_event.human_name = ->(event, klass) { translate(klass, :event, event.name) }
520
519
  end
521
520
  end
522
-
523
-
524
521
  end
525
522
  end
526
523
  end