File tree 3 files changed +37
-2
lines changed
3 files changed +37
-2
lines changed Original file line number Diff line number Diff line change @@ -366,6 +366,16 @@ Machine.successors
366
366
}
367
367
```
368
368
369
+ ## Class constants
370
+ Each machine's state will turn into a constant:
371
+ ``` ruby
372
+ Machine .state(:some_state , initial: true )
373
+ Machine .state(:another_state )
374
+
375
+ Machine ::SOME_STATE # => "some_state"
376
+ Machine ::ANOTHER_STATE # => "another_state"
377
+ ```
378
+
369
379
## Instance methods
370
380
371
381
#### ` Machine#current_state `
Original file line number Diff line number Diff line change @@ -39,6 +39,8 @@ def state(name, options = { initial: false })
39
39
validate_initial_state ( name )
40
40
@initial_state = name
41
41
end
42
+ define_state_constant ( name )
43
+
42
44
states << name
43
45
end
44
46
@@ -163,6 +165,16 @@ def validate_from_and_to_state(from, to)
163
165
164
166
private
165
167
168
+ def define_state_constant ( state_name )
169
+ constant_name = state_name . upcase
170
+
171
+ if const_defined? ( constant_name )
172
+ warn "Name conflict: '#{ self . class . name } ::#{ constant_name } ' is already defined"
173
+ else
174
+ const_set ( constant_name , state_name )
175
+ end
176
+ end
177
+
166
178
def add_callback ( callback_type : nil , callback_class : nil ,
167
179
from : nil , to : nil , &block )
168
180
validate_callback_type_and_class ( callback_type , callback_class )
Original file line number Diff line number Diff line change 13
13
14
14
specify { expect ( machine . states ) . to eq ( %w[ x y ] ) }
15
15
16
+ specify { expect ( machine ::X ) . to eq "x" }
17
+
18
+ specify { expect ( machine ::Y ) . to eq "y" }
19
+
16
20
context "initial" do
17
- before { machine . state ( :x , initial : true ) }
21
+ before { machine . state ( :z , initial : true ) }
18
22
19
- specify { expect ( machine . initial_state ) . to eq ( "x " ) }
23
+ specify { expect ( machine . initial_state ) . to eq ( "z " ) }
20
24
21
25
context "when an initial state is already defined" do
22
26
it "raises an error" do
25
29
end
26
30
end
27
31
end
32
+
33
+ context "when state name constant is already defined" do
34
+ it "warns about name conflict" do
35
+ machine . const_set ( :SOME_CONST , "some const" )
36
+ warning_message = "Name conflict: 'Class::SOME_CONST' is already defined\n "
37
+
38
+ expect { machine . state ( :some_const ) } . to output ( warning_message ) . to_stderr
39
+ end
40
+ end
28
41
end
29
42
30
43
describe ".remove_state" do
You can’t perform that action at this time.
0 commit comments