aasm 5.0.2 → 5.0.3
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +4 -0
- data/README.md +92 -92
- data/lib/aasm/base.rb +8 -0
- data/lib/aasm/version.rb +1 -1
- data/spec/database.rb +3 -0
- data/spec/models/active_record/person.rb +23 -0
- data/spec/unit/abstract_class_spec.rb +27 -0
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 90423050620c1cd3228e8f5f67b76be213c9c491
|
4
|
+
data.tar.gz: 8d583eb68700900b6e0a8c22d6e8b7b0e8714ce7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fb3ca30cbb4d415e5fc9905ae1b9e9ace0b7145ff97f29ce8639a57a99df3df43f3b1626dd9029421e54326085a8e4f5853dfbd21e231c778b3dca058cc980b9
|
7
|
+
data.tar.gz: 72996c355abefda14839e009f50bdcf900b0acd6d43f3d9eabb4e587390dd67b16be0a9eb66119f7e9d394993d266a0af823dedd6b54ad3e20049d7794fe9bfa
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -70,19 +70,19 @@ class Job
|
|
70
70
|
include AASM
|
71
71
|
|
72
72
|
aasm do
|
73
|
-
state :sleeping, :
|
73
|
+
state :sleeping, initial: true
|
74
74
|
state :running, :cleaning
|
75
75
|
|
76
76
|
event :run do
|
77
|
-
transitions :
|
77
|
+
transitions from: :sleeping, to: :running
|
78
78
|
end
|
79
79
|
|
80
80
|
event :clean do
|
81
|
-
transitions :
|
81
|
+
transitions from: :running, to: :cleaning
|
82
82
|
end
|
83
83
|
|
84
84
|
event :sleep do
|
85
|
-
transitions :
|
85
|
+
transitions from: [:running, :cleaning], to: :sleeping
|
86
86
|
end
|
87
87
|
end
|
88
88
|
|
@@ -108,7 +108,7 @@ AASM not to be *whiny*:
|
|
108
108
|
```ruby
|
109
109
|
class Job
|
110
110
|
...
|
111
|
-
aasm :
|
111
|
+
aasm whiny_transitions: false do
|
112
112
|
...
|
113
113
|
end
|
114
114
|
end
|
@@ -137,19 +137,19 @@ class Job
|
|
137
137
|
include AASM
|
138
138
|
|
139
139
|
aasm do
|
140
|
-
state :sleeping, :
|
140
|
+
state :sleeping, initial: true, before_enter: :do_something
|
141
141
|
state :running, before_enter: Proc.new { do_something && notify_somebody }
|
142
142
|
state :finished
|
143
143
|
|
144
144
|
after_all_transitions :log_status_change
|
145
145
|
|
146
|
-
event :run, :
|
146
|
+
event :run, after: :notify_somebody do
|
147
147
|
before do
|
148
148
|
log('Preparing to run')
|
149
149
|
end
|
150
150
|
|
151
|
-
transitions :
|
152
|
-
transitions :
|
151
|
+
transitions from: :sleeping, to: :running, after: Proc.new {|*args| set_process(*args) }
|
152
|
+
transitions from: :running, to: :finished, after: LogRunTime
|
153
153
|
end
|
154
154
|
|
155
155
|
event :sleep do
|
@@ -159,7 +159,7 @@ class Job
|
|
159
159
|
error do |e|
|
160
160
|
...
|
161
161
|
end
|
162
|
-
transitions :
|
162
|
+
transitions from: :running, to: :sleeping
|
163
163
|
end
|
164
164
|
end
|
165
165
|
|
@@ -312,24 +312,24 @@ class Cleaner
|
|
312
312
|
include AASM
|
313
313
|
|
314
314
|
aasm do
|
315
|
-
state :idle, :
|
315
|
+
state :idle, initial: true
|
316
316
|
state :cleaning
|
317
317
|
|
318
318
|
event :clean do
|
319
|
-
transitions :
|
319
|
+
transitions from: :idle, to: :cleaning, guard: :cleaning_needed?
|
320
320
|
end
|
321
321
|
|
322
322
|
event :clean_if_needed do
|
323
|
-
transitions :
|
323
|
+
transitions from: :idle, to: :cleaning do
|
324
324
|
guard do
|
325
325
|
cleaning_needed?
|
326
326
|
end
|
327
327
|
end
|
328
|
-
transitions :
|
328
|
+
transitions from: :idle, to: :idle
|
329
329
|
end
|
330
330
|
|
331
331
|
event :clean_if_dirty do
|
332
|
-
transitions :
|
332
|
+
transitions from: :idle, to: :cleaning, guard: :if_dirty?
|
333
333
|
end
|
334
334
|
end
|
335
335
|
|
@@ -358,16 +358,16 @@ You can even provide a number of guards, which all have to succeed to proceed
|
|
358
358
|
def walked_the_dog?; ...; end
|
359
359
|
|
360
360
|
event :sleep do
|
361
|
-
transitions :
|
361
|
+
transitions from: :running, to: :sleeping, guards: [:cleaning_needed?, :walked_the_dog?]
|
362
362
|
end
|
363
363
|
```
|
364
364
|
|
365
365
|
If you want to provide guards for all transitions within an event, you can use event guards
|
366
366
|
|
367
367
|
```ruby
|
368
|
-
event :sleep, :
|
369
|
-
transitions :
|
370
|
-
transitions :
|
368
|
+
event :sleep, guards: [:walked_the_dog?] do
|
369
|
+
transitions from: :running, to: :sleeping, guards: [:cleaning_needed?]
|
370
|
+
transitions from: :cleaning, to: :sleeping
|
371
371
|
end
|
372
372
|
```
|
373
373
|
|
@@ -375,20 +375,20 @@ If you prefer a more Ruby-like guard syntax, you can use `if` and `unless` as we
|
|
375
375
|
|
376
376
|
```ruby
|
377
377
|
event :clean do
|
378
|
-
transitions :
|
378
|
+
transitions from: :running, to: :cleaning, if: :cleaning_needed?
|
379
379
|
end
|
380
380
|
|
381
381
|
event :sleep do
|
382
|
-
transitions :
|
382
|
+
transitions from: :running, to: :sleeping, unless: :cleaning_needed?
|
383
383
|
end
|
384
384
|
end
|
385
385
|
```
|
386
386
|
|
387
|
-
You can invoke a Class instead a method since this Class responds to `call`
|
387
|
+
You can invoke a Class instead a method since this Class responds to `call`
|
388
388
|
|
389
389
|
```ruby
|
390
390
|
event :sleep do
|
391
|
-
transitions :
|
391
|
+
transitions from: :running, to: :sleeping, guards: Dog
|
392
392
|
end
|
393
393
|
```
|
394
394
|
```ruby
|
@@ -411,7 +411,7 @@ class Job
|
|
411
411
|
include AASM
|
412
412
|
|
413
413
|
aasm do
|
414
|
-
state :stage1, :
|
414
|
+
state :stage1, initial: true
|
415
415
|
state :stage2
|
416
416
|
state :stage3
|
417
417
|
state :completed
|
@@ -442,30 +442,30 @@ built with one state machine per class in mind. Nonetheless, here's how to do it
|
|
442
442
|
class SimpleMultipleExample
|
443
443
|
include AASM
|
444
444
|
aasm(:move) do
|
445
|
-
state :standing, :
|
445
|
+
state :standing, initial: true
|
446
446
|
state :walking
|
447
447
|
state :running
|
448
448
|
|
449
449
|
event :walk do
|
450
|
-
transitions :
|
450
|
+
transitions from: :standing, to: :walking
|
451
451
|
end
|
452
452
|
event :run do
|
453
|
-
transitions :
|
453
|
+
transitions from: [:standing, :walking], to: :running
|
454
454
|
end
|
455
455
|
event :hold do
|
456
|
-
transitions :
|
456
|
+
transitions from: [:walking, :running], to: :standing
|
457
457
|
end
|
458
458
|
end
|
459
459
|
|
460
460
|
aasm(:work) do
|
461
|
-
state :sleeping, :
|
461
|
+
state :sleeping, initial: true
|
462
462
|
state :processing
|
463
463
|
|
464
464
|
event :start do
|
465
|
-
transitions :
|
465
|
+
transitions from: :sleeping, to: :processing
|
466
466
|
end
|
467
467
|
event :stop do
|
468
|
-
transitions :
|
468
|
+
transitions from: :processing, to: :sleeping
|
469
469
|
end
|
470
470
|
end
|
471
471
|
end
|
@@ -498,28 +498,28 @@ Alternatively, you can provide a namespace for each state machine:
|
|
498
498
|
class NamespacedMultipleExample
|
499
499
|
include AASM
|
500
500
|
aasm(:status) do
|
501
|
-
state :unapproved, :
|
501
|
+
state :unapproved, initial: true
|
502
502
|
state :approved
|
503
503
|
|
504
504
|
event :approve do
|
505
|
-
transitions :
|
505
|
+
transitions from: :unapproved, to: :approved
|
506
506
|
end
|
507
507
|
|
508
508
|
event :unapprove do
|
509
|
-
transitions :
|
509
|
+
transitions from: :approved, to: :unapproved
|
510
510
|
end
|
511
511
|
end
|
512
512
|
|
513
513
|
aasm(:review_status, namespace: :review) do
|
514
|
-
state :unapproved, :
|
514
|
+
state :unapproved, initial: true
|
515
515
|
state :approved
|
516
516
|
|
517
517
|
event :approve do
|
518
|
-
transitions :
|
518
|
+
transitions from: :unapproved, to: :approved
|
519
519
|
end
|
520
520
|
|
521
521
|
event :unapprove do
|
522
|
-
transitions :
|
522
|
+
transitions from: :approved, to: :unapproved
|
523
523
|
end
|
524
524
|
end
|
525
525
|
end
|
@@ -551,26 +551,26 @@ class Example
|
|
551
551
|
include AASM
|
552
552
|
|
553
553
|
aasm(:work) do
|
554
|
-
state :sleeping, :
|
554
|
+
state :sleeping, initial: true
|
555
555
|
state :processing
|
556
556
|
|
557
557
|
event :start do
|
558
|
-
transitions :
|
558
|
+
transitions from: :sleeping, to: :processing
|
559
559
|
end
|
560
560
|
event :stop do
|
561
|
-
transitions :
|
561
|
+
transitions from: :processing, to: :sleeping
|
562
562
|
end
|
563
563
|
end
|
564
564
|
|
565
565
|
aasm(:question) do
|
566
|
-
state :answered, :
|
566
|
+
state :answered, initial: true
|
567
567
|
state :asked
|
568
568
|
|
569
|
-
event :ask, :
|
570
|
-
transitions :
|
569
|
+
event :ask, binding_event: :start do
|
570
|
+
transitions from: :answered, to: :asked
|
571
571
|
end
|
572
|
-
event :answer, :
|
573
|
-
transitions :
|
572
|
+
event :answer, binding_event: :stop do
|
573
|
+
transitions from: :asked, to: :answered
|
574
574
|
end
|
575
575
|
end
|
576
576
|
end
|
@@ -616,7 +616,7 @@ class CustomAASMBase < AASM::Base
|
|
616
616
|
# A custom transiton that we want available across many AASM models.
|
617
617
|
def count_transitions!
|
618
618
|
klass.class_eval do
|
619
|
-
aasm :
|
619
|
+
aasm with_klass: CustomAASMBase do
|
620
620
|
after_all_transitions :increment_transition_count
|
621
621
|
end
|
622
622
|
end
|
@@ -653,19 +653,19 @@ class SimpleCustomExample
|
|
653
653
|
include AASM
|
654
654
|
|
655
655
|
# Let's build an AASM state machine with our custom class.
|
656
|
-
aasm :
|
656
|
+
aasm with_klass: CustomAASMBase do
|
657
657
|
requires_guards!
|
658
658
|
count_transitions!
|
659
659
|
|
660
|
-
state :initialised, :
|
660
|
+
state :initialised, initial: true
|
661
661
|
state :filled_out
|
662
662
|
state :authorised
|
663
663
|
|
664
664
|
event :fill_out do
|
665
|
-
transitions :
|
665
|
+
transitions from: :initialised, to: :filled_out, guard: :fillable?
|
666
666
|
end
|
667
667
|
event :authorise do
|
668
|
-
transitions :
|
668
|
+
transitions from: :filled_out, to: :authorised, guard: :authorizable?
|
669
669
|
end
|
670
670
|
end
|
671
671
|
end
|
@@ -682,15 +682,15 @@ class Job < ActiveRecord::Base
|
|
682
682
|
include AASM
|
683
683
|
|
684
684
|
aasm do # default column: aasm_state
|
685
|
-
state :sleeping, :
|
685
|
+
state :sleeping, initial: true
|
686
686
|
state :running
|
687
687
|
|
688
688
|
event :run do
|
689
|
-
transitions :
|
689
|
+
transitions from: :sleeping, to: :running
|
690
690
|
end
|
691
691
|
|
692
692
|
event :sleep do
|
693
|
-
transitions :
|
693
|
+
transitions from: :running, to: :sleeping
|
694
694
|
end
|
695
695
|
end
|
696
696
|
|
@@ -725,16 +725,16 @@ be updated in the database (just like ActiveRecord `update_column` is working).
|
|
725
725
|
class Job < ActiveRecord::Base
|
726
726
|
include AASM
|
727
727
|
|
728
|
-
aasm :
|
729
|
-
state :sleeping, :
|
728
|
+
aasm skip_validation_on_save: true do
|
729
|
+
state :sleeping, initial: true
|
730
730
|
state :running
|
731
731
|
|
732
732
|
event :run do
|
733
|
-
transitions :
|
733
|
+
transitions from: :sleeping, to: :running
|
734
734
|
end
|
735
735
|
|
736
736
|
event :sleep do
|
737
|
-
transitions :
|
737
|
+
transitions from: :running, to: :sleeping
|
738
738
|
end
|
739
739
|
end
|
740
740
|
|
@@ -748,12 +748,12 @@ configure _AASM_ to not allow direct assignment, like this:
|
|
748
748
|
class Job < ActiveRecord::Base
|
749
749
|
include AASM
|
750
750
|
|
751
|
-
aasm :
|
752
|
-
state :sleeping, :
|
751
|
+
aasm no_direct_assignment: true do
|
752
|
+
state :sleeping, initial: true
|
753
753
|
state :running
|
754
754
|
|
755
755
|
event :run do
|
756
|
-
transitions :
|
756
|
+
transitions from: :sleeping, to: :running
|
757
757
|
end
|
758
758
|
end
|
759
759
|
|
@@ -784,8 +784,8 @@ class Job < ActiveRecord::Base
|
|
784
784
|
running: 99
|
785
785
|
}
|
786
786
|
|
787
|
-
aasm :
|
788
|
-
state :sleeping, :
|
787
|
+
aasm column: :state, enum: true do
|
788
|
+
state :sleeping, initial: true
|
789
789
|
state :running
|
790
790
|
end
|
791
791
|
end
|
@@ -884,7 +884,7 @@ class Job < ActiveRecord::Base
|
|
884
884
|
include AASM
|
885
885
|
|
886
886
|
aasm do
|
887
|
-
state :sleeping, :
|
887
|
+
state :sleeping, initial: true
|
888
888
|
state :running
|
889
889
|
state :cleaning
|
890
890
|
end
|
@@ -913,8 +913,8 @@ defining the `AASM` states, like this:
|
|
913
913
|
class Job < ActiveRecord::Base
|
914
914
|
include AASM
|
915
915
|
|
916
|
-
aasm :
|
917
|
-
state :sleeping, :
|
916
|
+
aasm create_scopes: false do
|
917
|
+
state :sleeping, initial: true
|
918
918
|
state :running
|
919
919
|
state :cleaning
|
920
920
|
end
|
@@ -947,11 +947,11 @@ class Job < ActiveRecord::Base
|
|
947
947
|
include AASM
|
948
948
|
|
949
949
|
aasm do
|
950
|
-
state :sleeping, :
|
950
|
+
state :sleeping, initial: true
|
951
951
|
state :running
|
952
952
|
|
953
|
-
event :run, :
|
954
|
-
transitions :
|
953
|
+
event :run, after_commit: :notify_about_running_job do
|
954
|
+
transitions from: :sleeping, to: :running
|
955
955
|
end
|
956
956
|
end
|
957
957
|
|
@@ -977,14 +977,14 @@ If you want to encapsulate state changes within an own transaction, the behavior
|
|
977
977
|
of this nested transaction might be confusing. Take a look at
|
978
978
|
[ActiveRecord Nested Transactions](http://api.rubyonrails.org/classes/ActiveRecord/Transactions/ClassMethods.html)
|
979
979
|
if you want to know more about this. Nevertheless, AASM by default requires a new transaction
|
980
|
-
`transaction(:
|
980
|
+
`transaction(requires_new: true)`. You can override this behavior by changing
|
981
981
|
the configuration
|
982
982
|
|
983
983
|
```ruby
|
984
984
|
class Job < ActiveRecord::Base
|
985
985
|
include AASM
|
986
986
|
|
987
|
-
aasm :
|
987
|
+
aasm requires_new_transaction: false do
|
988
988
|
...
|
989
989
|
end
|
990
990
|
|
@@ -992,7 +992,7 @@ class Job < ActiveRecord::Base
|
|
992
992
|
end
|
993
993
|
```
|
994
994
|
|
995
|
-
which then leads to `transaction(:
|
995
|
+
which then leads to `transaction(requires_new: false)`, the Rails default.
|
996
996
|
|
997
997
|
Additionally, if you do not want any of your active record actions to be
|
998
998
|
wrapped in a transaction, you can specify the `use_transactions` flag. This can
|
@@ -1004,7 +1004,7 @@ result of a transaction or callback, even when some error occurs. The
|
|
1004
1004
|
class Job < ActiveRecord::Base
|
1005
1005
|
include AASM
|
1006
1006
|
|
1007
|
-
aasm :
|
1007
|
+
aasm use_transactions: false do
|
1008
1008
|
...
|
1009
1009
|
end
|
1010
1010
|
|
@@ -1027,7 +1027,7 @@ AASM supports [Active Record pessimistic locking via `with_lock`](http://api.rub
|
|
1027
1027
|
class Job < ActiveRecord::Base
|
1028
1028
|
include AASM
|
1029
1029
|
|
1030
|
-
aasm :
|
1030
|
+
aasm requires_lock: true do
|
1031
1031
|
...
|
1032
1032
|
end
|
1033
1033
|
|
@@ -1039,7 +1039,7 @@ end
|
|
1039
1039
|
class Job < ActiveRecord::Base
|
1040
1040
|
include AASM
|
1041
1041
|
|
1042
|
-
aasm :
|
1042
|
+
aasm requires_lock: 'FOR UPDATE NOWAIT' do
|
1043
1043
|
...
|
1044
1044
|
end
|
1045
1045
|
|
@@ -1057,7 +1057,7 @@ this by defining your favorite column name, using `:column` like this:
|
|
1057
1057
|
class Job < ActiveRecord::Base
|
1058
1058
|
include AASM
|
1059
1059
|
|
1060
|
-
aasm :
|
1060
|
+
aasm column: 'my_state' do
|
1061
1061
|
...
|
1062
1062
|
end
|
1063
1063
|
|
@@ -1093,19 +1093,19 @@ class Job
|
|
1093
1093
|
include AASM
|
1094
1094
|
|
1095
1095
|
aasm do
|
1096
|
-
state :sleeping, :
|
1096
|
+
state :sleeping, initial: true
|
1097
1097
|
state :running, :cleaning
|
1098
1098
|
|
1099
1099
|
event :run do
|
1100
|
-
transitions :
|
1100
|
+
transitions from: :sleeping, to: :running
|
1101
1101
|
end
|
1102
1102
|
|
1103
1103
|
event :clean do
|
1104
|
-
transitions :
|
1104
|
+
transitions from: :running, to: :cleaning, guard: :cleaning_needed?
|
1105
1105
|
end
|
1106
1106
|
|
1107
1107
|
event :sleep do
|
1108
|
-
transitions :
|
1108
|
+
transitions from: [:running, :cleaning], to: :sleeping
|
1109
1109
|
end
|
1110
1110
|
end
|
1111
1111
|
|
@@ -1123,15 +1123,15 @@ Job.aasm.states.map(&:name)
|
|
1123
1123
|
job = Job.new
|
1124
1124
|
|
1125
1125
|
# show all permitted states (from initial state)
|
1126
|
-
job.aasm.states(:
|
1126
|
+
job.aasm.states(permitted: true).map(&:name)
|
1127
1127
|
#=> [:running]
|
1128
1128
|
|
1129
1129
|
job.run
|
1130
|
-
job.aasm.states(:
|
1130
|
+
job.aasm.states(permitted: true).map(&:name)
|
1131
1131
|
#=> [:sleeping]
|
1132
1132
|
|
1133
1133
|
# show all non permitted states
|
1134
|
-
job.aasm.states(:
|
1134
|
+
job.aasm.states(permitted: false).map(&:name)
|
1135
1135
|
#=> [:cleaning]
|
1136
1136
|
|
1137
1137
|
# show all possible (triggerable) events from the current state
|
@@ -1139,23 +1139,23 @@ job.aasm.events.map(&:name)
|
|
1139
1139
|
#=> [:clean, :sleep]
|
1140
1140
|
|
1141
1141
|
# show all permitted events
|
1142
|
-
job.aasm.events(:
|
1142
|
+
job.aasm.events(permitted: true).map(&:name)
|
1143
1143
|
#=> [:sleep]
|
1144
1144
|
|
1145
1145
|
# show all non permitted events
|
1146
|
-
job.aasm.events(:
|
1146
|
+
job.aasm.events(permitted: false).map(&:name)
|
1147
1147
|
#=> [:clean]
|
1148
1148
|
|
1149
1149
|
# show all possible events except a specific one
|
1150
|
-
job.aasm.events(:
|
1150
|
+
job.aasm.events(reject: :sleep).map(&:name)
|
1151
1151
|
#=> [:clean]
|
1152
1152
|
|
1153
1153
|
# list states for select
|
1154
1154
|
Job.aasm.states_for_select
|
1155
|
-
|
1155
|
+
#=> [["Sleeping", "sleeping"], ["Running", "running"], ["Cleaning", "cleaning"]]
|
1156
1156
|
|
1157
1157
|
# show permitted states with guard parameter
|
1158
|
-
job.aasm.states({:
|
1158
|
+
job.aasm.states({permitted: true}, guard_parameter).map(&:name)
|
1159
1159
|
```
|
1160
1160
|
|
1161
1161
|
|
@@ -1168,7 +1168,7 @@ use
|
|
1168
1168
|
class Job
|
1169
1169
|
include AASM
|
1170
1170
|
|
1171
|
-
aasm :
|
1171
|
+
aasm logger: Rails.logger do
|
1172
1172
|
...
|
1173
1173
|
end
|
1174
1174
|
end
|
@@ -1192,12 +1192,12 @@ the 'instance method symbol / string' way whenever possible when defining guardi
|
|
1192
1192
|
|
1193
1193
|
#### RSpec
|
1194
1194
|
|
1195
|
-
AASM provides some matchers for [RSpec](http://rspec.info):
|
1196
|
-
*`transition_from`,
|
1195
|
+
AASM provides some matchers for [RSpec](http://rspec.info):
|
1196
|
+
*`transition_from`,
|
1197
1197
|
* `have_state`, `allow_event`
|
1198
|
-
* and `allow_transition_to`.
|
1198
|
+
* and `allow_transition_to`.
|
1199
1199
|
|
1200
|
-
##### Installation Instructions:
|
1200
|
+
##### Installation Instructions:
|
1201
1201
|
* Add `require 'aasm/rspec'` to your `spec_helper.rb` file.
|
1202
1202
|
|
1203
1203
|
##### Examples Of Usage in Rspec:
|
data/lib/aasm/base.rb
CHANGED
@@ -54,6 +54,7 @@ module AASM
|
|
54
54
|
# make sure to raise an error if no_direct_assignment is enabled
|
55
55
|
# and attribute is directly assigned though
|
56
56
|
aasm_name = @name
|
57
|
+
return true if should_not_define_method(klass) && !@state_machine.config.no_direct_assignment
|
57
58
|
klass.send :define_method, "#{@state_machine.config.column}=", ->(state_name) do
|
58
59
|
if self.class.aasm(:"#{aasm_name}").state_machine.config.no_direct_assignment
|
59
60
|
raise AASM::NoDirectAssignmentError.new(
|
@@ -65,6 +66,13 @@ module AASM
|
|
65
66
|
end
|
66
67
|
end
|
67
68
|
|
69
|
+
def should_not_define_method(klass)
|
70
|
+
(klass.methods.include?(:abstract_class) &&
|
71
|
+
klass.abstract_class) ||
|
72
|
+
(klass.superclass.methods.include?(:abstract_class) &&
|
73
|
+
klass.superclass.abstract_class)
|
74
|
+
end
|
75
|
+
|
68
76
|
# This method is both a getter and a setter
|
69
77
|
def attribute_name(column_name=nil)
|
70
78
|
if column_name
|
data/lib/aasm/version.rb
CHANGED
data/spec/database.rb
CHANGED
@@ -14,6 +14,9 @@ ActiveRecord::Migration.suppress_messages do
|
|
14
14
|
ActiveRecord::Migration.create_table "implemented_abstract_class_dsls", :force => true do |t|
|
15
15
|
t.string "status"
|
16
16
|
end
|
17
|
+
ActiveRecord::Migration.create_table "users", :force => true do |t|
|
18
|
+
t.string "status"
|
19
|
+
end
|
17
20
|
|
18
21
|
ActiveRecord::Migration.create_table "complex_active_record_examples", :force => true do |t|
|
19
22
|
t.string "left"
|
@@ -0,0 +1,23 @@
|
|
1
|
+
class Base < ActiveRecord::Base
|
2
|
+
self.abstract_class = true
|
3
|
+
self.table_name = 'users'
|
4
|
+
|
5
|
+
include AASM
|
6
|
+
|
7
|
+
aasm column: 'status' do
|
8
|
+
state :inactive, initial: true
|
9
|
+
state :active
|
10
|
+
|
11
|
+
event :activate do
|
12
|
+
transitions from: :inactive, to: :active
|
13
|
+
end
|
14
|
+
|
15
|
+
event :deactivate do
|
16
|
+
transitions from: :active, to: :inactive
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
|
22
|
+
class Person < Base
|
23
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
if defined?(ActiveRecord)
|
3
|
+
require 'models/active_record/person'
|
4
|
+
|
5
|
+
load_schema
|
6
|
+
describe 'Abstract subclassing' do
|
7
|
+
|
8
|
+
it 'should have the parent states' do
|
9
|
+
Person.aasm.states.each do |state|
|
10
|
+
expect(Base.aasm.states).to include(state)
|
11
|
+
end
|
12
|
+
expect(Person.aasm.states).to eq(Base.aasm.states)
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'should have the same events as its parent' do
|
16
|
+
expect(Base.aasm.events).to eq(Person.aasm.events)
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'should not break aasm methods when super class is abstract_class' do
|
20
|
+
person = Person.new
|
21
|
+
person.status = 'active'
|
22
|
+
person.deactivate!
|
23
|
+
expect(person.aasm.current_state).to eq(:inactive)
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: aasm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 5.0.
|
4
|
+
version: 5.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Thorsten Boettger
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2019-
|
12
|
+
date: 2019-04-21 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: concurrent-ruby
|
@@ -210,6 +210,7 @@ files:
|
|
210
210
|
- spec/models/active_record/no_direct_assignment.rb
|
211
211
|
- spec/models/active_record/no_scope.rb
|
212
212
|
- spec/models/active_record/persisted_state.rb
|
213
|
+
- spec/models/active_record/person.rb
|
213
214
|
- spec/models/active_record/provided_and_persisted_state.rb
|
214
215
|
- spec/models/active_record/reader.rb
|
215
216
|
- spec/models/active_record/readme_job.rb
|
@@ -312,6 +313,7 @@ files:
|
|
312
313
|
- spec/spec_helpers/redis.rb
|
313
314
|
- spec/spec_helpers/remove_warnings.rb
|
314
315
|
- spec/spec_helpers/sequel.rb
|
316
|
+
- spec/unit/abstract_class_spec.rb
|
315
317
|
- spec/unit/api_spec.rb
|
316
318
|
- spec/unit/basic_two_state_machines_example_spec.rb
|
317
319
|
- spec/unit/callback_multiple_spec.rb
|
@@ -411,6 +413,7 @@ test_files:
|
|
411
413
|
- spec/models/active_record/no_direct_assignment.rb
|
412
414
|
- spec/models/active_record/no_scope.rb
|
413
415
|
- spec/models/active_record/persisted_state.rb
|
416
|
+
- spec/models/active_record/person.rb
|
414
417
|
- spec/models/active_record/provided_and_persisted_state.rb
|
415
418
|
- spec/models/active_record/reader.rb
|
416
419
|
- spec/models/active_record/readme_job.rb
|
@@ -513,6 +516,7 @@ test_files:
|
|
513
516
|
- spec/spec_helpers/redis.rb
|
514
517
|
- spec/spec_helpers/remove_warnings.rb
|
515
518
|
- spec/spec_helpers/sequel.rb
|
519
|
+
- spec/unit/abstract_class_spec.rb
|
516
520
|
- spec/unit/api_spec.rb
|
517
521
|
- spec/unit/basic_two_state_machines_example_spec.rb
|
518
522
|
- spec/unit/callback_multiple_spec.rb
|