simple_states 0.1.1 → 1.0.0
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/Gemfile +1 -1
- data/Gemfile.lock +9 -9
- data/lib/simple_states/event.rb +15 -13
- data/lib/simple_states/version.rb +1 -1
- data/lib/simple_states.rb +12 -10
- metadata +39 -13
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,23 +1,23 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
simple_states (0.1.
|
4
|
+
simple_states (0.1.1)
|
5
5
|
activesupport
|
6
6
|
hashr (~> 0.0.10)
|
7
7
|
|
8
8
|
GEM
|
9
|
-
remote:
|
9
|
+
remote: https://rubygems.org/
|
10
10
|
specs:
|
11
|
-
activesupport (3.2.
|
12
|
-
i18n (
|
11
|
+
activesupport (3.2.13)
|
12
|
+
i18n (= 0.6.1)
|
13
13
|
multi_json (~> 1.0)
|
14
|
-
hashr (0.0.
|
15
|
-
i18n (0.6.
|
14
|
+
hashr (0.0.22)
|
15
|
+
i18n (0.6.1)
|
16
16
|
metaclass (0.0.1)
|
17
|
-
mocha (0.
|
17
|
+
mocha (0.14.0)
|
18
18
|
metaclass (~> 0.0.1)
|
19
|
-
multi_json (1.3
|
20
|
-
rake (0.9.
|
19
|
+
multi_json (1.7.3)
|
20
|
+
rake (0.9.6)
|
21
21
|
test_declarative (0.0.5)
|
22
22
|
|
23
23
|
PLATFORMS
|
data/lib/simple_states/event.rb
CHANGED
@@ -24,10 +24,11 @@ module SimpleStates
|
|
24
24
|
|
25
25
|
raise_invalid_transition(object) unless can_transition?(object)
|
26
26
|
run_callbacks(object, :before, args)
|
27
|
+
set_state(object)
|
27
28
|
|
28
29
|
yield.tap do
|
29
|
-
set_state(object)
|
30
30
|
run_callbacks(object, :after, args)
|
31
|
+
raise_unknown_target_state(object) unless known_target_state?(object)
|
31
32
|
object.save! if @saving
|
32
33
|
end
|
33
34
|
end
|
@@ -48,26 +49,23 @@ module SimpleStates
|
|
48
49
|
end
|
49
50
|
|
50
51
|
def can_transition?(object)
|
51
|
-
!options.from || object.state && Array(options.from).include?(object.state)
|
52
|
+
!options.from || object.state && Array(options.from).include?(object.state.to_sym)
|
52
53
|
end
|
53
54
|
|
54
55
|
def run_callbacks(object, type, args)
|
56
|
+
object.save! if @saving
|
55
57
|
send_methods(object, options.send(type), args)
|
56
58
|
end
|
57
59
|
|
58
60
|
def set_state(object)
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
object.save! if @saving
|
64
|
-
end
|
61
|
+
state = target_state
|
62
|
+
object.past_states << object.state if object.state
|
63
|
+
object.state = state.to_sym
|
64
|
+
object.send(:"#{state}_at=", now) if object.respond_to?(:"#{state}_at=") && object.respond_to?(:"#{state}_at") && object.send(:"#{state}_at").nil?
|
65
65
|
end
|
66
66
|
|
67
|
-
def target_state
|
68
|
-
options.to || :"#{name}ed"
|
69
|
-
raise_unknown_target_state(object) unless object.class.states.include?(state)
|
70
|
-
end
|
67
|
+
def target_state
|
68
|
+
options.to || :"#{name}ed"
|
71
69
|
end
|
72
70
|
|
73
71
|
def send_methods(object, methods, args)
|
@@ -88,12 +86,16 @@ module SimpleStates
|
|
88
86
|
Time.respond_to?(:zone) && Time.zone ? Time.zone.now : Time.now.utc
|
89
87
|
end
|
90
88
|
|
89
|
+
def known_target_state?(object)
|
90
|
+
object.state && object.class.states.include?(object.state.to_sym)
|
91
|
+
end
|
92
|
+
|
91
93
|
def raise_invalid_transition(object)
|
92
94
|
raise TransitionException, "#{object.inspect} can not receive event #{name.inspect} while in state #{object.state.inspect}."
|
93
95
|
end
|
94
96
|
|
95
97
|
def raise_unknown_target_state(object)
|
96
|
-
raise TransitionException, "
|
98
|
+
raise TransitionException, "unknown target state #{object.state.inspect} for #{object.inspect} for event #{name.inspect}. known states are #{object.class.states.inspect}"
|
97
99
|
end
|
98
100
|
end
|
99
101
|
end
|
data/lib/simple_states.rb
CHANGED
@@ -1,6 +1,3 @@
|
|
1
|
-
require 'active_support/concern'
|
2
|
-
require 'active_support/core_ext/class/attribute'
|
3
|
-
require 'active_support/core_ext/kernel/singleton_class'
|
4
1
|
require 'active_support/core_ext/object/try'
|
5
2
|
|
6
3
|
module SimpleStates
|
@@ -9,16 +6,21 @@ module SimpleStates
|
|
9
6
|
autoload :Event, 'simple_states/event'
|
10
7
|
autoload :States, 'simple_states/states'
|
11
8
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
9
|
+
def self.included(base)
|
10
|
+
base.extend SimpleStates::ClassMethods
|
11
|
+
# Add class level attribute accessors
|
12
|
+
added_class_accessors = [ :state_names, :initial_state, :events ]
|
13
|
+
base.singleton_class.send :attr_accessor, *added_class_accessors
|
14
|
+
base.public_class_method *added_class_accessors
|
15
|
+
base.public_class_method *added_class_accessors.map{|att| "#{att}=".to_sym }
|
16
|
+
# default states
|
17
|
+
base.after_initialize :init_state if base.respond_to?(:after_initialize)
|
18
|
+
base.initial_state = :created
|
19
|
+
base.events = []
|
19
20
|
end
|
20
21
|
|
21
22
|
module ClassMethods
|
23
|
+
|
22
24
|
def new(*)
|
23
25
|
super.tap { |object| States.init(object) }
|
24
26
|
end
|
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.
|
4
|
+
version: 1.0.0
|
5
5
|
prerelease:
|
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: 2013-05-26 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|
16
|
-
requirement:
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,15 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements:
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
25
30
|
- !ruby/object:Gem::Dependency
|
26
31
|
name: hashr
|
27
|
-
requirement:
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
28
33
|
none: false
|
29
34
|
requirements:
|
30
35
|
- - ~>
|
@@ -32,10 +37,15 @@ dependencies:
|
|
32
37
|
version: 0.0.10
|
33
38
|
type: :runtime
|
34
39
|
prerelease: false
|
35
|
-
version_requirements:
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 0.0.10
|
36
46
|
- !ruby/object:Gem::Dependency
|
37
47
|
name: rake
|
38
|
-
requirement:
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
39
49
|
none: false
|
40
50
|
requirements:
|
41
51
|
- - ~>
|
@@ -43,10 +53,15 @@ dependencies:
|
|
43
53
|
version: 0.9.2
|
44
54
|
type: :development
|
45
55
|
prerelease: false
|
46
|
-
version_requirements:
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 0.9.2
|
47
62
|
- !ruby/object:Gem::Dependency
|
48
63
|
name: test_declarative
|
49
|
-
requirement:
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
50
65
|
none: false
|
51
66
|
requirements:
|
52
67
|
- - ! '>='
|
@@ -54,10 +69,15 @@ dependencies:
|
|
54
69
|
version: '0'
|
55
70
|
type: :development
|
56
71
|
prerelease: false
|
57
|
-
version_requirements:
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
58
78
|
- !ruby/object:Gem::Dependency
|
59
79
|
name: mocha
|
60
|
-
requirement:
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
61
81
|
none: false
|
62
82
|
requirements:
|
63
83
|
- - ! '>='
|
@@ -65,7 +85,12 @@ dependencies:
|
|
65
85
|
version: '0'
|
66
86
|
type: :development
|
67
87
|
prerelease: false
|
68
|
-
version_requirements:
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ! '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
69
94
|
description: ! '[description]'
|
70
95
|
email: svenfuchs@artweb-design.de
|
71
96
|
executables: []
|
@@ -102,8 +127,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
102
127
|
version: '0'
|
103
128
|
requirements: []
|
104
129
|
rubyforge_project: ! '[none]'
|
105
|
-
rubygems_version: 1.8.
|
130
|
+
rubygems_version: 1.8.23
|
106
131
|
signing_key:
|
107
132
|
specification_version: 3
|
108
133
|
summary: ! '[summary]'
|
109
134
|
test_files: []
|
135
|
+
has_rdoc:
|