simple_states 0.1.0.pre2 → 0.1.0.pre3
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/README.md +58 -47
- data/lib/simple_states.rb +1 -1
- data/lib/simple_states/version.rb +1 -1
- metadata +13 -14
data/README.md
CHANGED
@@ -7,28 +7,30 @@ Travis CI.
|
|
7
7
|
|
8
8
|
Define states and events like this:
|
9
9
|
|
10
|
-
|
11
|
-
|
10
|
+
``` ruby
|
11
|
+
class Foo
|
12
|
+
include SimpleStates
|
12
13
|
|
13
|
-
|
14
|
+
states :created, :started, :finished
|
14
15
|
|
15
|
-
|
16
|
-
|
16
|
+
event :start, :from => :created, :to => :started, :if => :startable?
|
17
|
+
event :finish, :to => :finished, :after => :cleanup
|
17
18
|
|
18
|
-
|
19
|
+
attr_accessor :state, :started_at, :finished_at
|
19
20
|
|
20
|
-
|
21
|
-
|
22
|
-
|
21
|
+
def start
|
22
|
+
# start foo
|
23
|
+
end
|
23
24
|
|
24
|
-
|
25
|
-
|
26
|
-
|
25
|
+
def startable?
|
26
|
+
true
|
27
|
+
end
|
27
28
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
29
|
+
def cleanup
|
30
|
+
# cleanup foo
|
31
|
+
end
|
32
|
+
end
|
33
|
+
```
|
32
34
|
|
33
35
|
Including the SimpleStates module to your class is currently required. We'll add
|
34
36
|
hooks for ActiveRecord etc later.
|
@@ -37,24 +39,26 @@ SimpleStates expects your model to support attribute accessors for `:state`.
|
|
37
39
|
|
38
40
|
Event options have the following well-known meanings:
|
39
41
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
42
|
+
``` ruby
|
43
|
+
:from # valid states to transition from
|
44
|
+
:to # target state to transition to
|
45
|
+
:if # only proceed if the given method returns true
|
46
|
+
:unless # only proceed if the given method returns false
|
47
|
+
:before # run the given method before running `super` and setting the new state
|
48
|
+
:after # run the given method at the very end
|
49
|
+
```
|
46
50
|
|
47
51
|
All of these options except for `:to` can be given as a single symbol or string or
|
48
52
|
as an Array of symbols or strings.
|
49
53
|
|
50
54
|
Calling `event` will effectively add methods to a proxy module which is
|
51
55
|
included to the singleton class of your class' instances. E.g. declaring `event
|
52
|
-
:start` in the example above will add
|
53
|
-
the singleton class of instances of `Foo`.
|
56
|
+
:start` in the example above will add methods `start` and `start!` to a module
|
57
|
+
included to the singleton class of instances of `Foo`.
|
54
58
|
|
55
59
|
This method will
|
56
60
|
|
57
|
-
1. check if `:if`/`:
|
61
|
+
1. check if `:if`/`:unless` conditions apply (if given) and just return from the method otherwise
|
58
62
|
2. check if the object currently is in a valid `:from` state (if given) and raise an exception otherwise
|
59
63
|
3. run `:before` callbacks (if given)
|
60
64
|
4. call `super` if Foo defines the current method (i.e. call `start` but not `finish` in the example above)
|
@@ -65,8 +69,10 @@ This method will
|
|
65
69
|
|
66
70
|
You can define options for all events like so:
|
67
71
|
|
68
|
-
|
69
|
-
|
72
|
+
``` ruby
|
73
|
+
event :finish, :to => :finished, :after => :cleanup
|
74
|
+
event :all, :after => :notify
|
75
|
+
```
|
70
76
|
|
71
77
|
This will call :cleanup first and then :notify on :finish.
|
72
78
|
|
@@ -78,31 +84,36 @@ way then it will raise an exception.
|
|
78
84
|
By default SimpleStates will assum `:created` as an initial state. You can
|
79
85
|
overwrite this using:
|
80
86
|
|
81
|
-
|
87
|
+
``` ruby
|
88
|
+
# note that we have to use self here!
|
89
|
+
self.initial_state = :some_state
|
90
|
+
```
|
82
91
|
|
83
92
|
So with the example above something the following would work:
|
84
93
|
|
85
|
-
|
94
|
+
``` ruby
|
95
|
+
foo = Foo.new
|
86
96
|
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
97
|
+
foo.state # :created
|
98
|
+
foo.created? # true
|
99
|
+
foo.was_created? # true
|
100
|
+
foo.state?(:created) # true
|
91
101
|
|
92
|
-
|
102
|
+
foo.start # checks Foo#startable? and then calls Foo#start
|
103
|
+
# calling foo.start! (with exclamation mark) would perform same actions as foo.start, but
|
104
|
+
# also call foo.save! afterwards.
|
93
105
|
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
foo.finish # just performs state logic as there's no Foo#finish
|
101
|
-
|
102
|
-
foo.state # :finished
|
103
|
-
foo.finished? # true
|
104
|
-
foo.finished_at # Time.now
|
105
|
-
foo.was_created? # true
|
106
|
-
foo.was_started? # true
|
106
|
+
foo.state # :started
|
107
|
+
foo.started? # true
|
108
|
+
foo.started_at # Time.now
|
109
|
+
foo.created? # false
|
110
|
+
foo.was_created? # true
|
107
111
|
|
112
|
+
foo.finish # just performs state logic as there's no Foo#finish
|
108
113
|
|
114
|
+
foo.state # :finished
|
115
|
+
foo.finished? # true
|
116
|
+
foo.finished_at # Time.now
|
117
|
+
foo.was_created? # true
|
118
|
+
foo.was_started? # true
|
119
|
+
```
|
data/lib/simple_states.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: simple_states
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.0.
|
4
|
+
version: 0.1.0.pre3
|
5
5
|
prerelease: 6
|
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:
|
12
|
+
date: 2012-04-22 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|
16
|
-
requirement: &
|
16
|
+
requirement: &70262350435840 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70262350435840
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: hashr
|
27
|
-
requirement: &
|
27
|
+
requirement: &70262350434940 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ~>
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: 0.0.10
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70262350434940
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: rake
|
38
|
-
requirement: &
|
38
|
+
requirement: &70262350434360 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ~>
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: 0.9.2
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70262350434360
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: test_declarative
|
49
|
-
requirement: &
|
49
|
+
requirement: &70262350433840 !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: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *70262350433840
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: mocha
|
60
|
-
requirement: &
|
60
|
+
requirement: &70262350433120 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ! '>='
|
@@ -65,7 +65,7 @@ dependencies:
|
|
65
65
|
version: '0'
|
66
66
|
type: :development
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *70262350433120
|
69
69
|
description: ! '[description]'
|
70
70
|
email: svenfuchs@artweb-design.de
|
71
71
|
executables: []
|
@@ -102,9 +102,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
102
102
|
version: 1.3.1
|
103
103
|
requirements: []
|
104
104
|
rubyforge_project: ! '[none]'
|
105
|
-
rubygems_version: 1.8.
|
105
|
+
rubygems_version: 1.8.11
|
106
106
|
signing_key:
|
107
107
|
specification_version: 3
|
108
108
|
summary: ! '[summary]'
|
109
109
|
test_files: []
|
110
|
-
has_rdoc:
|